Apache安全配置

0x00 测试环境


centos6.5+apache2.2.15+php5.3.3

0x01 php的运行模式介绍


php的运行模式分四种:

1. CGI通用网关接口 
2. fast-cgi常驻型的CGI 
3. cli命令行运行 
4. web模块模式 

一般情况下,apache使用web模块模式运行php

0x02 Apache运行原理介绍


Apache是基于模块化设计的,各个模块在系统启动的时候按需载入。Apache对于php的解析,就是通过众多Module中的php Module来完成的。

2014080322524877722.png

所以,php加载成为了apache的一个模块,可以把apache和php当成一个整体看待。

当浏览器请求一个php文件时,我们可以理解为apache直接处理返回给浏览器结果,服务器上也只会有httpd进程,而不会有php进程。

apache的一些配置主要是通过httpd.conf来实现的,但是可以在httpd.conf中开启对.htaccess的支持,然后在.htaccess中进行配置。不过一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限。.htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置。

0x03 Apache安全配置方案


1. 选择漏洞较少的apache版本,并打上安全补丁

查看apache版本号:httpd -v

然后在sebug上搜索该版本号有什么漏洞,可根据提示提升版本或者打上补丁

2. 关闭一些不使用的模块及功能

可在LoadModule前加#,来注释掉一些不使用的模块

3. 隐藏banner信息

ServerTokens OS  修改为:ServerTokens Prod (在出现错误页的时候不显示服务器操作系统的名称)

ServerSignature On 修改为:ServerSignature Off(不回显apache版本信息)

4. 删除默认网站及页面

删除默认的页面,防止泄露服务器信息

5. 可修改banner信息

6. 配置httpd.conf禁止目录浏览

将Options Indexes FollowSymLinks改为Options -Indexes FollowSymLinks

7. 配置httpd.conf设置默认文档

DirectoryIndex index.html

8. 合理配置apache的运行账户

为apache单独建立一个运行账户及账户组,并在httpd.conf配置

User apache
Group apache

9. 合理控制apache运行账户对磁盘的写入,执行权限

取消apache运行账户对网站目录的写入权限,上传目录除外,其他非网站目录尽量不给权限

10. 合理控制apache运行账户对sh等的执行权限

取消掉了运行账户对sh等的执行权限后能够防止webshell通过默认的sh执行命令

11. 配置httpd.conf取消对上传目录的php执行权限

<Directory "/var/www/html/aaa">     
    <FilesMatch ".(php|php5)$">     
        Deny from all     
    </FilesMatch> 
</Directory> 

12. 配置httpd.conf限制禁止访问的文件夹,例如后台目录

<Directory "/var/www/html/aaa">     
        Deny from all     
</Directory> 

13. 配置httpd.conf限制一些特殊目录的特定ip访问,如内部接口等。

<Directory "/var/www/html/aaa">     
    Order Deny,Allow
    Deny from all
    Allow from 192.168.1.111    
</Directory> 

14. 配置httpd.conf限制一些文件类型的访问,如txt的日志

<Files ~ ".txt$"> 
    Order allow,deny 
    Deny from all 
</Files> 

15.配置httpd.conf修改修改监听端口来防止一些内部系统被扫描

这样可以防止一些直接扫描80端口的黑客

Listen 12345 

16. 关闭对.htaccess的支持

AllowOverride All 

改为

AllowOverride None 

17. 配置httpd.conf记录访问日志

0x04 .htaccess常见配置方法参考


首先,不建议使用.htaccess,其次,使用.htaccess需要在httpd.conf中开启,最后,开始.htaccess支持后需要在httpd.conf中配置防止.htaccess文件被下载,下面介绍几个基本配置方法不全,更多的可以参考其他网站专门针对.htaccess 的配置方法。

1. 定制目录的默认文档

DirectoryIndex index.html index.php index.htm 

2. 定制错误页面

ErrorDocument 404 errors/404.html 

3. 控制访问文件和目录的级别

order deny,allow  
deny from all  
allow from 192.168.0.0/24 

4. 防止列目录

Options -Indexes 

0x05 总结


其实一个web服务器的保护是分几个层次的(暂不考虑程序的漏洞):

1. 隐藏自己

要保护一个web服务器首先得学会隐藏自己,对于一些内部系统,如后台,内部接口等,我们可以通过改端口,限制ip等方式来不让黑客发现。

2. 隐藏身份

对于多数web系统来说,都是提供给外面的访问的,所以想隐藏自己其实是很难的。但是我们还是要学会隐藏身份,可以通过改banner,该返回信息来隐藏身份来加大黑客攻击的难度。

3. 选用安全的版本及修补一些已知的漏洞

其实前面两步都是很容易突破,然后获知一个web系统所使用的web服务器版本的,此时我们能做的就是选择一个少漏洞的版本,及打上安全补丁。

4. 做好安全配置

做好基础的安全配置,禁止目录浏览,设定默认文档,上传目录限制php执行等等,来阻挡黑客的入侵。

5. 合理配置web服务进程账户的权限

