先说几句:在Ubuntu上运行Apache时,如果忽视安全防护,无异于敞开大门迎客——总有人会顺手牵羊,甚至往屋里扔砖头。下面这套方案,从限制请求频率到基础认证,再到安全审计,基本覆盖了常见的攻击场景。按顺序执行,每一项都是硬核手段。
1. 限制请求频率(防刷单/CC攻击)
CC攻击和刷单的本质都是高频请求,区别在于一个是恶意干扰,另一个是掏空你的资源。我们需要限制单个IP在短时间内发出的请求次数。推荐使用mod_evasive模块,适当配置后能有效抵御这类攻击。
- 安装模块:
sudo apt install libapache2-mod-evasive - 配置规则:编辑
/etc/apache2/mods-enabled/evasive.conf,关键参数可参考以下模板(具体数值请根据业务流量调整):DOSHashTableSize3097# 哈希表大小,建议保持默认DOSPageCount2 # 单个页面1秒内最多允许2次请求DOSSiteCount50# 整站1秒内最多允许50次请求DOSPageInterval 1 # 页面请求检测时间窗口(秒)DOSSiteInterval 1 # 整站请求检测时间窗口(秒)DOSBlockingPeriod 10# 封禁时间(秒),封禁后IP无法访问 - 启用模块与重启:
sudo a2enmod evasive && sudo systemctl restart apache2
2. 防盗链(防资源盗用)
辛辛苦苦拍摄的图片、制作的视频,被人直接外链使用,结果流量费还得自己买单,这谁能接受?通过mod_rewrite模块验证请求来源(Referer),就能阻止非授权网站盗用资源。
- 启用rewrite模块:
sudo a2enmod rewrite && sudo systemctl restart apache2 - 配置.htaccess或虚拟主机:在需要保护的目录(比如
/var/www/html/images)的.htaccess文件中,加入以下规则:
当然,你也可以把相同规则直接放到虚拟主机配置的RewriteEngine OnRewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain\.com [NC]# 允许自身域名RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?trusted-domain\.com [NC]# 可选:允许信任的第三方域名RewriteCond %{HTTP_REFERER} !^$# 允许直接访问(如用户手动输入URL)RewriteRule \.(jpg|jpeg|png|gif|svg|webp)$ - [F,L]# 匹配资源扩展名,返回403块里,效果一样。
3. 防爬虫(防恶意抓取)
搜索引擎的爬虫是朋友,但那些无视robots.txt、盯着敏感目录疯狂扫描的,就不是善茬了。通过识别恶意User-Agent或IP,就能把他们挡在门外。
- 基于User-Agent过滤:在
.htaccess或虚拟主机配置中添加:RewriteEngine OnRewriteCond %{HTTP_USER_AGENT} (BadBot|Scrapy|wget|curl) [NC]# 匹配常见恶意爬虫标识RewriteRule .* - [F,L]# 返回403禁止访问 - 基于IP黑名单:在虚拟主机配置的
块中添加:Require all grantedRequire not ip 192.168.1.100# 封禁单个IPRequire not ip 192.168.1.0/24 # 封禁IP段 - 使用mod_security(高级防护):如果你要对付更复杂的爬虫,可以安装Web应用防火墙(WAF)。安装命令:
然后编辑sudo apt install libapache2-mod-security2sudo a2enmod security2sudo systemctl restart apache2/etc/modsecurity/modsecurity.conf,添加自定义规则。例如,封禁访问/admin或/private目录的IP:
最后重启Apache生效。SecRule REQUEST_URI "@rx /admin|/private" \"id:1001,phase:2,deny,status:403,msg:'Blocked suspicious crawler'"
4. 基础认证(防未授权访问)
后台页面、数据库管理工具等敏感区域,不能让任何人随意闯入。启用HTTP基本认证,让用户输入用户名和密码才能访问。
- 创建密码文件:
sudo htpasswd -c /etc/apache2/.htpasswd admin(首次创建用-c,后续添加用户不用加-c) - 配置访问控制:在虚拟主机或
.htaccess中,针对目标目录添加:
重启Apache后生效。AuthType BasicAuthName "Restricted Area"AuthUserFile /etc/apache2/.htpasswdRequire valid-user
5. 隐藏服务器信息(防信息泄露)
每次请求返回的响应头里都带着Apache版本号和操作系统信息,这等于告诉攻击者“我有这个漏洞”,风险很高。把这些信息隐藏起来,是基本操作。
- 修改Apache配置:编辑
/etc/apache2/conf-enabled/security.conf,将下面两行设置好:
重启Apache生效。ServerTokens Prod# 仅显示"Apache",隐藏版本号ServerSignature Off# 关闭错误页面的服务器信息
6. 启用SSL/TLS加密(防数据窃取)
数据在网络上裸奔,登录密码、支付信息等敏感数据随时可能被中间人截获。使用HTTPS加密,是必须的防线。
- 安装Certbot:
sudo apt install certbot python3-certbot-apache - 获取并安装证书:运行
sudo certbot --apache,按提示输入域名,自动配置SSL证书,非常省心。 - 强制HTTPS:为了确保所有流量都走加密通道,在虚拟主机配置中添加一个重定向规则,将HTTP请求跳转到HTTPS:
重启Apache生效。ServerName yourdomain.comRedirect permanent / https://yourdomain.com/
7. 安全审计与监控(及时发现攻击)
前面都是被动防御,但真正的安全体系需要主动发现异常。通过日志分析和自动化工具,才能把攻击扼杀在萌芽阶段。
- 安装fail2ban:
sudo apt install fail2ban,然后配置/etc/fail2ban/jail.local,加入Apache防护规则。例如拦截恶意爬虫:
配置完重启fail2ban:[apache-badbots]enabled = truefilter = apache-badbotsaction = iptables-multiport[name=HTTP, port="http,https", protocol=tcp]logpath = /var/log/apache2/access.logmaxretry = 3bantime = 3600sudo systemctl restart fail2ban - 定期检查日志:这步虽然手动,但很有效。用
tail -f /var/log/apache2/error.log实时查看错误日志,或者用grep '403' /var/log/apache2/access.log快速定位异常请求。
