操作目的 | 删除默认安装时的无用文件 |
---|---|
检查方法 | 检查Apache目录下是否存在无用文件 |
加固方法 | 删除默认安装的HTML文件# cd /usr/local/apache2/htdocs/,有选择性的删除删除不使用的默认安装的CGI脚本# rm –rf /usr/local/apache2/cgi-bin/*删除默认安装的Apache手册文件# rm –rf /usr/local/apache2/manual |
操作目的 | 设置Apache子进程用户 |
---|---|
检查方法 | 查看Apache配置文件httpd.confUser ApacheGroup Apache上面两行,代表Apache子进程的运行用户为Apache |
加固方法 | Unix系统:如果没有设置用户和组,则新建用户,并在Apache配置文件中指定(1) 创建Apache组:groupadd Apache(2) 创建Apache用户并加入Apache组:useradd Apache –g Apache(3) 将下面两行加入Apache配置文件httpd.conf中User ApacheGroup ApacheWindows系统:(1) 新建一个Apache用户(2) 设置Apache用户对Apache目录的相关权限(3) 在服务管理器 (service.msc) 中找到Apache服务,右键选择属性,设置登录身份为Apache用户 |
操作目的 | 隐藏Apache版本信息 |
---|---|
检查方法 | 客户端:telnet IP 80输入HEAD / HTTP/1.1,两次回车服务器返回:HTTP/1.1 400 Bad RequestDate: Wed, 13 May 2009 07:07:20 GMTServer: Apache/2.2.3Connection: closeContent-Type: text/html; charset=iso-8859-1 |
加固方法 | 修改Apache配置文件httpd.confServerSignature Off #关闭服务器生成页面的页脚中版本信息ServerTokens Prod #关闭服务器应答头中的版本信息 |
操作目的 | 防止直接访问目录时由于找不到默认主页列出目录下文件 |
---|---|
检查方法 | 查看Apache配置文件httpd.conf<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all</Directory> |
加固方法 | 修改Apache配置文件httpd.conf,在“Indexes”前面添加减号,禁止找不到默认主页列出目录下文件<Directory "/var/www/html"> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all</Directory> |
操作目的 | 禁止Apache访问Web目录之外的任何文件。 |
---|---|
检查方法 | 1、判定条件无法访问Web目录之外的文件。 2、检测操作访问服务器上不属于Web目录的一个文件,结果应无法显示。 |
加固方法 | 1、参考配置操作编辑httpd.conf配置文件,“vi /etc/httpd/conf/httpd.conf” <Directory /> Order Deny,Allow Deny from all </Directory> 2、补充操作说明设置可访问目录,<Directory /web> Order Allow,Deny Allow from all </Directory>其中/web为网站根目录。 |
操作目的 | 服务器有多个IP地址时,只监听提供服务的IP地址和端口 |
---|---|
检查方法 | 查看Apache配置文件httpd.conf |
加固方法 | 修改Apache配置文件httpd.conf,设置只监听1.1.1.1地址的80端口Listen 1.1.1.1:80 |
操作目的 | 如果服务器上不需要运行CGI程序,建议禁用CGI |
---|---|
检查方法 | 查看Apache配置文件httpd.confLoadModule cgi_module modules/mod_cgi.so #加载模块ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"<Directory "/var/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all</Directory> |
加固方法 | 修改Apache配置文件httpd.conf,把相关配置和模块都注释掉#LoadModule cgi_module modules/mod_cgi.so#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"#<Directory "/var/www/cgi-bin"># AllowOverride None# Options None # Order allow,deny# Allow from all#</Directory> |
操作目的 | 如果服务器上不需要SSI,建议禁用SSI(Server Side Includes) |
---|---|
检查方法 | 查看Apache配置文件httpd.confLoadModule include_module modules/mod_include.so #加载的模块<Directory "/var/www/html"> Options Indexes FollowSymLinks Includes AllowOverride None Order allow,deny allow from all</Directory> |
加固方法 | 修改Apache配置文件httpd.conf,把相关模块注释掉,在“Include”前面添加减号#LoadModule include_module modules/mod_include.so<Directory "/var/www/html"> Options Indexes FollowSymLinks -Includes AllowOverride None Order allow,deny allow from all</Directory> |
操作目的 | 检查Apache是否记录了错误信息和访问信息 | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
检查方法 | 查看Apache配置文件httpd.conf(1)错误日志ErrorLog logs/error_log #存放诊断信息和处理请求中出现的错误LogLevel warn #设置错误日志中的信息的详细程度,可以选择下列level:Level 描述 例子 emerg 紧急(系统无法使用)"Child cannot open lock file. Exiting"alert 必须立即采取措施"getpwuid: couldn't determine user name from uid"crit 致命情况"socket: Failed to get a socket, exiting child"error 错误情况"Premature end of script headers"warn 警告情况"child process 1234 did not exit, sending another SIGHUP"notice 一般重要情况"httpd: caught SIGBUS, attempting to dump core in ..."info 普通信息"Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..."debug 调试信息"Opening config file ..."(2)访问日志CustomLog logs/access_log common #记录服务器所处理的所有请求LogFormat "%h %l %u %t \"%r\" %>s %b" common #设置日志格式 | Level | 描述 | 例子 | emerg | 紧急(系统无法使用) | "Child cannot open lock file. Exiting" | alert | 必须立即采取措施 | "getpwuid: couldn't determine user name from uid" | crit | 致命情况 | "socket: Failed to get a socket, exiting child" | error | 错误情况 | "Premature end of script headers" | warn | 警告情况 | "child process 1234 did not exit, sending another SIGHUP" | notice | 一般重要情况 | "httpd: caught SIGBUS, attempting to dump core in ..." | info | 普通信息 | "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..." | debug | 调试信息 | "Opening config file ..." |
Level | 描述 | 例子 | ||||||||||||||||||||||||||
emerg | 紧急(系统无法使用) | "Child cannot open lock file. Exiting" | ||||||||||||||||||||||||||
alert | 必须立即采取措施 | "getpwuid: couldn't determine user name from uid" | ||||||||||||||||||||||||||
crit | 致命情况 | "socket: Failed to get a socket, exiting child" | ||||||||||||||||||||||||||
error | 错误情况 | "Premature end of script headers" | ||||||||||||||||||||||||||
warn | 警告情况 | "child process 1234 did not exit, sending another SIGHUP" | ||||||||||||||||||||||||||
notice | 一般重要情况 | "httpd: caught SIGBUS, attempting to dump core in ..." | ||||||||||||||||||||||||||
info | 普通信息 | "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..." | ||||||||||||||||||||||||||
debug | 调试信息 | "Opening config file ..." | ||||||||||||||||||||||||||
加固方法 | 修改Apache配置文件httpd.conf,正确设置错误日志和访问日志后,重新启动Apache |
操作目的 | 自定义Apache返回的错误信息 |
---|---|
检查方法 | 查看Apache配置文件httpd.conf,检查是否使用ErrorDocument自定义错误信息 |
加固方法 | 修改Apache配置文件httpd.conf,自定义错误信息,可以设置返回指定字符串,文件或重定向地址,如下:ErrorDocument 500 "The server made a boo boo."ErrorDocument 404 /missing.htmlErrorDocument 402 http://www.example.com/subscription_info.html常见错误代码:403 禁止访问;404 找不到页面;500是服务器内部错误 |
操作目的 | 防止TRACE方法被访问者恶意利用 |
---|---|
检查方法 | 客户端:telnet IP 80输入下面两行内容后,两次回车OPTIONS * HTTP/1.1HOST:1.1.1.4服务器返回:HTTP/1.1 200 OKDate: Wed, 13 May 2009 07:09:31 GMTServer: Apache/2.2.3 Allow: GET,HEAD,POST,OPTIONS,TRACEContent-Length: 0Connection: closeContent-Type: text/plain; charset=UTF-8表示支持TRACE方法,注意查看是否还支持其他方法,如:PUT,DELETE等,一般情况下都不应该出现在生产主机上 |
加固方法 | 修改Apache配置文件httpd.conf,添加“TraceEnable Off”注:适用于Apache 2.0以上版本 |
操作目的 | 严格设置配置文件和日志文件的权限,防止未授权访问 |
---|---|
检查方法 | 使用命令查看配置文件和日志文件的权限[root@Linux ~]# ls -l /etc/httpd/conf/httpd.conf-rw-r--r-- 1 root root 7571 May 13 17:45 /etc/httpd/conf/httpd.conf[root@Linux ~]# ls -l /var/log/httpdtotal 16-rw-r--r-- 1 root root 4164 May 13 17:45 access_log-rw-r--r-- 1 root root 3152 May 13 17:45 error_log-rw-r--r-- 1 root root 0 May 13 16:58 ssl_access_log-rw-r--r-- 1 root root 1896 May 13 17:45 ssl_error_log-rw-r--r-- 1 root root 0 May 13 16:58 ssl_request_log |
加固方法 | 使用命令“chmod 600 /etc/httpd/conf/httpd.conf”设置配置文件为属主可读写,其他用户无权限使用命令“chmod 644 /var/log/httpd/*.log”设置日志文件为属主可读写,其他用户只读权限 |
操作目的 | 禁用PUT 、DELETE 等危险的HTTP 方法 |
---|---|
检查方法 | 查看httpd.conf 文件,检查如下内容,是否只允许 get、post方法 <LimitExcept GET POST > Deny from all </LimitExcept> |
加固方法 | 编辑httpd.conf 文件,只允许get、post 方法 <LimitExcept GET POST > Deny from all </LimitExcept> |
操作目的 | 根据业务需要,合理设置session 时间,防止拒绝服务攻击 |
---|---|
检查方法 | cat /etc/httpd/conf/httpd.conf查看Timeout、KeepAlive和KeepAliveTimeout的配置 |
加固方法 | 1) 编辑httpd.conf配置文件, Timeout 10 #客户端与服务器端建立连接前的时间间隔 KeepAlive On KeepAliveTimeout 15 #限制每个 session 的保持时间是 15 秒 注:此处为一建议值,具体的设定需要根据现实情况。 (2)重新启动Apache服务 |
操作目的 | 根据机器性能和业务需求,设置最大最小连接数 |
---|---|
检查方法 | 使用httpd -l 检查Apache的工作模式,如列出prefork.c ,则检查httpd.conf中的<IfModule prefork.c> 模块设置是否满足业务需求 |
加固方法 | 使用httpd -l 检查Apache的工作模式,如列出prefork.c ,则进行下列操作: 修改httpd.conf文件找到 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 MaxClients 150 MaxRequestsPerChild 1000 </IfModule> 修改 MaxClients 150 为需要的连接数,如1500 ServerLimit 1500 //连接数大于 256 需设置此项 MaxClients 1500 然后保存退出。 重新启动http 服务: /etc/rc.d/init.d/httpd restart |
操作目的 | 禁止动态脚本在上传目录的运行权限,防止攻击者绕过过滤系统上传webshell |
---|---|
检查方法 | 找到存放上传文件的目录 |
加固方法 | 修改Apache配置文件httpd.conf,添加以下行,以php为例:<Directory "/var/www/html/upload"> <FilesMatch "\.php$">Order allow,denyDeny from all </FilesMatch></Directory> |
操作目的 | 对敏感目录设置密码。例如:admin目录 |
---|---|
检查方法 | 找到要保护的目录 |
加固方法 | (1)修改Apache配置文件httpd.conf,添加以下行,以admin目录为例<Directory "/var/www/html/admin"> AuthName "Admin Access Page" AuthType "Basic" AuthUserFile "/etc/httpd/conf/.htpasswd Require valid-user</Directory>(2)新建密码文件,并添加一个用户[root@Linux ~]# htpasswd -c /etc/httpd/conf/.htpasswd user1New password: Re-type new password: Adding password for user user1再添加一个用户[root@Linux ~]# htpasswd -m /etc/httpd/conf/.htpasswd user2New password: Re-type new password: Adding password for user user2添加完成后查看密码文件内容[root@Linux ~]# cat /etc/httpd/conf/.htpasswduser1:dy4U7/uW5JVrEuser2:$apr1$76k4P...$De4fvJ4Qeyded6J6NOElE/ |
操作目的 | 对网站或敏感目录的访问IP进行限制 |
---|---|
检查方法 | 未设置此参数时,任意IP地址都可以访问网站或敏感目录 |
加固方法 | 查看Apache配置文件httpd.conf<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny allow from all</Directory>Order定义了allow和deny的生效顺序,deny排在后面代表先处理下面allow from定义的允许访问的地址,其余地址均deny |
备注 | 例如:我只允许1.1.1.0网段访问<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny allow from 1.1.1</Directory> |
补充 补丁安装
检查目的 | 安装新版本 |
---|---|
检查方法 | 本地获取Apache版本信息,在漏洞库中查询此版本存在的漏洞[root@Linux ~]# httpd -vServer version: Apache/2.2.3Server built: Jan 21 2009 22:01:41 |
加固方法 | 在http://httpd.apache.org/ 下载最新版Apache源码包,编译安装 |