Apache服务器安全配置

该文也是参考了网上好几篇文章自己亲自动手又做了一遍,亲自实现的时候也是遇到各种各样的坑,总结了以下这些内容,收获很多。
提醒:在修改完配置文件之后一定要重启服务!!!!

0x00 思维导图

《Apache服务器安全配置》 Apache-security-config-0.png

0x01 错误详情页banner隐藏

黑客在渗透的过程中,收集服务器的信息是至关重要的,这对于他在后期漏洞的利用上有很大的帮助。

错误详情页

测试方法:

在访问站点时,随便访问一个不存在的页面,如果站点没做404重定向的话,就会泄露一些敏感信息。详情如下图:

《Apache服务器安全配置》 Apache-security-config-1.png

查看响应头信息:

$curl -I  http://114.115.214.203/zk/shell.php
HTTP/1.1 200 OK
Date: Tue, 05 Dec 2017 07:47:46 GMT
Server: Apache/2.4.7 (Ubuntu)         #中间件版本及操作系统
X-Powered-By: PHP/5.5.9-1ubuntu4.22   # 显示服务端脚本语言及版本号
Content-Type: text/html; charset=UTF-8

修复方法:

1)修改配置文件:/etc/apache2/apache2.conf或者/etc/httpd/conf/httpd.conf隐藏中间件信息。修改或者添加以下配置:
ServerTokens Prod
ServerSignature Off
2)修改配置文件:/etc/php5/apache2/php.ini第367行隐藏PHP信息,将expose_php = On修改为Off
 376 expose_php =  Off
3)保存退出之后,重启apache服务。
root@ubuntu:~# service apache2 restart
 * Restarting web server apache2                                         [ OK ]
4)再次访问不存在的页面,已经没有banner信息了。

《Apache服务器安全配置》 Apache-security-config-2.jpg

$curl -I  http://114.115.214.203/zk/shell.php
HTTP/1.1 200 OK
Date: Tue, 05 Dec 2017 07:51:41 GMT
Server: Apache
Content-Type: text/html; charset=UTF-8

0x02 重定向404页面

什么是404页面

当用户请求一个网站不存在的资源的时候服务器会返回一个404的错误页面。如下图所示:

《Apache服务器安全配置》 Apache-security-config-3.png

为什么要自定义404页面

1)通过上图可以看出,默认的404页面是非常不友好的。当一个用户访问到一些不存在的页面或者错误的链接时,如果我们没有制作一个页面去引导用户访问该站点的其它页面时,会损失大量的用户。
2)自定义404页面会告诉百度、谷歌、bing等搜索引擎的爬虫,这条记录本站已经删除,请搜索放弃收录,利于seo优化。

加固步骤

1) 在网站根目录新建一个.htaccess文件

ErrorDocument 404 /404.html

2) 在同目录下新建404.html,文件名与上一步指定的文件名相同。
<!DOCTYPE html>
<html>
<head>
    <title>404页面</title>
</head>
<body>
Hello,This is 404 page!!
</body>
</html>
3) 此时我们自定义的页面已经生效,如下图所示:

《Apache服务器安全配置》 Apache-security-config-4.png

真实的404页面是需要设计的,没有这样简陋。符合网站自身的设计风格,最好能加入网站导航和底部。

注意事项

1、不要将404错误直接转向到网站首页,这将导致首页不被收录;
2、/404.html 前面不要带主域名,否则返回的状态码是302或200状态码;
3、自定义的404页面必须是大于512B,如果小于这个大小,浏览器就不会执行;

0x03 列目录问题

什么是列目录

当Web服务器配置不当的时候,如果当前目录不存在默认文件(比如index.html),Apache会列出当前目录下所有文件,造成敏感信息泄露。如下图所示:

《Apache服务器安全配置》 Apache-security-config-5.png

修复方法

修改配置文件/etc/apache2/apache2.conf或者/etc/httpd/conf/httpd.conf
164 <Directory /var/www/>   #这边必须是网站根路径
165     Options Indexes FollowSymLinks
166     AllowOverride All
167     Require all granted
168 </Directory>

Options Indexes FollowSymLinks
这里的indexes 是指在目录中要存在index文件,如果不存在把文件列出来,如果存在index文件可以直接显示index文件,因此每个目录都必须存在index文件,如果不存在有可能此目录把文件全部列出来。

删除Indexes这个参数,然后重启apache服务。service apache2 restart
164 <Directory /var/www/>   #这边必须是网站根路径
165     Options FollowSymLinks
166     AllowOverride All
167     Require all granted
168 </Directory>
再次访问就出现403 Forbidden页面

《Apache服务器安全配置》 Apache-security-config-6.png

0x04 文件权限问题

控制文件权限的意义

现在大部分站点都存在文件上传,比如说头像上传,附件上传等等。如果在代码层对上传的文件限制的不够严格,很容易被上传Webshell。一旦被上传Webshell对服务器造成十分大的威胁。如下图所示:

