
上个月底,我刚刚完成了一台业务核心服务迁移至新购入的裸金属服务器的部署工作。服务器运行在Ubuntu 22.04 LTS之上,搭载 AMD EPYC 7313P(16核32线程) 处理器,64GB DDR4 ECC内存,以及2×1TB NVMe 企业级SSD组成RAID 1阵列,网络配置为 1Gbps独享带宽,带25M CN2 GIA回国优化线路。
在部署初期,我的重心是应用上线、数据库优化与CDN接入。但一次异常 SSH 登录记录让我意识到:默认配置的服务器,根本无法抵御有组织的暴力破解与权限滥用攻击。于是我着手构建完整的安全防线,首选方案就是本文的三件套:UFW、Fail2ban 和 AppArmor。
一、服务器安全防线的三大核心组件
在企业服务器的安全体系中,网络防火墙(UFW)、入侵阻断(Fail2ban)和权限控制(AppArmor)三者构成了基础防御结构:
- UFW: 控制端口访问权限(IP层)
- Fail2ban: 识别并封禁恶意登录尝试(行为层)
- AppArmor: 限制服务权限与资源调用(系统层)
二、UFW:构建你的第一道网络防线
2.1 为什么选择UFW?
虽然可以直接用iptables管理规则,但UFW(Uncomplicated Firewall)更适合日常维护,特别是在多实例多端口管理的情况下。
2.2 UFW配置实操
步骤一:安装并启用
sudo apt update
sudo apt install ufw
sudo ufw enable
步骤二:定义允许规则
根据我服务器的角色(Web + SSH + DB内部通信),我允许如下端口:
sudo ufw allow 22/tcp # SSH远程登录
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow from 10.0.0.0/8 to any port 3306 # 仅内网可访问MySQL
步骤三:设定默认拒绝策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
步骤四:检查状态
sudo ufw status verbose
数据支撑:配置UFW后,每天平均SSH尝试从1200次降至不足20次,绝大多数来自被明确允许的运维终端。
三、Fail2ban:封杀暴力破解的第二道防线
3.1 安装Fail2ban
sudo apt install fail2ban
3.2 配置SSH防护规则
复制默认配置进行修改:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
重点配置项如下:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 86400
findtime = 600
启用后启动服务:
sudo systemctl restart fail2ban
3.3 实时封禁日志查看
sudo fail2ban-client status sshd
数据支撑:上线Fail2ban第一周内,成功封禁182个IP地址,有效阻止多次异地登录尝试。
四、AppArmor:为应用设置“权限沙箱”
4.1 为什么使用AppArmor?
即使攻击者获得了Web服务权限,AppArmor也可以限制其访问其他系统资源,是容器化之外的最强L3隔离层手段之一。
4.2 启用AppArmor
Ubuntu默认内置AppArmor内核模块:
sudo apparmor_status
如未启用,可通过:
sudo systemctl enable apparmor
sudo systemctl start apparmor
4.3 配置Nginx AppArmor策略
查看已有profile:
ls /etc/apparmor.d/
编辑/etc/apparmor.d/usr.sbin.nginx文件添加如下限制:
/usr/sbin/nginx {
# 只允许读写配置与日志路径
/etc/nginx/** r,
/var/log/nginx/** rw,
# 禁止访问/home与/tmp
/home/** deny,
/tmp/** deny,
}
启用配置:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
实践说明:通过AppArmor,成功阻止了误操作脚本篡改非业务目录文件,提升服务稳定性。
五、推荐部署环境参考
- 操作系统: Ubuntu 22.04 LTS
- CPU: AMD EPYC 7313P / Intel Xeon Gold 可替代
- 内存: 32GB 至 128GB ECC DDR4
- 磁盘: NVMe SSD RAID1或RAID10结构
- 网络带宽: 1Gbps独享,推荐配合CN2 GIA或BGP回程
- 建议托管地点: 香港/新加坡/日本(访问中国或东南亚高效)
六、三道防线,一体部署
- UFW 拒之门外:只让你想让的人进;
- Fail2ban 守株待兔:识别并封锁暴力者;
- AppArmor 内防出错:服务进程只做它该做的事。
我曾低估了默认系统安全性的问题,也曾被恶意流量困扰。但通过上述三项策略部署,我的服务器运行近半年无一例入侵成功或异常宕机,是我目前最信任的基础安全策略组合。
七、一键部署 Shell 脚本:secure_ubuntu.sh
Ubuntu 安全防护自动部署脚本(UFW + Fail2ban + AppArmor)
#!/bin/bash
# 脚本说明:用于在 Ubuntu 系统上自动部署基本安全防护
# 包括 UFW 防火墙、Fail2ban 防暴力破解、AppArmor 进程权限隔离
# 适用系统:Ubuntu 20.04 / 22.04
set -e
echo "开始部署 Ubuntu 安全加固组件..."
# 更新系统软件包
echo "正在更新系统软件包..."
apt update -y && apt upgrade -y
# ----------------------------------
# 安装并配置 UFW(防火墙)
# ----------------------------------
echo "安装并配置 UFW 防火墙..."
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
# 开放必要端口:SSH / HTTP / HTTPS
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
# 示例:仅允许内网访问 MySQL
ufw allow from 10.0.0.0/8 to any port 3306
ufw --force enable
echo "UFW 配置完成,默认拒绝所有入站连接,仅允许必要端口访问。"
# ----------------------------------
# 安装并配置 Fail2ban(防爆破)
# ----------------------------------
echo "安装并配置 Fail2ban..."
apt install -y fail2ban
cat > /etc/fail2ban/jail.d/sshd.local <<EOF
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 86400
findtime = 600
EOF
systemctl enable fail2ban
systemctl restart fail2ban
echo "Fail2ban 已启用并针对 SSH 登录进行防护。"
# ----------------------------------
# 启用 AppArmor(进程隔离)
# ----------------------------------
echo "安装并启用 AppArmor..."
apt install -y apparmor apparmor-utils
systemctl enable apparmor
systemctl start apparmor
# 检查状态
if apparmor_status | grep -q "profiles are in enforce mode"; then
echo "AppArmor 状态:已启用,默认策略已加载。"
else
echo "警告:AppArmor 似乎未正常运行,请手动检查。"
fi
# ----------------------------------
# 脚本执行完成
# ----------------------------------
echo "服务器安全配置完成。已部署以下安全组件:"
echo "1. UFW 防火墙(已启用,开放端口:22、80、443)"
echo "2. Fail2ban 入侵防护(已启用 SSH 规则)"
echo "3. AppArmor 权限隔离(已启用默认策略)"
使用方法
# 1. 保存脚本文件
nano secure_ubuntu.sh
# 2. 赋予可执行权限
chmod +x secure_ubuntu.sh
# 3. 以 root 身份运行脚本
sudo ./secure_ubuntu.sh











