Nginx安全规范 作者:pandali 时间:2021年10月28日 分类:计算机技术,杂项 字数:3322 warning: 这篇文章距离上次修改已过205天,其中的内容可能已经有所变动。 1、 身份认证与授权 用户授权表示检验有效用户是否被许可访问特定的资源 cd /usr/local/Nginx/conf mkdir htpasswd /usr/local/apache2/bin/htpasswd -c /usr/local/Nginx/conf/htpasswd/snda shandagames_mir #添加用户名为shandagames_mir New password: (此处输入你的密码) Re-type new password: (再次输入你的密码) Adding password for user http://www.xxxx.com/data/index.html(目录存在/var/shandagames/web/data/目录下) 将下段配置放到虚拟主机目录,当访问http://www.xxxx.com/data/即提示要密验证: location ~ ^/(shandagames)/ { root /var/xxxx/web/data/; auth_basic "LT-COUNT-xxxx"; auth_basic_user_file /var/xxxx/web/data/; } 2、 权限&日志 (最小特权原则) 1.1 严禁使用root账户运行nginx,运行Nginx的系统用户名是nginx 1.2 必须启用web访问日志,日志不允许存放在web目录下,并且设置日志操作权限为root,要求日志存放天数60天以上按天存放。重要服务器(II级以上)除本机保存日志外,还需将日志文件发到文件服务器保存。文件服务器上日志保存时间至少180天。 1.3 凡允许“上传或写入”目录的权限,执行权限必须设置成无 3、 隐藏版本号(不适用) 3.1 进入nginx配置文件的目录(此目录根据安装时决定),用vim编辑打开 vim nginx.conf 在http {—}里加上server_tokens off; 如: http { ……省略 sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; server_tokens off; …….省略 } 1.jpg 2.2 编辑php-fpm配置文件,如fastcgi.conf或fcgi.conf(这个配置文件名也可以自定义的,根据具体文件名修改): 找到: fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 改为: fastcgi_param SERVER_SOFTWARE nginx; 2.3 重新加载nginx配置: /etc/init.d/nginx reload 这样就完全对外隐藏了nginx版本号了,就是出现404、501等页面也不会显示nginx版本。 4、 删除所有不需要的Nginx模块 需要直接通过编译Nginx源代码使模块数量最少化。通过限制只允许web服务器访问模块把风险降到最低。你可以只配置安装nginx你所需要的模块。例如,禁用SSL和autoindex模块你可以执行以下命令: ./configure --without-http_autoindex_module --without-http_ssi_module make make install 通过以下命令来查看当编译nginx服务器时哪个模块能开户或关闭: ./configure --help | less 禁用你用不到的nginx模块。 (可选项)更改nginx版本名称。 编辑文件/http/ngx_http_header_filter_module.c: vi +48 src/http/ngx_http_header_filter_module.c 找到行: static char ngx_http_server_string[] = "Server: nginx" CRLF; static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF; 按照以下行修改: static char ngx_http_server_string[] = "Server: Ninja Web Server" CRLF; static char ngx_http_server_full_string[] = "Server: Ninja Web Server" CRLF; 保存并关闭文件。现在你可以编辑服务器了。增加以下代码到nginx.conf文件来关闭nginx版本号的显示。 server_tokens off 5、 目录浏览 在nginx中开启autoindex,配置不规范而造成目录遍历漏洞 配置如下: server { listen 80; server_name 360.cn; index index.htm index.html; root /home/wwwroot/www; access_log off; location /paper { alias /home/wwwroot/xxx/; autoindex on; } } 注意 这里/home/wwwroot/xxx/; 有个“/” 当你浏览http://360.cn/xxx/,正常情况应该遍历/home/wwwroot/xxx/这个目录,但是如果访问http://sebug.net/xxx../, 这个的话就会遍历/home/wwwroot/这个目录了。 安全建议: 使用如下配置 location /paper { alias /home/wwwroot/xxx; 或 location /paper/ { alias /home/wwwroot/xxx/; 6、 Nginx(php-fpm)错误文件类型解析漏洞解决方案 可2选1,以下2种方法请务必要先经过测试,以确保修改配置不会对应用带来影响。 1、设置php.ini的cgi.fix_pathinfo为0,重启php。 2、给nginx的vhost配置添加如下内容,重启nginx。 if ( $fastcgi_script_name ~ \..*\/.*php ) { return 403; } 7、IP限制 首先建立下面的配置文件放在nginx的conf目录下面,命名为ip.blacklist cat ip.blacklist deny 192.168.1.11; deny 192.168.1.123; deny 10.0.1.0/24; 在nginx的配置文件nginx.conf中加入:include ip.balcklist; 重启一下nginx的服务:/usr/local/nginx/sbin/nginx reload 就可以生效了。 ip.balcklist 的格式中也可以用deny all; 如果你想实现这样的应用,除了几个IP外,其他全部拒绝, 那需要你在ip.balcklist中这样写 allow 1.1.1.1; allow 1.1.1.2; deny all;