Ubuntu服务器上的Apache站点默认配置往往只保证“能跑起来”,但离“抗揍”还有很大距离。加固的核心不是堆砌模块,而是收缩攻击面、限制权限、隐藏信息、强制加密和做好日志审计。下面直接进入具体操作,每一项都可以立即在Ubuntu 20.04/22.04 LTS环境下执行。
先隐藏Apache和系统版本信息默认情况下,Apache会在响应头和错误页里暴露版本号、操作系统类型,这等于告诉攻击者该用哪套现成exp。编辑主配置文件:
sudo nano /etc/apache2/conf-available/security.conf
确保以下两行存在且值正确:
ServerTokens Prod ServerSignature Off
ServerTokens Prod只返回“Apache”,不显示详细版本和Ubuntu字样。ServerSignature Off关闭错误页底部的服务器签名。改完后启用配置并重载:
sudo a2enconf security sudo systemctl reload apache2禁止目录浏览和关闭多余的文件索引
很多站点上线后忘记关闭目录浏览,访问没有index文件的目录会直接列出所有文件名,信息泄露非常严重。在站点配置或.htaccess中加入:
Options -Indexes
同时检查Options指令里是否有多余的FollowSymLinks。如果站点不需要符号链接,可以改为SymLinksIfOwnerMatch,防止利用软链接跨目录读取文件:
Options -Indexes -FollowSymLinks +SymLinksIfOwnerMatch
修改后重载Apache。如果使用虚拟主机,建议在每个VirtualHost里单独设置,而不是依赖全局配置。
限制HTTP请求方法大多数静态站点和普通PHP应用只需要GET、POST、HEAD,PUT、DELETE、TRACE、OPTIONS等方法常被用于漏洞探测或WebDAV攻击。在站点配置中限制:
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
这段配置放在Directory或Location块内。TRACE方法尤其危险,它可能被用于跨站追踪攻击,必须禁用。Apache 2.4默认已禁用TRACE,但显式限制更稳妥。
关闭不必要的模块Ubuntu的Apache默认启用了一堆模块,很多站点根本用不到。模块越多,攻击面越大。查看当前启用的模块:
apache2ctl -M
常见可以安全关闭的模块包括:autoindex、status、info、userdir、proxy、proxy_http、include、cgi、cgid(如果不用Perl/CGI)。关闭方法:
sudo a2dismod autoindex status info userdir proxy proxy_http include cgi cgid sudo systemctl restart apache2
特别注意mod_status和mod_info,它们会暴露服务器运行状态、请求明细、配置路径等敏感信息。如果确实需要监控,必须配合IP白名单。
配置严格的目录权限Web目录的所有权和权限设置不当是Linux环境下最常见的提权入口。建议将站点根目录的所有者设为非root用户,且Apache运行用户(www-data)只对需要写入的目录有写权限。例如站点根目录为/var/www/example.com:
sudo chown -R deploy:www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 750 {} \;
sudo find /var/www/example.com -type f -exec chmod 640 {} \;
只有上传目录、缓存目录需要给www-data写权限:
sudo chown -R www-data:www-data /var/www/example.com/uploads sudo chmod 770 /var/www/example.com/uploads
这样即使某个PHP文件被上传执行,攻击者也无法修改站点核心文件,因为www-data对大部分文件只有读权限。
强制HTTPS并配置HSTS明文HTTP传输会让登录凭证、会话Cookie完全暴露。Ubuntu上使用Let's Encrypt证书非常方便:
sudo apt install certbot python3-certbot-apache sudo certbot --apache -d example.com -d www.example.com
然后在站点配置中强制跳转HTTPS:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
同时启用HSTS,告诉浏览器只通过HTTPS访问:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
HSTS能有效防止SSL剥离攻击,但注意启用前必须确保全站所有资源都走HTTPS,否则会导致页面加载失败。
部署Web应用防火墙模块ModSecurity是Apache最成熟的WAF模块,能拦截SQL注入、XSS、命令注入等常见攻击。Ubuntu安装:
sudo apt install libapache2-mod-security2 sudo a2enmod security2
默认规则集需要额外下载OWASP CRS。先备份默认配置:
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
将SecRuleEngine改为On:
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf
然后克隆OWASP CRS规则集到指定目录,并在modsecurity.conf中引用。启用后先观察日志,避免误杀正常业务请求。ModSecurity对性能有一定影响,但配合合理的规则白名单,对中小站点完全可接受。
限制请求体大小和超时参数Apache默认允许最大1GB的请求体,攻击者可以用超大请求耗尽服务器内存和带宽。在站点配置中限制:
LimitRequestBody 10485760
这表示限制请求体为10MB。同时调整超时参数,防止慢速攻击:
Timeout 60 KeepAliveTimeout 5 RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
RequestReadTimeout指令能有效缓解Slowloris类型的慢速读写攻击。MinRate设置每秒最少接收字节数,低于该速率连接会被断开。
配置防点击劫持和MIME嗅探保护安全响应头是低成本高回报的加固手段。在站点配置中添加:
Header always set X-Frame-Options "SAMEORIGIN" Header always set X-Content-Type-Options "nosniff" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
X-Frame-Options防止站点被嵌入iframe进行点击劫持。X-Content-Type-Options禁止浏览器MIME嗅探,防止把文本文件当脚本执行。Referrer-Policy控制跨域请求时是否发送来源信息。Permissions-Policy限制浏览器API权限,减少被滥用风险。
使用Fail2ban自动封禁恶意IPApache本身不提供暴力破解防护,需要配合Fail2ban。安装并配置:
sudo apt install fail2ban sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
在jail.local中启用Apache相关监狱:
[apache-auth] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache2/error.log maxretry = 5 bantime = 3600 [apache-badbots] enabled = true port = http,https filter = apache-badbots logpath = /var/log/apache2/access.log maxretry = 2 bantime = 86400
apache-auth监控认证失败,apache-badbots拦截已知恶意爬虫。重启fail2ban后,攻击IP会被iptables自动封禁。还可以自定义filter匹配扫描器特征,比如大量404请求或特定User-Agent。
隔离PHP运行环境如果站点运行PHP,务必使用PHP-FPM配合Apache的mod_proxy_fcgi,并为每个虚拟主机建立独立的PHP-FPM池。这样不同站点之间的PHP进程相互隔离,一个站点被入侵不会直接读取另一个站点的文件。安装:
sudo apt install php-fpm sudo a2enmod proxy_fcgi setenvif
在虚拟主机中配置:
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm-example.sock|fcgi://localhost"
</FilesMatch>
然后为每个站点创建独立的FPM池配置文件,设置不同的用户、组、监听socket和php_admin_value。这样即使某个站点的PHP被拿下,攻击者也受限于该池的用户权限,无法跨站读取。
定期审计日志和文件完整性加固不是一次性工作。Apache的access.log和error.log要定期检查,重点关注异常POST请求、大量404、非正常User-Agent和访问敏感路径的记录。可以使用简单的shell脚本配合cron定时发送告警:
grep -E "(\/etc\/passwd|\/proc\/self|\/wp-admin|\/\.git)" /var/log/apache2/access.log
文件完整性方面,安装AIDE或Tripwire,对站点目录建立基线,任何文件新增、修改、删除都会记录。Ubuntu安装AIDE:
sudo apt install aide sudo aideinit
之后定期运行aide.wrapper --check,对比数据库差异。对于核心配置文件和站点代码,建议纳入版本控制,既能审计变更,也能快速回滚。
最后提醒一点:Ubuntu的unattended-upgrades要开启,确保Apache、OpenSSL、PHP等组件能自动获取安全更新。很多实际入侵案例并不是因为配置有多复杂的问题,而是因为一个已知漏洞没有及时打补丁。加固的核心逻辑永远是:减少暴露、限制权限、强制加密、监控异常。把这些基础项做扎实,比追逐各种高级技巧更有效。
