灵活配置,强化Nginx安全管理
2018-03-03
隐真示假,修改Nginx“身份”信息
不同版本的Nginx都可能存在这样或者那样的漏洞,一旦被黑客发现并加以利用,无疑会对其安全造成一定的威胁。因此,将Nginx名称以及版本信息尽可能的隐藏起来,让黑客在扫描探测时无法显示这些敏感信息,就可以很好的将Nginx服务器保护起来。
例如,在默认情况下,黑客会执行诸如“curl -I xxx..xxx.xxx.xxx”之类的命令,对目标服务器进行探测,在返回信息中如果显示“Server:nginx/1.x.x” 内容,就说明该服务器使用的1.x.x版本的Nginx,这里的“xxx..xxx.xxx.xxx”为目标Web服务器地址,“x.x”为具体的版本号。
实际上,在Windows中如果故意访问不存在的目标页面,也会暴漏Nginx的名称和版本信息。为此,可以进入Nginx安装路径中的“conf”目 录,执 行“vi nginx.conf”命令,在其配置文件中的“http { }”段中添 加“server_tokens off”行,关闭Nginx名称以及版本号信息显示功能。
这样,当黑客对其进行探测时,在HTTP回应信息的头部就会显示Nginx版本信息了。
当然,仅仅隐藏了版本号是不够的,最好将Nginx名称也隐藏起来。处理方法是修改Nginx的源代码。也就是先对“nginx-1.x.x/src/core/nginx.h”进行修改,将“define NGINX_VERSION”行后面的版本号修改为其他值,将“define NGINX_VER”行后面的“"nginx/" NGINX_VERSION”修改为其他具有迷惑性的名称,例如“IIS 6.0”等。将“define NGINX_VAR”行后面的“"NGINX"”也修改为别的名称,例如“IIS 6.0 Update”等。
之 后 再 对“nginx-1.x.x/src/http/ngx_http_header_filter_module.c”的文件进行修改,可以将其中的“static char ngx_http_server_string[]="Server:nginx"”行中的“nginx”修改为其他的名称,例如“IIS6.0”等。
最 后 对“nginx-1.x.x/src/http/ngx_http_special_response.c” 文件进行修改,将其中的“
CRLF”行中的“"NGINX_VER "”修改为具体的网址,例如“"NGINX_VER"(http://www.xxx.com)”,将“
”行中的“NGINX”修改为其他的名称,例如“IIS6.0”等。该文件的作用是用来在访问出错时,显示相关敏感信息的。这里假设“nginx-1.x.x/src”目录存储Nginx的源代码。既然修改了源代码,必然需要对其进行重新编译。
方法是依次执行“cd nginx-1.x.x”、“./configure --user=nginx--g r o u p=n g i n x--prefix=/software/nginx-1.x.x/ --withhttp_stub_module --withhttp_ssl_module”、“make”、“make install”、“ln -s /software/nginx-1.x.x /application/nginx” 等 命令来实现,编译完成后,执行“/ software/nginx/sbin/nginx”命令,重启Nginx服务。
这样,就可以将与Nginx相关的所有敏感信息全部进行隐藏,当黑客对目标服务器进行探测时,只能得到让其迷惑的信息,这样就可以有效保护Nginx服务器的安全。
使用普通账户,安全运行Nginx
在很多情况下是使用nobody用户启动Nginx的。为了防止黑客对其进行恶意利用,最好将其设置为其他的用户。例如,执行“useradd nguser -s /sbin/nologin -M”命令,创建名为“nguser”的用户,禁止其拥有登录权限。打开Nginx配置文件,将“#user nobody”修 改 为“user nguser nguser”。也可以在编译时使用该用户,例如在上述编译语句中将“--user=nginx--group=nginx” 修 改为“--u s e r=n g u s e r--group=nguser”。
执 行“/application/nginx/sbin/nginx -s reload”命令,重现加载配置文件。执行“ps -ef|grep nginx|grep -v grep”命令,可以看到和Nginx进程对应的账户名。
注意,对于Nginx主进程来说,使用的依然是Root账户,这对系统安全带来了一定的隐患,如果黑客利用各种漏洞侵入了网站,很容易获得管理权限。因此,最好将Nginx的主进程以普通账户身份运行。
例 如 执 行“useradd nguser1”、“su -nguser1”命令,创建名为“nguser1”的账户,之后在其Home目录中创建“conf”等目录,将Nginx安装路径中的配置文件等内容复制进来。在该用户的Home下打开Nginx的配置文件,对其内容进行修改,凡是路径均以“/home/nguser1”开头,即将原始的路径信息全部指向“nguser1”的Home目录,将监听端口修改为其他值,例如“listen 8000” 等。 将“#user nobody” 修 改 为“user nguser1 nguser1”,之后执行“/application/nginx/sbin/nginx -c /home/nguser1/conf/nginx.conf &>/dev/null & ”命令,来启动Nginx。执行“lsof-i :8000 ”命令,会发现Nginx进程均以“nguser1”账户身份启动。
安全管理Nginx日志信息
当用户访问Web网站时,Nginx就会记录相关的日志信息。不过Nginx的日志并没有自动分段存储功能,导致众多的日志堆积在一起,对于日志的管理和分析不利。为此可以先创建一个名为“srvautolog”的目录,在其中创建名为“zlnginxlog.sh”的脚本文件,在该文件中输入“cd /software /nginx/logs&& /bin/mv www_access.log www_access_$(date+%F -d -1day).log”,“/application/nginx/sbin/nginx -s reload”行。 执行“crontab -e”命令,在定时任务中添加“00 00 * ** /bin/sh / srvautolog/zlnginxlog.sh >/dev/null”行。这样,就可以每天定时对Nginx的日志文件进行单独保存。
当然,日志也不是事无巨细全部记录,对于无关的文件(如图片等)信息其实是不需要记录的,这样可以避免不必要的磁盘I/O消耗,提高Nginx服务器的效能。
例如,在Nginx配置文件中写入“location ~ .*.(js|jpg|bmp|gif|css|swf)${access_log off;}”之类的内容,就可以将指定的文件排出在记录范围外。正是日志对于Nginx极为重要,所以才不允许别人对其随意访问。例如执行“chown -R root.root /nginx/logs”和“chmod -R /nginx/logs”命令,这样直邮Root账户才可以读写Nginx日志的权限,这里假设“/nginx/logs”文件日志文件目录。
严格管控实现安全访问
对于黑客来说,很常用的入侵手段就是利用网站的上传漏洞,来上传ASP、PHP等木马程序,进而获取WebShell接口,再通过各种非法提权手段获得服务器控制权。
因此,禁止访问者非法上传各种文件,可以有效保护Nginx的安全。例如在Nginx配置文件中添加“location ~ ^/dirname/.*(php|php5|sh|pl|py|asp)${deny all;}”和“location~ .*.(php|php5)?${f a s t c g i_p a s s 127.0.0.1:9000;fastcgi_index index.php;include fcgi.conf;}” 等 语 句,就可以解析网站目录中“dirname”下指定的文件类型,当然也可以针对更多的目录,分别使用上述第一行的格式来对其进行访问限制。
这样即使黑客向这些目录上传了不法文件,也无法进行访问和解析。注意,这里虽然针对特定的文件进行了限制,但是百密必有一疏,不可能将所有的文件类型都添加进来。为此可以采取限制使用HTTP请求的Get方法,禁止非法的上传操作,为此可以在配置文件中添加“if ($request_method ~*^(GET)$) {return 501}”行,来实现该功能。对于网站中指定类型的文件,有时也需要禁止访问者随意操作。例如可以在配置文件中添加“location ~* .(xls|ppt)${ if (-f $request_filename) {root /data/ziliao/wd;rewrite http://w w w.x x x.c o m/e r r o r.php;break}}”和“location~* .( xls|ppt)${root /data/ziliao/wd;deny all;}”行。
这样,当来访者试图访问指定目录下的“xls”和“ppt”格式的文件时,都会被导入到显示错误信息的页面,让其无法访问成功。
对于重要的网站目录,是禁止来访者随意访问的。为此可以在配置文件中 添 加“location ~ ^/(admin|datas) {deny all;}”行,可以禁止访问“admin”和“datas”目录,当然可以添加更多的目录。如果仅仅是限制针对单个目录的访问,则输入单个目录名称即可。
或者可以在配置文件针对特定的虚拟服务器,来单独的指定禁止访问的目录。例如在“Server”段中的特定的“server_name”标签开始的行中写入“location /adminedit/ {return 404};”行,这样当试图访问该虚拟主机下的“adminedit”目录时,就会返回HTTP 404错误信息。对于来历不明的IP,可以禁止其访问Web网站。
例如在配置文件中写入“location / {deny xxx.xxx.100.150;allow xxx.xxx.1.0/24;allow xxx.xxx.xxx.0/16;deny all;}”行,则只允许“xxx.xxx.1.0/24”和“xxx.xxx.xxx.0/16”网段进行访问,其余的IP是禁止访问的。当Nginx作为反向代理使用时,也可以对客户端的IP进行限制。例如在配置文件中添加“location/ {root html/blog;index index.php index.html index.htm;allow xxx.xxx.xxx.0/16;deny all;}”行,则只允许指定的IP地址段进行访问,其余的则禁止。如果将其改为“location/ {root html/blog;index index.php index.html index.htm;deny xxx.xxx.xxx.0/16;allow all;}”行,那么情况则恰好相反,只禁止指定的IP段访问,其余的则可以访问。当然可以根据实际需要添加更多的允许/禁用地址段。
对于一些可疑用户来说,为了防止其恶意解析域名,最好禁止其访问Web服务器。为此可以在Nginx配置文件的“Server”段中的特定的“server_name”标签开始的行中添加“if ($host !~^www/ .xxx/.com) {rewrite^(.*) http://www.yyy.com$1 permanent};”行,这样当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息header中的状态码的Host栏中包含不是“www.xxx.com”时,将其永久性转移到“www.yyy.com”地址上。也可以在“Server”段中的特定的“server_name”标签处添加“ listen 80 default_s e r v e r;s e r v e r_n a m e_;rewrite ^(.*) http://xxx.com/$1 permanent;”行,让恶意解析域名的用户得到HTTP 501错误信息。
对于Web服务器来说,常用的HTTP请求方法包括 Get、Post和 Head,对 于其他的特殊的请求方式,最好将其禁用,这样可以有效的提高服务器的安全性。例如在配置文件中添加“f ($request_method!~ ^(GET|HEAD|POST)$){return 501}”行实现。