CentOS 上 Apache HTTP Server 的安全加固清单
一 基础与系统层加固
- 保持系统与软件为最新:执行yum update -y定期更新,及时修补漏洞;变更前备份配置。
- 仅开放必要端口与服务:使用firewalld放行HTTP/HTTPS,避免暴露管理端口与无用服务。
- 启用并正确配置SELinux:优先采用“最小权限”策略,必要时用setsebool与chcon/semanage为 Web 目录与端口设置合适上下文与布尔值,避免直接关闭 SELinux。
- 运行身份最小化:确认httpd.conf中的User/Group为低权限专用账户(如apache),避免使用root或nobody。
- 启动与开机自启:使用systemctl enable --now httpd确保服务受控启动。
二 Apache 服务层加固
- 隐藏版本与系统标识:在主配置设置ServerTokens Prod与ServerSignature Off,减少信息泄露面。
- 禁用目录列表:在**中使用Options -Indexes**,防止目录遍历泄露文件结构。
- 精简与禁用不必要模块:注释不需要的LoadModule(如mod_autoindex、mod_info、mod_userdir、mod_cgi、mod_status等),降低攻击面。
- 限制请求方法:仅允许GET/HEAD/POST等业务必需方法,其他方法返回405。
- 访问控制:对管理后台、敏感目录使用Require ip或Allow from限制来源 IP;对静态资源可进一步细化策略。
- 禁用或严格管控**.htaccess**:在不需要分布式配置时设置AllowOverride None,由主配置统一管理以降低风险。
- 运行身份与权限:确保进程以apache等非特权用户运行,目录与文件权限遵循“最小权限”。
三 加密传输与证书管理
- 启用TLS/HTTPS:安装mod_ssl,配置SSLEngine on,正确设置SSLCertificateFile/SSLCertificateKeyFile,必要时配置SSLCertificateChainFile。
- 获取可信证书:优先使用Let’s Encrypt自动化签发与续期(如certbot --apache -d yourdomain.com),避免自签名证书在生产环境长期使用。
- 防火墙放行:确保firewalld已放行443/tcp,对外仅暴露必要端口。
四 进阶防护与运维
- 部署WAF(mod_security + OWASP CRS):安装mod_security与OWASP Core Rule Set,为常见SQLi/XSS/文件上传等攻击提供规则拦截;上线前充分回归测试,避免误报。
- 防暴力与异常拦截:结合Fail2ban监控Apache 访问/错误日志或modsec_audit.log,自动封禁恶意来源 IP。
- 日志与监控:集中收集并轮转**/var/log/httpd/access_log与error_log**,设置告警规则关注4xx/5xx异常比例、扫描特征与暴力请求。
- 变更与验证:任何配置变更先执行httpd -t语法检查,再systemctl reload httpd平滑生效,保留回滚方案。
五 最小化配置示例
# /etc/httpd/conf.d/security.conf
ServerTokens Prod
ServerSignature Off
# 禁用目录列表
<Directory "/var/www/html">
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# 仅允许 GET/HEAD/POST
<LimitExcept GET HEAD POST>
Require all denied
</LimitExcept>
# 示例:限制管理后台仅内网访问(按实际网段调整)
<Location "/admin">
Require ip 192.168.1.0/24 127.0.0.1
</Location>
- 启用 SSL(/etc/httpd/conf.d/ssl.conf 片段)
LoadModule ssl_module modules/mod_ssl.so
<VirtualHost *:443>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/your_domain.crt
SSLCertificateKeyFile /etc/pki/tls/private/your_domain.key
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
httpd -t && systemctl reload httpd