Skip to content

18构建防线:服务器安全加固

关于"模块二 漏洞攻防案例"的内容我们已经讲完了,从本节课开始,将进入"模块三 Web 安全建设"内容,我将给你介绍企业内部的一些 Web 安全建设工作,如何更加全面地防御 Web 漏洞的攻击。

本节课主要向你介绍一些服务器安全加固的策略,以主流的 Apache 和 Nginx 服务器为例,有时即使存在漏洞,有安全加固策略存在,可以提高对方的攻击成本,防止被进一步攻击。PHP 本身也提供有一些安全配置功能可用于安全加固,本节课会一并介绍。

Apache 服务器加固

Apache 是世界使用排名第一的 Web 服务器软件,由于其跨平台和安全性而被广泛使用,我们前面课程介绍过的靶场很多就使用到 Apache。

下面梳理下 Apache 上的安全配置建议,以帮助对服务器进行安全加固。

1.删除默认页面

Apache 安装后会有如下图所示的默认页面,安装后仅用于测试,用于生产环境中时需要删除,这里需要删除 icons 和 manual 两个目录文件,以避免不必要的信息泄露。

图 1 Apache 默认页面

2.关闭目录浏览功能

Apache 默认允许目录浏览,如果目录下找不到可浏览器的页面,就会出现目录浏览问题,造成信息泄露。

图 2 在线浏览目录

Ubuntu 是通过修改 Apache 配置文件 /etc/apache2/apache2.conf,其他平台大多是叫 httpd.conf 的配置文件名,修改"Indexes"为"-Indexes":

图 3 关闭目录浏览

3.开启访问日志

在浏览器被攻击时,通过日志可以帮助回溯整个安全事件的过程,有助于定位漏洞成因和攻击者。默认情况下,Apache 已开启访问日志记录,你需要确认下配置文件是否开启 CustomLog 的日志路径设置:

java
/etc/apache2/sites-available/default-ssl.conf
/etc/apache2/sites-available/000-default.conf

图 4 开启访问日志

图 5 访问日志文件

上面是 Ubuntu 平台的情况,如果是存在 httpd.conf 配置文件的其他平台,则直接在 httpd.conf 查看是否有 CustomLog 配置。

4.禁止特定目录解析 PHP

对于不需要执行 PHP 脚本的目录,可禁止 PHP 解析,这种配置可有效防止上传漏洞的攻击,特别是上传目录的 PHP 解析限制。

通过 Apache 配置文件中对目录权限做如下修改,以禁止特定目录解析 PHP:

java
<Directory "/www/html/uploads">
  php_flag engine off
</Directory>

5.不以 Root 启动 Apache

默认情况下,Apache 已禁止 Root 启动,你可以在 Apache 配置文件中再确认下 User 与 Group 的配置值。

下面是 apache2.conf 为配置文件时的情况,它通过 /etc/apache2/envars 指定变量名来设置 User 和 Group:

java
# /etc/apache2/apache2.conf
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
# /etc/apache2/envars
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

如果是 httpd.conf,一般就直接用 User 与 Group 来指定用户名和用户组:

java
User apache
Group apache

6.禁止访问外部文件

当网站存在目录遍历漏洞时,攻击者可能通过 ../ 来访问系统上的任意目录,通过禁止 Apache 访问网站目录以外的目录和文件,可以有效地降低这种攻击带来的危害。

修改 Apache 配置文件,先禁止所有目录的访问,然后再开启可访问的目录。

java
# 先禁止任何目录访问
	Order Deny,Allow
	Deny from all
					
# 设置可访问的目录
	Order Allow,Deny
	Allow from {网站根目录}

7.错误页面重定向

Apache 错误页面重定向功能可以防止敏感信息泄露,比如网站路径等信息。

修改 Apache 配置文件,指定不同响应号的返回页面文件:

java
    ErrorDocument 400 /custom400.html
	ErrorDocument 401 /custom401.html
	ErrorDocument 403 /custom403.html
	ErrorDocument 404 /custom404.html
	ErrorDocument 405 /custom405.html
	ErrorDocument 500 /custom500.html