[图片上传中…(Apache-security-config-7.png-bc7db5-1512700791341-0)]

加固方法

如果我们对存放上传文件的目录限制脚本执行的权限的话,上传的脚本文件就无法执行,在一定程度上能够减轻黑客攻击造成的危害,并且还不影响正常的业务,上穿的图片不需要执行权限,也能正常打开。

修改配置文件/etc/apache2/apache2.conf或者/etc/httpd/conf/httpd.conf

170 <Directory /var/www/html/zk/> #这里文件夹设置想要限制的 
171     php_flag engine off
172 </Directory>

此时上传的小马已经无法执行

《Apache服务器安全配置》 Apache-security-config-8.png

《Apache服务器安全配置》 Apache-security-config-9.png

0x05 服务器运行权限问题

查看Apache的进程:lsof -i:80

root@ubuntu:~# lsof -i:80
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2 11302     root    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)
apache2 11304 www-data    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)
apache2 11305 www-data    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)
apache2 11306 www-data    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)
apache2 11307 www-data    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)
apache2 11308 www-data    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)
apache2 13248 www-data    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)
apache2 14885 www-data    4u  IPv6 28205389      0t0  TCP *:http (LISTEN)

或者ps aux|grep apache|grep -v grep

root@ubuntu:~# ps -aux | grep apache |grep -v grep
root      11302  0.0  0.2  71104  2340 ?        Ss   Dec04   0:03 /usr/sbin/apache2 -k start
www-data  11304  0.0  0.2  71176  2252 ?        S    Dec04   0:00 /usr/sbin/apache2 -k start
www-data  11305  0.0  0.2  71176  2256 ?        S    Dec04   0:00 /usr/sbin/apache2 -k start
www-data  11306  0.0  0.2  71200  2284 ?        S    Dec04   0:00 /usr/sbin/apache2 -k start
www-data  11307  0.0  0.2  71184  2252 ?        S    Dec04   0:00 /usr/sbin/apache2 -k start
www-data  11308  0.0  0.2  71176  2276 ?        S    Dec04   0:00 /usr/sbin/apache2 -k start
www-data  13248  0.0  0.2  71176  2352 ?        S    Dec04   0:00 /usr/sbin/apache2 -k start
www-data  14885  0.0  0.2  71176  2368 ?        S    Dec04   0:00 /usr/sbin/apache2 -k start

第一行是Apache的主进程,是以root运行的。因为Apache的Web开放的端口是80或者443,小于1024的端口需要有root权限,因此主进程必须是root.从第二行开始为Apache的子进程。用户为www-data,是Ubuntu中运行服务的默认用户,权限较低。

如果用户为www-data用户的话,此时就算黑客拿到一个webshell,权限也是比较底的。如下图所示:

《Apache服务器安全配置》 Apache-security-config-10.png

如果管理配置不当(默认安装为www-data),这里是高权限用户的话,需要更高为低权限用户。
配置文件路径为:/var/apache2/envvars文件中16、17行进行配置:

 15 # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
 16 export APACHE_RUN_USER=www-data
 17 export APACHE_RUN_GROUP=www-data

0x06 Apache日志文件格式

Apache会生成两个主要的日志文件,一个是Web访问日志access.log,一个是记录服务器运行时出错的日志error.log

配置文件/etc/apache2/apache2.conf或者/etc/httpd/conf/httpd.conf中定义了日志格式

212 LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
213 LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
214 LogFormat "%h %l %u %t \"%r\" %>s %O" common
215 LogFormat "%{Referer}i -> %U" referer
216 LogFormat "%{User-agent}i" agent
217
218
219 CustomLog ${APACHE_LOG_DIR}/access.log common

212行是虚拟主机的日志格式
213行是组合日志格式
213行是通用的日志格式
219行自定义设置日志使用那个格式的日志

/var/log/apache2/access.log日志格式如下:

111.196.209.199 - - [05/Dec/2017:22:40:02 +0800] "GET /zk/shell.php HTTP/1.1" 304 164 "http://114.115.214.203/zk/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"

远端主机:111.196.209.199
远端登录名:-
远程用户名:-
访问时间:[05/Dec/2017:22:40:02 +0800]
HTTP请求:GET /zk/shell.php HTTP/1.1
HTTP状态码:304
发送的字节数:164
Referer:http://114.115.214.203/zk/
User-Agent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"

/var/log/apache2/error.log日志格式如下:

[Tue Dec 05 22:39:10.798632 2017] [core:notice] [pid 2970] AH00094: Command line: '/usr/sbin/apache2'

[日期和时间]   [错误等级]   错误消息
在服务器受到入侵之后,我们可以观察访问日志来溯源。当然如果access.log文件被删除清空之后就会变的非常麻烦,因此很多大型企业都设置的日志服务器同步日志文件到其它服务器,这样黑客想要彻底清除痕迹还需要搞定日志服务器。
    原文作者:zksmile
    原文地址: https://www.jianshu.com/p/a8bab3f50c7b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