docker + WordPress 加固部署方案(雷池 WAF)

雷池 Safeline WAF 口号

雷池 Safeline WAF 口号

虽然WordPress部署教程有很多,本篇部署方案的重点在于在单个服务器上,docker 部署,使用长亭Safeline 雷池 Web应用防火墙( WAF )进行代替常用的Nginx 保证 WordPress 安全。适合使用单服务器的个人博客网站,建议配置至少2h4g。

入手了自己的云服务器,总不能闲着不用叭,用其来部署一个个人博客站,记录成长、分享生活是一个好的选择。博客框架有很多,我想更多的专注于内容创作(主要是菜,所以选择了老牌成熟的 WordPress

然而,WordPress的巨大市场份额也使其成为黑客与自动化攻击脚本的重点关注对象。因此,如何为其筑起坚固的防线保证 WordPress 安全?(其实是我喜欢瞎折腾啦

通过Docker容器化技术,我们将构建一个由Safeline WAF作为安全网关,内部集成MariaDB数据库与Redis缓存的高效、安全的WordPress站点。

实际部署成果:https://www.paddysun.top/ 欢迎来我的个人博客玩呀

核心组件简介

  1. WordPress
    1. 是什么:一款全球最流行的开源内容管理系统(CMS),以其强大的功能、灵活的可扩展性(海量主题与插件)和友好的用户体验而闻名。无论是个人博客、企业官网还是电商平台,它都能胜任。
    2. 在本文中的角色:我们网站的核心应用,提供内容创作和管理的所有功能。
  2. 长亭 Safeline WAF
    1. 是什么:一款业界领先的、开箱即用的Web应用防火墙产品。它像一位忠诚的卫士,守候在网站的最前沿,对所有外来访问请求进行检测和过滤,能有效防御SQL注入、跨站脚本(XSS)、恶意爬虫等常见的Web攻击。
    2. 在本文中的角色:我们的“安全网关”。所有公网流量都必须先经过它的审查,确认安全无害后,才会被转发给内网的WordPress容器。WordPress本身则不直接暴露在公网上,提升了安全性。

实现 “既享受WordPress的便捷与强大,又拥有可靠的安全防护”

本部署方案关键优势

  1. 单服务器:虽然长亭官方不建议单服务器部署,奈何钱包空空。成本低
  2. 安全防护:所有流量经过 Safeline WAF 防护
  3. 网络隔离:WordPress 不直接暴露在公网
  4. 详细得不行(大概叭:我折腾了1个月,稳定运行1个月的实际部署方案

这种架构既保证了安全性,又保持了完整功能。

具体部署方案 (个人博客实战检验稳定运行)

购买并登云服务器(建议配置至少2h4g)

  • 选择 Linux 系统镜像
  • 确保云和系统安全组开放端口:80, 443
  • 通过 SSH 登录服务器:ssh ubuntu@your-server-ip

0.服务器准备&docker安装

# 更新系统
sudo apt update && sudo apt upgrade -y


# 安装 Docker
sudo apt install docker.io -y


# 安装 Docker Compose
sudo apt install docker-compose-plugin -y


# 验证安装
docker --version
docker compose version


# 确保云防火墙和服务器系统放行80和443端口

1.safeline docker安装

safeline docker安装教程摘录自官方文档 长亭官方安装教程

1.1.创建雷池目录

mkdir -p "/data/safeline"

该命令会创建 /data/safeline 目录作为雷池的安装目录(你可以根据你的实际情况选择安装目录)

请确保该目录至少有 5GB 的存储空间(如果日常流量较大,请保证充足的磁盘容量)

1.2.下载 compose 编排脚本

使用下方的命令进入雷池安装目录,并下载 docker compose 编排脚本

cd "/data/safeline"
wget "https://waf-ce.chaitin.cn/release/latest/compose.yaml"

1.3.配置 compose 环境变量

使用下方的命令进入雷池安装目录,并创建 .env 配置文件

cd "/data/safeline"
touch ".env"

使用文本编辑器打开 .env 文件,写入下方的内容,POSTGRES的密码需自定义

具体参数请参考官方文档 长亭官方安装教程

SAFELINE_DIR=/data/safeline
IMAGE_TAG=latest
MGT_PORT=9443
POSTGRES_PASSWORD=yourpassword #(自定义密码使用数字+英文大小写组合,勿使用特殊字符)
SUBNET_PREFIX=172.22.222 
IMAGE_PREFIX=swr.cn-east-3.myhuaweicloud.com/chaitin-safeline
ARCH_SUFFIX=
RELEASE=
REGION=
MGT_PROXY=0

1.4.启动雷池

现在万事具备,使用以下命令启动雷池服务

cd "/data/safeline"
docker compose up -d

2.Wordpress 安装

WordPress部署方案参考 Docker部署Wordpress (Nginx+Mariadb+redis+Wordpress)

选择合适的目录,创建项目结构

# 创建项目目录
mkdir wordpress && cd wordpress


# 创建必要的目录结构
mkdir -p data/mariadb/{conf,logs}
mkdir -p data/redis/{conf,log,data}
mkdir -p data/wordpress/{html,php}


# 设置目录权限
sudo chmod -R 755 data/

3. 创建配置文件

3.1 修改后的 docker-compose.yml(关键修改)

# docker-compose.yml
services:
  mariadb:
    image: mariadb:10
    container_name: mariadb
    restart: always
    volumes:
      - ./data/mariadb/conf:/etc/mysql/conf.d
      - ./data/mariadb/logs:/logs
      - wordpress-db-data:/var/lib/mysql
    environment:
      MARIADB_DATABASE: wordpress
      MARIADB_USER: ${DB_USER:-wordpress_user}
      MARIADB_PASSWORD: ${DB_PASSWORD:-secure_password_123}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-very_secure_root_password_123}
      TZ: Asia/Shanghai
    networks:
      - wordpress_network


  redis:
    image: redis:alpine
    container_name: redis
    restart: always
    volumes:
      - ./data/redis/log/redis.log:/etc/redis.log
      - ./data/redis/conf/redis.conf:/etc/redis/redis.conf
      - ./data/redis/data:/data
    networks:
      - wordpress_network


  wordpress:
    depends_on:
      - mariadb
      - redis
    image: wordpress:latest
    container_name: wordpress
    restart: always
    volumes:
      - ./data/wordpress/html:/var/www/html
      - ./data/wordpress/php/upload.ini:/usr/local/etc/php/conf.d/upload.ini
    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_USER: ${DB_USER:-wordpress_user}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD:-secure_password_123}
      WORDPRESS_DB_NAME: wordpress
      TZ: Asia/Shanghai
      # 重要!:不可以设置 WordPress 站点 URL 和主页地址 要不然之后无法修改
      # WORDPRESS_CONFIG_EXTRA: |
      #  define('WP_HOME', 'https://${DOMAIN}');
      #  define('WP_SITEURL', 'https://${DOMAIN}');
    networks:
      - wordpress_network
    # 重要:不直接暴露端口到宿主机,只在Docker内网访问
    expose:
      - "80"


networks:
  wordpress_network:


volumes:
  wordpress-db-data:

3.2 创建环境变量文件

# 创建 .env 文件存储敏感信息
cat > .env << EOF
# 数据库配置
DB_USER= #(你的数据库用户名称)
DB_PASSWORD= #(你的安全密码)
DB_ROOT_PASSWORD= #(你的安全密码)


# 域名配置
DOMAIN= #你的域名
SERVER_IP= #你的IP 


# WordPress 容器配置


WORDPRESS_PORT=80
WORDPRESS_CONTAINER_NAME=wordpress
EOF


# 保护环境文件权限,若要以非root启动,则暂时不必配置权限
chmod 600 .env

3.3 创建 Redis 配置

# 下载 Redis 配置文件
wget -O ./data/redis/conf/redis.conf http://download.redis.io/redis-stable/redis.conf


# 修改 Redis 配置
sed -i 's/^bind 127.0.0.1/bind 0.0.0.0/' ./data/redis/conf/redis.conf
sed -i 's/^protected-mode yes/protected-mode no/' ./data/redis/conf/redis.conf
sed -i 's/^daemonize yes/daemonize no/' ./data/redis/conf/redis.conf
echo 'logfile "/etc/redis.log"' >> ./data/redis/conf/redis.conf
echo 'maxmemory 1gb' >> ./data/redis/conf/redis.conf
echo 'maxmemory-policy allkeys-lru' >> ./data/redis/conf/redis.conf


# 创建日志文件
touch ./data/redis/log/redis.log
chmod 666 ./data/redis/log/redis.log

3.4 创建 PHP 上传配置

# 创建 PHP 配置目录
mkdir -p ./data/wordpress/php/


# 创建 upload.ini 文件
cat > ./data/wordpress/php/upload.ini << EOF
file_uploads = On
memory_limit = 256M
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300
EOF

4. 启动 WordPress 服务

# 启动所有服务
docker compose --env-file .env up -d


# 查看服务状态
docker compose ps


# 查看 WordPress 日志
docker compose logs -f wordpress

5. 配置 Safeline 反向代理

因为WordPress和safeline处于不同的docker和网络, 现在需要在 Safeline 管理界面添加 WordPress 站点, 这样safeline才能与WordPres通讯.

5.1 获取 WordPress 容器网络IP

# 将 WordPress 相关容器连接到 Safeline 网络
sudo docker network connect safeline-ce wordpress


# 查看 safeline-ce 网络中 wordpress 容器的 IP 地址
sudo docker inspect safeline-ce
# 将"Name": "wordpress"块的IP地址记录下来

5.2 在 Safeline 中添加站点

  1. 登录 Safeline 管理界面https://您的服务器IP:9443

添加防护站点

  1. 站点名称:wordpress或者你喜欢的名称
  2. 上游服务器:WordPress 容器的实际 IP地址
  3. 访问域名:your-domain.com (没有域名一定要填写 * 才能使用IP访问(建议在开启CDN之后去除 * 避免IP扫描发现原站IP与匹配的站点)
  4. 协议:HTTP(如果配置了 HTTPS 证书则选择 HTTPS)

配置监听端口

  1. 监听端口:80 和 443(若要开启HTTPS则必须监听443端口)
  2. 确保 Safeline 监听的端口在防火墙中开放

5.3 配置 DNS 解析

将您的域名 your-domain.com 解析到服务器 IP: 您的服务器IP地址

6. 完成 WordPress 安装

  1. 通过 Safeline 访问您的网站:https://your-domain.com或者公网IP
  2. 按照 WordPress 安装向导完成安装
  3. 选择语言、设置站点标题、管理员账号等信息

7. WordPress 安全加固

7.1 修改默认设置

# WordPress 初始化完成后操作
# 进入2.中选择的Wordpress对应根目录下
cd /你的/目录/地址
# 修改默认数据库表前缀
if [ -f "./data/wordpress/html/wp-config.php" ]; then
    sed -i "s/\$table_prefix = 'wp_';/\$table_prefix = 'wp_$(openssl rand -hex 3)_';/" ./data/wordpress/html/wp-config.php
    echo "数据库表前缀已修改"
fi

7.2 设置文件权限

# 设置正确的文件权限
sudo chown -R www-data:www-data ./data/wordpress/html/
sudo find ./data/wordpress/html/ -type d -exec chmod 755 {} \;
sudo find ./data/wordpress/html/ -type f -exec chmod 644 {} \;

8. 验证配置

8.1 检查 Safeline 防护

访问您的网站,确认:

  • 网站正常访问
  • Safeline 的防护功能正常工作
  • 如果需要强制重定向到HTTPS 重定向正常(如果配置了 SSL),可以在wordpress后台配置站点名URL
# 进入WordPress /wp-admin/ 后台-设置-常规命令页面 进行配置
# https://你的网址/wp-admin/options-general.php


WordPress 地址(URL)	https://www.paddysun.top
站点地址(URL)	https://www.paddysun.top

8.2 测试 WordPress 功能

测试以下功能确保正常工作:

  • 文章发布
  • 图片上传
  • 插件安装
  • 主题切换

9. 管理命令

# 停止服务
docker compose down


# 重启服务
docker compose restart


# 查看服务状态
docker compose ps


# 查看日志
docker compose logs wordpress


# 备份数据库
docker compose exec mariadb mysqldump -u root -p wordpress > backup.sql

10.建议(经验之谈

  • 对于个人博客不建议开启safeline Bot防护,开启bot防护也记得将RSS等路径排除。否则博客聚合站点和友站bot机器人无法抓取你的最新文章,别人也无法通过RSS订阅你的文章。
  • 建议开启CC防护这个没影响。
  • 记得定期维护,更新系统、WordPress 核心、主题和插件等。
  • 建议部署完成后创建系统镜像。定期备份。

本文最早发布于 https://www.paddysun.top/,采用 共享-署名-非商用-相同方式共享 4.0 国际许可协议 进行许可。投稿至长亭内容创作者计划,希望能够获得雷池专业版授权体验一下 QaQ。