多个 WordPress 站点共用一台服务器(通常称为“多站托管”或“Shared Hosting/Multi-site Setup”)确实能节省成本,但安全风险是指数级增加的。一旦一个站点被攻破,攻击者可能横向移动到其他站点甚至控制整个服务器。
以下是从架构隔离、系统配置、应用层防护、监控备份四个维度整理的最佳实践方案:
一、 核心原则:最小权限与隔离
1. 使用独立的 Web 用户和文件权限
绝对不要让所有 WordPress 站点都运行在同一个系统用户(如 www-data 或 nginx)下拥有完全相同的权限。
- 推荐做法:为每个站点创建独立的系统用户(例如
wp_user1,wp_user2)。 - Web 服务器配置:使用 PHP-FPM 时,为每个站点配置独立的 pool,并指定不同的用户和组。
; /etc/php/8.1/fpm/pool.d/site1.conf [site1] user = wp_user1 group = wp_user1 listen.owner = www-data listen.group = www-data - 文件权限:
- 所有者:对应站点的独立用户。
- 目录权限:750(仅所有者和组可读可执行)。
- 文件权限:640(仅所有者可读,组可读)。
wp-content/uploads等需要写入的目录需特殊处理,但不要设为 777。
2. 数据库隔离
- 每个站点使用独立的 MySQL/MariaDB 用户和数据库。
- 禁止跨库访问。确保
wp_user1只能访问db_site1,不能访问db_site2。 - 如果可能,使用不同的数据库实例或容器化部署(Docker),实现物理隔离。
二、 Web 服务器与安全模块配置
1. 启用 HTTPS 强制跳转
- 所有站点必须使用 SSL/TLS 证书(推荐使用 Let’s Encrypt 自动续签)。
- 在 Nginx/Apache 中强制 HTTP → HTTPS 跳转。
2. 隐藏服务器版本信息
- Nginx:
server_tokens off; - Apache:
ServerTokens Prod ServerSignature Off - PHP:
在php.ini中设置:expose_php = Off
3. 限制请求大小与方法
- 禁用不必要的 HTTP 方法(如 PUT, DELETE, TRACE)。
- 限制上传文件大小,防止资源耗尽攻击。
4. 使用 Fail2Ban 保护 SSH 和 Web
- 安装 Fail2Ban,监控 Nginx/Apache 日志,对频繁 404/403/500 错误的 IP 进行临时封禁。
- 特别针对 WordPress 的登录页面 (
/wp-login.php) 和 XML-RPC 端点加强防护。
三、 WordPress 应用层安全加固
1. 定期更新
- 核心、主题、插件必须保持最新。旧版本漏洞是主要入侵途径。
- 启用自动小版本更新(WordPress 5.5+ 支持)。
2. 强密码与双因素认证(2FA)
- 所有管理员账户启用 2FA(使用 Wordfence Authy、Google Authenticator 等插件)。
- 避免使用默认用户名
admin。
3. 限制登录尝试
- 使用插件(如 Limit Login Attempts Reloaded)或服务器层规则,限制每个 IP 每小时登录失败次数。
- 更改默认登录 URL(通过插件或自定义重定向)。
4. 禁用文件编辑
- 在
wp-config.php中添加:define('DISALLOW_FILE_EDIT', true); define('DISALLOW_FILE_MODS', true); // 可选,禁止后台安装/更新插件和主题
5. 安全头(Security Headers)
在 Nginx 中添加以下响应头:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 可选:严格内容安全策略(CSP)
# add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline';";
6. 禁用 XML-RPC(如果不需要)
- XML-RPC 常被用于暴力破解和 DDoS。
- 在 Nginx 中阻止:
location = /xmlrpc.php { deny all; access_log off; log_not_found off; }
四、 高级隔离与架构建议
1. 使用容器化(Docker)—— 强烈推荐
将每个 WordPress 站点部署在独立的 Docker 容器中:
- 优点:进程隔离、文件系统隔离、网络隔离。
- 工具:可使用 Compose 管理,或使用自动化平台如 WordOps、RunCloud、Ploi.io。
- 示例结构:
version: '3.8' services: site1-wordpress: image: wordpress:php8.1-fpm volumes: - ./site1/wp-content:/var/www/html/wp-content environment: WORDPRESS_DB_HOST: db depends_on: - db site1-db: image: mysql:8.0 volumes: - ./site1/data:/var/lib/mysql
2. 防火墙(UFW/iptables)
- 只开放必要端口:80 (HTTP), 443 (HTTPS), 22 (SSH)。
- 关闭其他所有入站端口。
- 限制 SSH 访问来源 IP(仅限你管理的 IP)。
3. 防病毒与恶意软件扫描
- 安装 ClamAV 或类似工具,定期扫描网站文件。
- 使用 WordPress 安全插件(如 Wordfence, Sucuri, iThemes Security)进行实时扫描和文件完整性监控。
- 注意:这些插件会消耗资源,建议在非高峰时段运行扫描。
五、 备份与灾难恢复
1. 定期备份策略
- 频率:每日增量备份,每周全量备份。
- 内容:数据库 + 所有站点文件。
- 存储:备份文件必须存储在服务器外部(如 AWS S3、Backblaze B2、另一台异地服务器)。
- 测试恢复:每季度至少测试一次备份能否成功还原。
2. 快照功能
- 如果使用 VPS(如 DigitalOcean、Linode、AWS EC2),利用云服务商提供的磁盘快照功能。
- 在重大操作前手动创建快照。
六、 监控与审计
-
集中日志:
- 使用 ELK Stack(Elasticsearch, Logstash, Kibana)或 Graylog 收集所有站点的 Nginx、PHP、MySQL 日志。
- 设置告警:当检测到大量 404、SQL 注入特征、异常登录时立即通知。
-
入侵检测系统(IDS):
- 安装 OSSEC 或 Wazuh,监控系统文件变更和异常行为。
-
定期安全审计:
- 检查是否有未知的 cron job、可疑的定时任务、陌生的 SSH 密钥。
- 审查 WordPress 插件列表,移除未使用的插件。
总结:关键 checklist
| 层级 | 关键措施 |
|---|---|
| 系统 | 独立用户、最小权限、Fail2Ban、UFW 防火墙 |
| Web 服务器 | HTTPS 强制、隐藏版本、禁用 XML-RPC、安全头 |
| PHP | 独立 FPM Pool、expose_php=Off、限制函数 |
| 数据库 | 独立用户/数据库、强密码、远程访问禁用 |
| WordPress | 2FA、DISALLOW_FILE_EDIT、定期更新、安全插件 |
| 隔离 | 强烈建议使用 Docker 容器化每个站点 |
| 备份 | 外部存储、定期测试恢复 |
| 监控 | 日志集中分析、文件完整性监控 |
最后提醒:没有绝对安全的系统。定期关注 WordPress 官方安全公告,并在生产环境变更前先在测试环境验证。对于高流量或高敏感数据站点,建议考虑分离服务器或专业托管服务。
云小栈