注:最近部门领导要求梳理一份常用工具的安全加固参考手册,基于此需求,针对工作中经常遇到的被漏扫发现的问题,进行了梳理,参考了官网内容,不足之处,还望指正,版本环境为Apache2.4.34 若有参数不能正常使用,请参考Apache官网。
统一的编译参数:
参考配置:
1)、提前安装依赖环境apr、apr-util、pcre、zlib
2)、编译参数
./configure --prefix=/asop/apache2.4.34 --enable-so --enable-mods-shared=all --with-apr=/usr/local/apr1.5/
--with-apr-util=/usr/local/apr-util1.5.3/ --with-pcre=/usr/local/pcre8.43/ --with-z=/usr/local/zlib1.2.11/ --with-mpm=prefork
1)、站点统一配置
参考配置:
取消虚拟主机注释
#Include conf/extra/httpd-vhosts.conf
注释掉默认虚拟主机
<VirtualHost *:80>
ServerAdmin ****@mail.com
DocumentRoot "/asop/apache2.4.34/docs"
ServerName www.***.com
ErrorLog ErrorLog "| /asop/apache2.4.34/bin/rotatelogs /asop/apache2.4.34/log/www.***.com-%Y-%m-%d-error-log 86400 480"
CustomLog "| /asop/apache2.4.34/bin/rotatelogs /asop/apache2.4.34/logs/www.***.com-%Y-%m-%d-access_log 86400 480" combined
</VirtualHost>
2)、配置统一的日志格式
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
3)、日志切割
CustomLog "| /usr/local/apache/bin/rotatelogs /usr/local/apache/logs/www.***.com-%Y-%m-%d-access_log 86400 480"
ErrorLog "| /usr/local/apache/bin/rotatelogs /usr/local/apache/www.***.com-%Y-%m-%d-error-log 86400 480"
隐藏版本信息
#参考配置完成后,http的请求头中将不在显示Apache版本信息,但是会依然显示web服务器名称
参考配置:
ServerSignature Off
ServerTokens Prod
隐藏请求头中的server信息
#隐藏web服务器的名称或者设置混淆server信息,需要在编译安装之前调整源码,或者安装完成后使用源码修改重新编译
参考配置:
vi httpd-2.4.34/include/ap_release.h
#define AP_SERVER_BASEVENDOR "Assoft"
#define AP_SERVER_BASEPROJECT "Assoft"
#define AP_SERVER_BASEPRODUCT "GW"
1)、超时类限制
RequestReadTimeout
#主要用来设置TLS握手的超时时间和从客户端接收请求头和body的超时,若未配置https证书,可以不用配置
#需要版本大于2.3.14和2.2.15以上版本,handshake需要版本高于2.4.39
#需要依赖mod_reqtimeout
配置参考:
LoadModule reqtimeout_module modules/mod_reqtimeout.so 确认是否打开注释
RequestReadTimeout handshake=3 header=5 body=10
TimeOut
#设置超时等待I/O的时间, 默认为60秒,建议调低
#开启长连接
配置参考:
TimeOut 10
KeepAlive 长连接相关设置
#开启长连接(KeepAlive on),允许通过一个Tcp连接发送多个请求
#应配置长连接超时时间(KeepAliveTimeout),降低服务器负载
#设置每个长连接能处理的最大请求数(MaxKeepAliveRequests),默认为100,设置为0则不限制
配置参考:
KeepAlive on
KeepAliveTimeout 5 (默认值)
MaxKeepAliveRequests 1000
2)、资源限制
Serverlimit
#可配置使用的最大进程数
MaxConnectionsPerChild
#设置单个子进程能处理的最大连接数,到达最大处理量后,该子进程结束,默认为0,不限制,建议设置为非0的值,以避免内存泄露
配置参考:
MaxConnectionsPerChild 5000
MaxRequestWorkers
#设置服务器子进程(线程)的最大并发请求数,超过此值的请求将进行排队
#对于 prefork 模块,此值表示的为子进程的处理数量,默认为256,增加的同时,需要同时增加ServerLimit 配置参考:
#对于event 或 worker ,此值表示可以用来处理的线程的总数,默认为16(Serverlimit)*25(ThreadsPerChild),所以,增加此值的时候,需要同时设置Serverlimit和ThreadsPerChild的值
#prefork模式的处理请求的方式为:通过不同的子进程来处理用户请求,每个子进程处理一个请求,优点是每个子进程异常,不会影响其他子进程的请求处理,缺点是每个进程的创建需要占用系统资源
#work模式的处理请求的方式为:通过子进程创建线程来响应用户请求
配置参考:
prefork模式下:
<IfModule mpm_prefork_module>
StartServers 50
MinSpareServers 50
MaxSpareServers 80
MaxRequestWorkers 1000
MaxRequestsPerChild 10000
</IfModule>
Serverlimit 1500
work模式下:
<IfModule mpm_worker_module>
StartServers 5
MaxRequestWorkers 1000
MinSpareThreads 20
MaxSpareThreads 50
ThreadsPerChild 100
MaxRequestsPerChild 15000
</IfModule>
Serverlimit 1500
windows下的win_mpm:
<IfModule mpm_winnt_module>
ThreadsPerChild 1500
MaxRequestsPerChild 15000
</IfModule>
修改 bin conf logs 权限为755
chmod 755 bin conf logs
修改 httpd 文件权限为 511
chmod 511 bin/httpd
禁用CGI程序
注释掉mod_cgid.so
#ScriptAlias /cgi-bin/ "/asop/apache2.4.34/cgi-bin/"
删除Apache目录下的CGI目录
rm -rf cgi-bin
1)、禁止遍历整个目录
<Directory "/">
Require all denied
</Directory>
2)、禁止映射至系统根目录
打开注释 LoadModule userdir_module modules/mod_userdir.so
文档末尾加入:UserDir disabled root
HTTP1.0定义了三种请求方法: GET、POST、HEAD,HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE 、CONNECT,其中常用的为http1.0定义的GET和POST方法,建议禁用除此两种方法以外的所有方法。
参考配置:
打开注释:LoadModule allowmethods_module modules/mod_allowmethods.so
文档末尾加入:
<Location "/">
AllowMethods GET POST HEAD
</Location>
目录列出会在请求的资源不存在的情况下,将此目录下的文件以列表形式列出
参考配置:
options -Indexes FollowSymLinks
web上点击劫持主要是通过iframe嵌套方式实现的,所以,预防的主要办法也就是通过请求头限制iframe的嵌套
#X-Frame-Options 这个请求头可以有三个可选值:DENY 拒绝所有当前页面加载任何iframe嵌套
#SAMEORIGIN:iframe页面的地址只能为同源域名下的页面
#ALLOW-FROM origin:允许iframe加载的页面地址
参考配置:
Header always append X-Frame-Options SAMEORIGIN
配置参考:
#http段中加入如下信息
ErrorDocument 400 /custom400.html
ErrorDocument 401 /custom401.html
ErrorDocument 403 /custom403.html
ErrorDocument 404 /custom404.html
ErrorDocument 405 /custom405.html
ErrorDocument 500 /custom500.html