Web 安全加固与高可用实验手册
1 安全加固实践
1.1 环境梳理
1.1.1 常见端口清单
标准业务端口对照表(Web 服务全栈)
| 服务组件 | 默认端口 | 网络访问层级 | 访问可信源范围 | 安全风险等级 |
|---|---|---|---|---|
| SSH 远程管理 | 22 | 管理内网 | 仅运维管理段 10.0.0.0/24 | 高危(公网暴露易暴力破解) |
| Nginx 反向代理 | 80/443 | 公网入口 | 全网 0.0.0.0/0 | 中危(暴露公网,存在 CC、注入攻击) |
| SpringBoot 后端业务 | 8080/9090 | 内网服务层 | 仅 Nginx 宿主机 IP | 中危(禁止公网直接访问) |
| MySQL 数据库 | 3306 | 数据层内网 | 仅后端服务网段 | 高危(公网暴露会拖库、暴力破解) |
| Redis 缓存 | 6379 | 缓存内网 | 仅后端服务网段 | 高危(无认证 Redis 可被远程写入木马) |
| VXLAN 隧道(集群互通) | UDP 4789 | 宿主机底层 | 仅集群宿主机网段 | 中危(防止外网伪造隧道报文渗透内网) |
端口分层访问边界定义
- 公网可直接开放端口:仅 80、443(Nginx),其余所有端口禁止对公网放行。
- 内网服务端口:8080、3306、6379,仅允许业务内网段互访。
- 管理端口:22、4789,仅运维宿主机集群网段放行。
- 本地进程端口:仅监听 127.0.0.1,不对外网卡暴露。
1.1.2 最小开放端口安全原则
1 默认拒绝基线原则
所有链默认策略设置为 DROP,未显式放行的流量全部丢弃,杜绝隐式放行带来的安全漏洞,不使用 ACCEPT 作为默认策略。
2 按需最小放行原则
- 只开放业务运行必须的端口,下线、废弃业务端口立即删除放行规则。
- 对内网服务端口(MySQL/Redis/SpringBoot),限制源 IP 网段,不允许全网访问。
- 管理端口 SSH 严格限制运维内网源,禁止 0.0.0.0/0 全网放行。
3 分层隔离访问原则
- 公网层:仅放行 80/443,其余全部拦截。
- 业务内网层:后端、数据库、缓存仅互相访问。
- 管理层:SSH、VXLAN 隧道仅运维集群网段互通。
4 禁止全端口泛洪原则
不使用 --dport 0:65535、不开放所有 ICMP,仅保留业务必要流量;限制 ICMP 类型,屏蔽扫描类 ICMP 报文。
6 规则持久化原则
所有 iptables 规则写入持久化工具,服务器重启后策略不丢失,杜绝临时规则失效带来的安全缺口。
1.1.3 实验环境准备
部署 ruoyi_vue 环境脚本都在【scripts】目录里面。
安装 ruoyi_vue 环境:
/bin/bash onekey_install_ruoyi_ubuntu24.sh
开放 Actuator 功能:
/bin/bash update_actuator_ruoyi_ubuntu24.sh
1.2 安全加固配置 [了解]
1.2.1 防火墙规则配置
定制防火墙规则:
# 本地网段:SSH/MySQL/Redis/VXLAN 统一放行来源
LOCAL_NET="10.0.0.0/24"
# 清空现有 filter 表规则
iptables -F
# 放行 lo 和已建立的连接规则
# 老版本 iptables 用 -m state --state,现在推荐使用 -m conntrack --ctstate
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 放行 22 本地连接规则
iptables -A INPUT -p tcp --dport 22 -s ${LOCAL_NET} -j ACCEPT
# 放行 80 和 443 外部访问规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 数据库环境仅允许本地网段主机访问
iptables -A INPUT -p tcp --dport 3306 -s ${LOCAL_NET} -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -s ${LOCAL_NET} -j ACCEPT
# 允许 vxlan 主机环境访问
iptables -A INPUT -p udp --dport 4789 -s ${LOCAL_NET} -j ACCEPT
# 默认策略收紧
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
防火墙规则持久化:
[root@ubuntu24-19 ~ ]# DEBIAN_FRONTEND=noninteractive apt install -y iptables-persistent
[root@ubuntu24-19 ~ ]# iptables-save > /etc/iptables/rules.v4
1.2.2 备份应用配置
准备备份目录:
mkdir -p hardening_backup_$(date +%F)
备份文件【mysql 部分暂不关心】:
BK=/root/hardening_backup_$(date +%F)
cp -a /etc/nginx /etc/redis/redis.conf "$BK/"
cp -a /root/RuoYi-Vue/ruoyi-admin/src/main/resources/application*.yml "$BK/"
cp -a /etc/iptables/rules.v4 "$BK/"
确认效果:
ls "$BK/"
1.2.3 MySQL 安全加固
mysql 环境监听安全:
[root@ubuntu24-19 ~ ]# vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1,10.0.0.19
mysqlx-bind-address = 127.0.0.1,10.0.0.19
[root@ubuntu24-19 ~ ]# systemctl restart mysql.service
用户安全【如果出现 root@%,清理掉】:
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
...
| root | localhost |
| ruoyi | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)
# root 用户登录安全
alter user root@localhost identified by 'Magedu@2026';
# ruoyi 用户使用安全
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'ruoyi'@'localhost';
GRANT SELECT,INSERT,UPDATE,DELETE ON ry_vue.* TO 'ruoyi'@'localhost';
CREATE USER IF NOT EXISTS 'ruoyi_dev'@'10.0.0.%' IDENTIFIED BY 'Ruoyi@123';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,ALTER,INDEX ON ry_vue.* TO 'ruoyi_dev'@'10.0.0.%';
FLUSH PRIVILEGES;
1.2.4 Redis 安全加固
redis 环境监听安全:
[root@ubuntu24-19 ~ ]# vim /etc/redis/redis.conf
# 监听内部和专用的地址
bind 127.0.0.1 10.0.0.19
# 开启保护模式
protected-mode yes
requirepass "Redis@2026"
# 禁用敏感命令
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command DEBUG ""
# 危险键操作,线上可按需改名
rename-command KEYS "KEYS_123456"
rename-command CONFIG "CONFIG_123456"
重启服务:
[root@ubuntu24-19 ~ ]# systemctl restart redis
1.2.5 Nginx 安全加固
Nginx 默认开启版本号回显、开启目录浏览功能。攻击者可通过响应头获取 Nginx 具体版本,针对性搜索版本漏洞。
cat > /etc/nginx/conf.d/security.conf <<'EOF'
server_tokens off;
autoindex off;
EOF
目录浏览会泄露网站目录结构、源码、配置文件,造成信息泄露。
chown -R www-data:www-data /data/ruoyi/web
find /data/ruoyi/web -type d -exec chmod 755 {} \;
find /data/ruoyi/web -type f -exec chmod 644 {} \;
重启 nginx 配置:
nginx -t && systemctl reload nginx
1.2.6 Actuator 安全加固
生产环境仅保留健康检查端点用于监控告警,关闭所有敏感信息端点。
[root@ubuntu24-19 ~ ]# cd RuoYi-Vue/
[root@ubuntu24-19 RuoYi-Vue ]# vim ruoyi-admin/src/main/resources/application.yml
...
# ========= Actuator 监控配置(独立端口 8091,仅本机访问) =========
management:
endpoints:
web:
base-path: /actuator # 默认 Actuator 端点的访问路径前缀
exposure:
include: 'health,metrics' # 暴露所有端点,推荐改为 health,metrics
endpoint:
health:
show-details: never # 健康检查显示详情
server:
port: 8091 # actuator 单独端口,不能和 ruoyi 的 server.port 重复
address: 127.0.0.1 # 只允许本机访问
打包项目确认效果:
# 版本打包
[root@ubuntu24-19 RuoYi-Vue ]# mvn clean package -DskipTests
# 运行项目
[root@ubuntu24-19 RuoYi-Vue ]# cp ruoyi-admin/target/ruoyi-admin.jar /data/ruoyi/server/
[root@ubuntu24-19 RuoYi-Vue ]# systemctl restart ruoyi-admin.service
2 keepalived 实践
2.1 环境部署
2.1.1 keepalived 部署
定制环境部署脚本 keepalived_install.sh【在 scripts 目录下】。
master 节点部署
[root@ubuntu24-13 ~ ]# /bin/bash keepalived_install.sh
当前节点的角色(MASTER|BACKUP): MASTER # 输入 MASTER
[2026-07-19 19:50:49] 开始基本环境定制
...
# 最好重启一下主机
[root@ubuntu24-13 ~ ]# systemctl restart keepalived
backup 节点部署
[root@ubuntu24-16 ~ ]# /bin/bash keepalived_install.sh
当前节点的角色(MASTER|BACKUP): BACKUP
...
# 最好重启一下主机
[root@ubuntu24-16 ~ ]# systemctl restart keepalived
2.1.2 RS 主机部署
定制一键部署 Ruoyi-vue 环境脚本 install_ruoyi_ubuntu24.sh【文件在 scripts 目录下】。
定制专属脚本 lvs_dr_backend_server.sh【文件在 scripts 目录下】。
RS1 部署 ruoyi-vue 应用
[root@ubuntu24-19 ~ ]# /bin/bash install_ruoyi_ubuntu24.sh
# 定制额外的 nginx 测试页面
[root@ubuntu24-19 ~ ]# echo '10.0.0.19 nginx-RS1' > /data/ruoyi/web/dist/test.html
# lvs dr 模式的环境配置
[root@ubuntu24-19 ~ ]# /bin/bash lvs_dr_backend_server.sh start
The RS Server is Ready!
RS2 部署 ruoyi-vue 应用
[root@ubuntu24-22 ~ ]# /bin/bash install_ruoyi_ubuntu24.sh
# 定制额外的 nginx 测试页面
[root@ubuntu24-22 ~ ]# echo '10.0.0.22 nginx-RS2' > /data/ruoyi/web/dist/test.html
# lvs dr 模式的环境配置
[root@ubuntu24-22 ~ ]# scp lvs_dr_backend_server.sh root@10.0.0.22:
2.1.3 keepalived 配置
master 节点配置 [只显示主要的配置]
vrrp_instance VI_1 {
state MASTER
interface ens37
virtual_router_id 50
priority 100
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:1
}
}
virtual_server 10.0.0.100 80 {
delay_loop 2
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.19 80 {
}
real_server 10.0.0.22 80 {
}
}
[root@ubuntu24-13 ~ ]# systemctl restart keepalived
backup 节点配置 [只显示主要的配置]
vrrp_instance VI_1 {
state BACKUP
interface ens37
virtual_router_id 50
priority 99
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:1
}
}
virtual_server 10.0.0.100 80 {
delay_loop 2
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.19 80 {
}
real_server 10.0.0.22 80 {
}
}
[root@ubuntu24-16 ~ ]# systemctl restart keepalived
评论