Nginx 服务器加固

Nginx 是一款著名且免费的网页服务器软件,在世界范围内应用非常广泛。Nginx 配置文件通常位于 /usr/local/etc/nginx/nginx.conf,如果没找到,你可以通过命令 locate nginx.conf 来搜索。

java
$ locate nginx.conf
/usr/local/etc/nginx/nginx.conf
/usr/local/etc/nginx/nginx.conf.default
...

各种安全加固方式都可通过 nginx.conf 来完成。

1.关闭目录浏览

Nginx 默认不允许目录浏览,你可以再确认下配置文件中的 autoindex 是否配置为 off,以防止敏感信息泄露。

java
autoindex off

2.开启访问日志

开启日志有助追踪攻击途径,以及定位攻击者。默认情况下,Nginx 会开启访问日志,你可在配置文件中确认下是否已开启:

java
access_log /backup/nginx_logs/access.log combined;

3.限制特定目录解析 PHP

在 Apache 已介绍过,对于不需要执行 PHP 脚本的目录,可禁止 PHP 解析,这种配置可有效防止上传漏洞的攻击,特别是上传目录的 PHP 解析限制,通过 nginx.conf 配置文件使用 deny all 来限制特定目录被 PHP 解析:

java
location ~* ^/data/cgisvr/log/.*\.(php|php5)$
{
    deny all;
}

4.删除默认页面

Nginx 也存在默认页面,上线后应该删除,防止不必要的信息泄露,可通过删除如下配置信息来解决。

java
location /doc {
root /usr/share;
autoindex on;
allow 127.0.0.1;
deny all;
}
 
location /images {
root /usr/share;
autoindex off;
}

图 6 Nginx 默认页面

PHP 安全配置

PHP 是比较常用的网站开发语言,其对安全也很重视,提供了不少安全函数和配置功能。下面介绍一些常用的 PHP 安全配置方法,都是通过 php.ini 来配置,比如 PHP 7.4 的配置文件路径位于 /etc/php/7.4/apache2/php.ini。

1.限制脚本访问权限

PHP 默认配置允许 php 脚本程序访问服务器上的任意文件,为避免 php 脚本访问不该访问的文件,从一定程度上限制了 php 木马的危害,一般设置为只能访问网站的目录:

java
open_basedir = /usr/local/apache2/htdocs(网站根目录)

2.禁止危险函数

利用 php 的特殊函数可以执行系统命令,查询任意目录,增加修改删除文件等。php 木马程序常见使用的函数为 exec、popen、system、passthru、shell_exec 等,如下设置可禁止使用这些危险函数:

java
disable_functions = exec,popen,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open

3.关闭错误消息显示

一般 PHP 错误信息可能会包含网站路径或 SQL 查询语句等敏感信息,这些信息为攻击者提供有价值的信息,因此应该禁止错误显示,配置方式如下:

java
display_errors = Off

4.禁止访问远程文件

允许访问 URL 远程资源使得 PHP 应用程序的漏洞利用变得更加容易,php 脚本若存在远程文件包含漏洞可以让攻击者直接获取网站权限及上传 web 木马,因此建议关闭远程文件访问功能,若需要访问可采用其他方式,比如 libcurl 库,配置如下:

java
allow_url_fopen = Off
allow_url_include = Off

PHP 在这几年提升了不少安全功能,很多功能都默认开启,甚至直接去掉一些原有一些可配置的安全功能,比如 magic_quotes_gpc。

小结

本节课主要分享了 Apache、Nginx 和 PHP 的一些安全配置方案,帮助抵御漏洞的攻击,提高漏洞利用难度,即使被入侵后,仍有可回溯追踪的办法,这在后续的入侵排查过程中非常重要,这点在下一节课中介绍,我们下一节课中见。


课程评价入口,挑选 5 名小伙伴赠送小礼品~