Apache服务器安全配置

作者: zksmile | 来源:发表于2017-12-08 10:41 被阅读186次

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

    0x00 思维导图

    Apache-security-config-0.png

    0x01 错误详情页banner隐藏

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

    错误详情页

    测试方法:

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

    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-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-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-security-config-4.png

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

    注意事项

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

    0x03 列目录问题

    什么是列目录

    当Web服务器配置不当的时候,如果当前目录不存在默认文件(比如index.html),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-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-security-config-8.png
    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|gerp 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-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文件被删除清空之后就会变的非常麻烦,因此很多大型企业都设置的日志服务器同步日志文件到其它服务器,这样黑客想要彻底清除痕迹还需要搞定日志服务器。

    相关文章

      网友评论

      • 36da38cd91c4:ps aux|gerp apache|grep -v grep 中间那个gerp 拼写错误
        zksmile:谢谢
      • 红色火苗:博主,最近有新的研究吗?方便留个联系方式聊聊吗?
        zksmile:@彭向上 496419534

      本文标题:Apache服务器安全配置

      本文链接:https://www.haomeiwen.com/subject/zhteixtx.html