当黑客已经通过程序漏洞上传了一个webshell并且已经成功执行了,此时,就只能很好的配置服务进程的账户权限,包括磁盘的读取写入,特殊程序如sh的执行,等等,这样可以讲危害降到最低。

6. 记录日志

最后,当黑客已经光顾之后,我们也只能通过日志来分析,看问题出在哪里了。

©乌云知识库版权所有 未经许可 禁止转载


30
无人值守 2015-12-23 20:47:18

朕已阅

30
叮咚叮咚 2014-11-18 21:44:56

取消apache运行账户对网站目录的写入权限,上传目录除外,其他非网站目录尽量不给权限

我是root用户ssh登录的,这条命令应该怎么写?谢谢

30
wangy3e 2014-08-24 22:22:33

路过,支持一个

30
ceason 2014-08-15 09:38:11

不错不错

30
zhangsan 2014-08-11 09:10:18

冒失我记得服务的名称不是这个,不过你启动不了,是因为你那个账户对程序所在目录的权限不够。。。多试几次就知道了。

30
Jumbo 2014-08-10 23:15:06

我刚刚在服务里找到了“apache_pn”这个服务,然后我在“登录”里使用了我刚创建的用户,然后提示我要重新启动才能失效,可是一直启动不了

30
vf3ng 2014-08-10 14:25:39

good job! 评论也很赞~

30
黑吃黑 2014-08-10 11:53:35

谢谢分享

30
Jumbo 2014-08-10 07:27:35

那这个呢“8. 合理配置apache的运行账户
为apache单独建立一个运行账户及账户组,并在httpd.conf配置
User apache
Group apache”
是同样的效果,还是两个都搞?

30
zhangsan 2014-08-09 15:59:58

将服务的启动账户设置为一个普通账户,在windows服务里面找

30
Jumbo 2014-08-09 13:15:20

如果是03+apache,怎样防止被getshell后就是system权限

30
小森森 2014-08-06 14:31:08

额……那可不能有这样的开发,另外应该有code review的啊

30
zhangsan 2014-08-06 09:04:33

貌似你没明白一个问题,正常的上传都不会允许上传php,但是很多开发的水平有限,而很多黑客的水平无限,,,导致传了php文件上去。。

30
小森森 2014-08-05 21:28:05

嗯嗯……那么我觉得要么不允许上传php,要么只是禁止执行但允许上传= =。
应用太多的话,有时候真的会遗漏某些东西,不过checklist确实是应该有的……

30
zhangsan 2014-08-05 18:02:23

这个就是笔误了。。不用太纠结。。

30
zhangsan 2014-08-05 18:02:01

这个我不同意你的说法,,做迁移不做测试的吗?公司应该有一份checklist来测试或者说检查服务器配置。。上线前最好是能做这个工作。。

30
zhangsan 2014-08-05 17:59:48

这个看公司情况吧,我想说的是要及时关注我们用的软件有没有什么高危漏洞出来,,至于高危漏洞出来了你是打补丁,还是安新版本,根据个人情况来。

30
Senorsen 2014-08-05 17:26:14

另外默认配置的文件名(CentOS下)应该是httpd.conf而不是http.conf吧……

30
Senorsen 2014-08-05 17:24:43

这个

11. 配置http.conf取消对上传目录的php执行权限

Deny from all

这样的话不就403 Forbidden了吗?如果想让用户能上传php、并且能下载php(但不执行),可以用php_admin_value engine off
不过其实这些方法可能都很危险,万一应用在迁移部署时候忘了这个目录,没有对新部署的地方配置,就玩完了。

30
Senorsen 2014-08-05 17:21:51

对这一句比较疑惑:
1. 选择漏洞较少的apache版本,并打上安全补丁
查看apache版本号:httpd -v
然后在sebug上搜索该版本号有什么漏洞,可根据提示提升版本或者打上补丁

如果是使用CentOS这样的知名发行版的话,版本号即使跟apache官方的一致,patch和补丁情况也不一定一样吧。或者说,CentOS团队会为httpd的代码打补丁后在源中更新打包。而且不使用发行版提供的软件源、包管理器,自行编译、更新apache不一定是个好做法(或许是个很坏的做法)。
个人意见,望多多指教。

30
Senorsen 2014-08-05 17:18:02

一般来说是的,最近Linux容器在中小网站上用的很多

30
scanf 2014-08-05 17:11:06

哦,看到了

30
scanf 2014-08-05 17:10:36

降权呢?

30
zhangsan 2014-08-04 17:03:05

这个怎么说了。一般生产环境会这样吗?

30
zhangsan 2014-08-04 17:00:51

是写反了,@瞌睡龙 帮忙修改下,,应该是
AllowOverride All 改为
AllowOverride None

30
loopx9 2014-08-04 16:54:05

16. 关闭对.htaccess的支持 说反了

30
我是要成为剑心的男人 2014-08-04 16:50:50

补充一点,使用chroot环境或者容器来运行应用比较好

30
疯子 2014-08-04 15:40:31

不错 赞!

30
ccSec 2014-08-04 14:01:48

很详细,不错!

感谢知乎授权页面模版