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自动封禁恶意IP

Apache本身不提供暴力破解防护,需要配合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等组件能自动获取安全更新。很多实际入侵案例并不是因为配置有多复杂的问题,而是因为一个已知漏洞没有及时打补丁。加固的核心逻辑永远是:减少暴露、限制权限、强制加密、监控异常。把这些基础项做扎实,比追逐各种高级技巧更有效。