个人网站安全防护体系搭建:WAF、防CC攻击与数据加密实战

前言

网站安全是每一个站长都无法回避的话题。很多个人站长觉得"我的网站又没什么价值,谁会来攻击我",这种想法大错特错。事实是,大多数攻击都是自动化脚本扫描进行的,它们不针对特定目标,而是批量扫描互联网上所有存在漏洞的网站。一旦你的网站被植入恶意代码,不仅数据可能泄露,还会被搜索引擎列为危险站点,辛苦积累的流量和信誉瞬间归零。本文将分享一套适合个人站长的低成本安全防护方案,涵盖 Web 应用防火墙(WAF)、防 CC 攻击、数据加密和日常安全运维四个方面。

一、Web 应用防火墙:网站的第一道防线

Web 应用防火墙是部署在网站前端的安全组件,能够检测和拦截各种 Web 攻击,包括 SQL 注入、跨站脚本(XSS)、文件包含漏洞等。

使用 Nginx 内置模块搭建 WAF

Nginx 的 ngx_http_rewrite_module 结合 Lua 脚本可以实现基本的 WAF 功能。更推荐的是使用 OpenResty(Nginx + LuaJIT),它内置了 Lua 支持,性能更好。

以下是基于 OpenResty 的 WAF 核心配置:

# 在 nginx.conf 中加载 WAF 规则
lua_shared_dict waf_storage 64m;
init_worker_by_lua_file /etc/nginx/waf/init.lua;
access_by_lua_file /etc/nginx/waf/access.lua;

拦截常见攻击

在 access.lua 中实现基本的攻击检测逻辑:

拦截 SQL 注入:

关键是要检测常见的 SQL 注入特征,如 ' OR '1'='1UNION SELECT-- 等。但要注意不要过度拦截,避免误伤正常查询。建议使用白名单加黑名单的组合策略:先允许常规请求通过,再对包含可疑模式的请求进行二次验证。

拦截 XSS 攻击:

XSS 攻击的核心特征是尝试在页面中注入 JavaScript 代码。检测 <script> 标签、onerroronload 等事件处理器以及 javascript: 伪协议。对于个人网站来说,输入过滤比输出转义更容易实现,但输出转义才是最根本的防护手段。

使用 ModSecurity

ModSecurity 是业界最成熟的开源 WAF 引擎。虽然配置相对复杂,但它提供了 OWASP 核心规则集(CRS),覆盖了绝大多数已知的 Web 攻击模式。

安装 ModSecurity 并与 Nginx 集成:

# 安装 ModSecurity
apt install libmodsecurity3 nginx-module-modsecurity

