1. 目标
本文档旨在Nginx安装及Nginx的配置,包括安装https协议,及安全配置。
2. 范围
Nginx是一款轻量级的Web服务器/反向代理服务器,适用全平台,用到Nginx代理转发及启动前端项目适用。
3. 安装
查看当前是否已安装或已安装的当前版本
# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments:
1.下载安装包到 src 目录
# cd /usr/local/src
# 如果wget不存在 yum -y install wget
# wget http://nginx.org/download/nginx-1.20.1.tar.gz
# tar -zxvf nginx-1.20.1.tar.gz
2.配置 --with-http_ssl_module
# cd nginx-1.20.1
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
3.使用make install会重新安装nginx
# make install
4.再次查看版本及配置模块 则已安装成功
# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module
查看nginx 当前启动状态
# systemctl status nginx
● nginx.service - nginx
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2022-05-05 01:00:01 CST; 8h ago
Process: 15272 ExecStop=/usr/local/nginx/sbin/nginx quit (code=exited, status=1/FAILURE)
Process: 15277 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
Main PID: 15278 (nginx)
Tasks: 2
Memory: 1.0M
CGroup: /system.slice/nginx.service
├─15278 nginx: master process /usr/local/nginx/sbin/nginx
└─15279 nginx: worker process
May 05 01:00:01 hzhw167a.v01.net systemd[1]: Starting nginx...
May 05 01:00:01 hzhw167a.v01.net systemd[1]: Started nginx.
4. 配置HTTPS模块
公司默认在A10机器可配置https证书,如要在Nginx自行配置,参考如下:
如果需要安装https协议,需要在安装Nginx时配置ssl模块(参考上面安装方法)
--with-http_ssl_module
nginx SSL证书部署
将ssl.key ssl.pem 拷贝到下面文件夹
# cd /usr/local/nginx
# mkdir ssl_certificate
修改Nginx配置文件
# vim /usr/local/nginx/conf/nginx.conf
配置如下
server {
listen 80;
server_name localhost;
if ( $host != '对应域名' ) {
return 403;
}
#静态资源路径
root /opt/demo;
ssl_certificate /usr/local/nginx/ssl_certificate/ssl.pem;
ssl_certificate_key /usr/local/nginx/ssl_certificate/ssl.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!DES:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
ssl on;
......
}
4.重启nginx 便可用https访问了
# systemctl restart nginx
5. 日志管理
Nginx提供了一个非常灵活的日志记录功能,它可以使每个块的配置拥有各自独立的日志进行记录,并且根据记录内容的不同又分为访问日志和错误日志。
由于nginx访问日志是放在一个access.log文件
需要分段储存,并定时删除,否则会出现日志文件庞大,磁盘爆满的情况
以下为nginxlog.sh脚本文件
#!/bin/bash
logspath=/usr/local/nginx/logs/ #定义日志路径
logdate=`date -d "1 day ago" +%Y%m%d` #定义前一天的日期
rmlogdate=`date -d "30 day ago" +%Y%m%d` #定义30天前的日期
cd $logspath
mv access.log access-${logdate}.log
systemctl restart nginx
rm -rf access-$rmlogdate.log
添加到定时任务
#crontab –e
0 0 * * * /usr/local/nginx/logs/nginxlog.sh #每天0点0分钟执行
查看定时任务命令
#crontab -l
6. 日志过滤
由于公司的机器会通过心跳来进行服务检测, 每秒会有多个access, 导致日志文件经常将磁盘过度占用,触发告警. 所以配置规则, 对access_log进行过滤。
以下为日志的打印
10.219.*.* - - [06/May/2022:12:01:27 +0800] "GET / HTTP/1.1" 200 1733 "-" "*/1.0"
10.219.*.* - - [06/May/2022:12:01:32 +0800] "GET / HTTP/1.1" 200 1733 "-" "*/1.0"
10.219.*.* - - [06/May/2022:12:01:37 +0800] "GET / HTTP/1.1" 200 1733 "-" "*/1.0"
解决方案: IP过滤
http {
include mime.types;
default_type application/octet-stream;
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#IP过滤
map $remote_addr $iploggable{
default 1;
~^10.10.10.10;
}
# 日志打印
access_log /usr/local/nginx/logs/access.log main if=$iploggable;
}
7. 安全配置
随着越来越多的网络访问通过WEB界面进行操作,WEB安全已经成为互联网安全的一个热点,基于WEB的攻击广为流行,SQL注入、跨站脚本等WEB应用层漏洞的存在使得网站沦陷、页面篡改、网页挂马等攻击行为困扰着网站管理者并威胁着网站以及直接用户的安全。
需要做以下防范:
7.1 检测到目标URL存在http host头攻击漏洞
解决办法: web应用程序应该使用SERVER_NAME而不是host header。 在Apache和Nginx里可以通过设置一个虚拟机来记录所有的非法host header。在Nginx里还可以通过指定一个SERVER_NAME名单,Apache也可以通过指定一个SERVER_NAME名单并开启UseCanonicalName选项。
# HTTP host头攻击的技术NGINX防护
server {
if ($http_Host != '***.com'){
return 403;
}
....
}
#注意:只能用指定的域名或ip访问
7.2 防止SSL的安全配置及CVE-2016-2183漏洞处理
它是通过篡改加密算法密码块的加密模式,部分加密流量可以被偷偷地解密
需要在nginx server配置过滤加密算法 ssl_ciphers
# HTTP host头攻击的技术NGINX防护
server {
listen 8050;
server_name guat.desaysv.com;
ssl_certificate /usr/local/nginx/conf/conf.d/ssl_certificate/sqcm.pem;
ssl_certificate_key /usr/local/nginx/conf/conf.d/ssl_certificate/sqcm.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!DES:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
ssl on;
root /opt/****;
…
}
8. 关于Nginx的 - 上游SSL - 同行中SSL握手关闭连接问题
418 peer closed connection in SSL handshake (104: Connection reset by peer) while SSL handshaking to upstream, client: 10.*.11.*, server: localhost, request: "GET / HTTP/1.1", upstream: "https://10.*.11.*:443
需要修改配置文件
upstream adfs_backend {
server 10.*.*.*:443;
keepalive 100;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass https://adfs_backend/;
proxy_ssl_server_name on;
proxy_ssl_name adfs.xxx.com;
proxy_set_header Host adfs.xxx.com;
}
}
9. 注意事项
-
默认安装包及其他下载文件放到 /usr/local/src
-
默认安装路径为 /usr/local