# 启用 OWASP 核心规则集
Include /etc/nginx/modsec/owasp-crs/crs-setup.conf
Include /etc/nginx/modsec/owasp-crs/rules/*.conf

ModSecurity 的默认规则集对个人网站来说可能过于严格,需要根据实际情况调整。建议先用检测模式运行一段时间,收集误报后再切换到防护模式。

二、防 CC 攻击实战方案

CC 攻击(Challenge Collapsar)是个人网站最常见也最头疼的攻击方式。攻击者通过大量代理 IP 发送看似正常的请求,耗尽服务器资源,导致正常用户无法访问。

Nginx 限流配置

Nginx 自带的限流模块可以有效地减轻 CC 攻击的影响:

# 定义限流区域
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

# 应用限流规则
location / {
    limit_req zone=one burst=5 nodelay;
}

这里限制每个 IP 每分钟最多 30 个请求,超出部分直接拒绝。对于正常用户来说,每分钟 30 个请求完全够用。burst=5 允许短暂突发,nodelay 确保突发请求被立即处理而不是排队。

针对不同页面的差异化限流

网站的登录页面、搜索接口和评论提交功能是最常被攻击的目标。可以对这些敏感接口设置更严格的限流:

# 登录接口限流更严格
location /wp-login.php {
    limit_req zone=login_limit burst=3 nodelay;
}

# 搜索接口限流
location /search {
    limit_req zone=search_limit burst=2 nodelay;
}

IP 黑名单和白名单

对于确定是攻击来源的 IP 段,可以直接在 Nginx 层面拦截:

# 在黑名单中的 IP 全部拒绝
deny 192.168.1.0/24;
deny 10.0.0.1;
allow all;

结合 fail2ban 工具可以自动将攻击 IP 加入黑名单:

# fail2ban jail 配置
[nginx-cc]
enabled = true
filter = nginx-cc
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600
action = nginx-blacklist

配置说明:60 秒内超过 100 次请求的 IP 自动封禁 1 小时。这个阈值可以根据网站的正常访问量进行调整。

使用 CDN 防御

CDN 不仅是加速手段,更是防御 CC 攻击的利器。Cloudflare 的免费套餐就提供了基本的 DDoS 防护和 CC 攻击缓解能力。开启 CDN 后,攻击流量首先到达 CDN 节点,源站的压力大大减轻。

三、数据加密与备份

安全不只是防攻击,还要确保数据在存储和传输过程中的安全。

HTTPS 全站启用

Let's Encrypt 免费 SSL 证书让 HTTPS 的普及变得简单。使用 certbot 可以一键申请和续期:

apt install certbot python3-certbot-nginx
certbot --nginx -d yourdomain.com -d www.yourdomain.com

启用 HTTPS 后,不仅数据传输过程被加密,还能提升搜索引擎排名——Google 已经将 HTTPS 列为排名信号。

数据库加密

对于包含用户隐私数据的表,建议对敏感字段进行加密存储。MySQL 提供了 AES 加密函数:

-- 加密存储
INSERT INTO users (email, encrypted_phone) 
VALUES ('user@example.com', AES_ENCRYPT('13800138000', 'encryption_key'));

-- 解密读取
SELECT email, AES_DECRYPT(encrypted_phone, 'encryption_key') AS phone 
FROM users WHERE id = 1;

自动化备份策略

数据备份是安全体系的最后一道防线。以下是我使用的备份策略:

每天自动备份数据库:

0 3 * * * mysqldump -u root --all-databases | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz

每周完整备份网站文件:

0 4 * * 0 tar -czf /backup/www_$(date +\%Y\%m\%d).tar.gz /var/www/

备份文件同步到远程存储:

0 5 * * * rclone sync /backup/ remote:bucket/backup/

推荐使用 rclone 将备份同步到云存储(如 Google Drive、Backblaze B2 或阿里云 OSS),确保即使服务器完全损坏也能恢复数据。保留最近 30 天的备份,过期的自动删除。

四、日常安全运维清单

安全防护是一个持续的过程,以下是我每周例行执行的检查清单。

定期更新软件版本

过时的软件版本是安全漏洞的主要来源。设置自动安全更新:

apt install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades

检查系统日志

每天快速浏览关键日志文件:

# 检查登录尝试
grep "Failed password" /var/log/auth.log | tail -20

# 检查 Nginx 错误日志
tail -50 /var/log/nginx/error.log

文件完整性检查

使用 AIDE(Advanced Intrusion Detection Environment)监控网站文件变化:

aideinit
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 定期运行检查
aide --check

权限最小化原则

网站运行目录的权限设置:

# 文件所有者
chown -R www-data:www-data /var/www/

# 目录 755,文件 644
find /var/www/ -type d -exec chmod 755 {} \;
find /var/www/ -type f -exec chmod 644 {} \;

# 上传目录只写不可执行
chmod -R 755 /var/www/uploads/

SSH 安全加固

SSH 是服务器的管理入口,必须重点防护:

# 禁止密码登录,只允许密钥
PasswordAuthentication no

# 修改默认端口
Port 2222

# 禁止 root 直接登录
PermitRootLogin prohibit-password

结语

网站安全防护不是一蹴而就的工作,而是一个需要持续投入和改进的过程。对于个人站长来说,我的建议是:先从基础做起——启用 HTTPS、配置简单的限流规则、做好数据备份。这三件事成本最低但收益最大。当网站规模扩大后,再逐步引入 WAF、文件完整性检查和入侵检测等高级防护手段。记住,安全的目标不是让攻击者完全无法攻破——因为没有绝对安全的系统——而是让攻击成本远高于攻击收益,让攻击者主动放弃对你的网站下手。

Last modification:July 23rd, 2026 at 08:09 am

Leave a Comment