最后更新于:2026年7月

你的 Ubuntu 服务器还在用密码登录 SSH 吗? 一台刚装好的 Ubuntu 24.04 服务器,如果不做任何加固,上线 24 小时内平均会收到 8000+ 次 SSH 暴力破解尝试。这不是危言耸听——用 journalctl -u ssh --since "24 hours ago" | grep "Failed" | wc -l 看看你就知道了。
Ubuntu 24.04 LTS(Noble Numbat)带来了不少安全方面的改进,但默认配置仍然偏重"易用性"而非"安全性"。本文是一份可执行的加固清单——15 分钟,从头到尾跟着做,把你的服务器从"裸奔"变成"堡垒"。
【与通用 VPS 加固的区别】 本文专门针对 Ubuntu 24.04 LTS 的特有功能(如 AppArmor 增强、unattended-upgrades 新配置、systemd-resolved 安全选项等),是 VPS 安全加固通用指南 的 Ubuntu 专属补充。
一、加固前的准备:基线检查
1.1 确认系统版本
lsb_release -a
# 确认输出包含 Ubuntu 24.04 LTS
uname -r
# 确认内核版本 6.8+1.2 创建非 root 管理用户
永远不要用 root 直接操作。 创建一个有 sudo 权限的普通用户:
# 创建新用户(替换 yourname)
adduser yourname
# 赋予 sudo 权限
usermod -aG sudo yourname
# 切换到新用户测试
su - yourname
sudo whoami
# 输出 root 说明 sudo 权限正常1.3 更新系统到最新
apt update && apt upgrade -y
apt autoremove -y二、SSH 安全加固(最重要)
SSH 是服务器的大门,也是攻击者最常尝试的入口。
2.1 配置 SSH 密钥登录
在你的本地电脑(不是服务器)生成密钥对:
# 本地执行
ssh-keygen -t ed25519 -C "your_email@example.com"
# ed25519 比 RSA 更短更快更安全上传公钥到服务器:
# 本地执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@服务器IP测试密钥登录(不断开当前连接,另开一个终端):
ssh yourname@服务器IP
# 如果不需要输密码就能登录,说明密钥配置成功2.2 禁用密码登录和 root 登录
确认密钥登录正常后,修改 SSH 配置:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config修改以下配置项:
# 禁用 root 登录
PermitRootLogin no
# 禁用密码登录
PasswordAuthentication no
# 禁用空密码
PermitEmptyPasswords no
# 限制最大认证尝试次数
MaxAuthTries 3
# 登录超时时间(秒)
LoginGraceTime 30
# 空闲超时自动断开(秒)
ClientAliveInterval 300
ClientAliveCountMax 2
# 禁用 X11 转发(如不需要)
X11Forwarding no
# 只允许指定用户登录
AllowUsers yournameUbuntu 24.04 还有一个额外的配置文件可能覆盖设置:
# 检查并修改 override 文件
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
# 确保里面没有 PasswordAuthentication yes重启 SSH 服务:
sudo systemctl restart ssh⚠️ 重要! 修改 SSH 配置前,保持当前连接不断开,另开一个终端测试新配置。如果新连接进不去,还能用旧连接改回来。
2.3 修改 SSH 默认端口(可选但推荐)
改掉默认的 22 端口可以挡掉 99% 的自动扫描:
sudo nano /etc/ssh/sshd_config
# 修改
Port 22222 # 换成一个高位端口(1024-65535)先在防火墙放行新端口:
sudo ufw allow 22222/tcp然后重启 SSH:
sudo systemctl restart ssh之后连接时指定端口:
ssh -p 22222 yourname@服务器IP2.4 SSH 配置速查表
| 配置项 | 推荐值 | 作用 |
|---|---|---|
PermitRootLogin |
no |
禁止 root 直接登录 |
PasswordAuthentication |
no |
禁止密码登录 |
Port |
22222 等高位端口 |
避免自动扫描 |
MaxAuthTries |
3 |
限制尝试次数 |
ClientAliveInterval |
300 |
空闲 5 分钟断开 |
AllowUsers |
yourname |
白名单用户 |
三、UFW 防火墙配置
Ubuntu 24.04 默认安装了 UFW(Uncomplicated Firewall),但可能没有启用。
3.1 基础配置
# 设置默认策略:拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 放行 SSH(如果你改了端口,用新端口)
sudo ufw allow 22222/tcp comment 'SSH'
# 放行 HTTP/HTTPS(如果是 Web 服务器)
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
# 启用防火墙
sudo ufw enable
# 查看状态
sudo ufw status verbose3.2 限制连接频率
UFW 支持限速功能,防止暴力扫描:
# 限制 SSH:每个 IP 每 30 秒最多 6 次连接
sudo ufw limit 22222/tcp
# 限制其他敏感端口
sudo ufw limit 443/tcp3.3 按来源 IP 限制(更安全)
如果你有固定 IP,可以只允许自己的 IP 访问 SSH:
# 只允许指定 IP 访问 SSH
sudo ufw allow from 你的IP to any port 22222 proto tcp
# 删除之前的开放规则
sudo ufw delete allow 22222/tcp3.4 常用服务端口放行参考
| 服务 | 端口 | 协议 | UFW 命令 |
|---|---|---|---|
| SSH | 22222 | TCP | ufw allow 22222/tcp |
| HTTP | 80 | TCP | ufw allow 80/tcp |
| HTTPS | 443 | TCP | ufw allow 443/tcp |
| DNS | 53 | TCP+UDP | ufw allow 53 |
| TUIC/Hysteria2 | 自定义 | UDP | ufw allow 端口/udp |
| WireGuard | 51820 | UDP | ufw allow 51820/udp |
| V2Ray/Clash | 自定义 | TCP | ufw allow 端口/tcp |
原则:只开放需要的端口,用完即关。不确定的端口不要开。
四、Fail2ban:自动封禁恶意 IP
4.1 安装与配置
sudo apt install fail2ban -yFail2ban 的配置不要直接改 jail.conf,而是创建本地配置:
sudo nano /etc/fail2ban/jail.local[DEFAULT]
# 封禁时间(秒),1小时
bantime = 3600
# 检测时间窗口(秒),10分钟
findtime = 600
# 最大失败次数
maxretry = 3
# 封禁动作
banaction = ufw
# 忽略本地 IP
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16 10.0.0.0/8
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400 # SSH 封禁 24 小时启动服务:
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban4.2 查看封禁状态
# 查看所有 jail 状态
sudo fail2ban-client status
# 查看 SSH 详细状态
sudo fail2ban-client status sshd
# 手动解封某个 IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
# 手动封禁某个 IP
sudo fail2ban-client set sshd banip 1.2.3.44.3 进阶:递增封禁时间
对屡教不改的 IP,可以配置递增封禁:
[DEFAULT]
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 604800 # 最长封禁 7 天这样第一次封 1 小时,第二次封 2 小时,第三次封 4 小时…递增翻倍。
五、自动安全更新
Ubuntu 24.04 默认安装了 unattended-upgrades,但需要确认配置。
5.1 检查并启用
sudo apt install unattended-upgrades apt-listchanges -y
sudo dpkg-reconfigure -plow unattended-upgrades
# 选择 Yes5.2 配置更新策略
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades确认以下配置:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
// 自动重启(如果更新需要)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
// 自动清理旧内核
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";5.3 测试自动更新
# 模拟运行(不会真的更新)
sudo unattended-upgrade --dry-run -v
# 手动触发一次
sudo unattended-upgrade -v建议: 安全更新自动安装,但大版本升级(如 24.04 → 26.04)一定要手动操作。
六、AppArmor 强制访问控制
Ubuntu 24.04 默认启用 AppArmor,但很多人不知道怎么用。
6.1 检查 AppArmor 状态
sudo apparmor_status输出应该显示 apparmor module is loaded 和多个已加载的 profile。
6.2 为自定义服务创建 AppArmor Profile
以保护一个自定义服务为例:
# 生成 profile 模板
sudo aa-genprof /usr/local/bin/your-serviceAppArmor 会进入交互模式,根据提示选择允许的操作。
6.3 常用 AppArmor 命令
# 查看所有 profile
sudo aa-status
# 设置 profile 为投诉模式(只记录不阻止,用于测试)
sudo aa-complain /usr/local/bin/your-service
# 设置为强制模式(阻止违规操作)
sudo aa-enforce /usr/local/bin/your-service
# 查看 AppArmor 日志
sudo dmesg | grep apparmor
sudo journalctl -k | grep apparmor实用建议: 如果你不确定某个服务的 profile 是否正确,先用 complain 模式运行几天,看日志没有问题后再切到 enforce 模式。
七、入侵检测与日志审计
7.1 安装 AIDE(文件完整性检查)
AIDE(Advanced Intrusion Detection Environment)会监控关键文件是否被篡改。
sudo apt install aide -y
# 初始化数据库(需要几分钟)
sudo aideinit
# 安装数据库
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 手动检查
sudo aide --check加入定时任务:
# 每天凌晨 3 点检查文件完整性
echo "0 3 * * * root /usr/bin/aide --check | mail -s 'AIDE Report' yourname@localhost" | sudo tee /etc/cron.d/aide7.2 配置日志审计
sudo apt install auditd -y
# 审计 SSH 配置文件修改
sudo auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config_change
# 审计 sudo 使用
sudo auditctl -w /var/log/sudo.log -p wa -k sudo_usage
# 审计用户创建/删除
sudo auditctl -w /etc/passwd -p wa -k user_modify
sudo auditctl -w /etc/group -p wa -k group_modify
sudo auditctl -w /etc/shadow -p wa -k shadow_modify
# 查看审计日志
sudo ausearch -k ssh_config_change
sudo ausearch -k user_modify让审计规则永久生效:
sudo nano /etc/audit/rules.d/audit.rules
# 把上面的 auditctl 命令去掉 sudo 和 auditctl,只保留参数部分
# 例如:-w /etc/ssh/sshd_config -p wa -k ssh_config_change
sudo systemctl restart auditd7.3 关键日志位置速查
| 日志文件 | 内容 |
|---|---|
/var/log/auth.log |
SSH 登录、sudo 使用、用户创建 |
/var/log/syslog |
系统日志 |
/var/log/ufw.log |
防火墙日志 |
/var/log/fail2ban.log |
Fail2ban 封禁记录 |
/var/log/audit/audit.log |
审计日志 |
/var/log/unattended-upgrades/ |
自动更新日志 |
journalctl -u 服务名 |
systemd 服务日志 |
7.4 快速排查命令
# 查看最近登录成功记录
last -20
# 查看最近登录失败记录
sudo lastb -20
# 查看当前登录用户
who
# 查看可疑的 SUID 文件
sudo find / -perm -4000 -type f 2>/dev/null
# 查看最近修改的文件(24小时内)
sudo find /etc /usr/local/bin /opt -mtime -1 -type f 2>/dev/null
# 查看异常网络连接
sudo ss -tunlp
sudo netstat -anp | grep ESTABLISHED八、其他加固措施
8.1 禁用不必要的服务
# 查看所有运行的服务
sudo systemctl list-unit-files --type=service --state=enabled
# 禁用不需要的服务(举例)
sudo systemctl disable --now snapd # 如果不用 snap
sudo systemctl disable --now apport # 关闭错误报告
sudo systemctl disable --now modemmanager # 服务器不需要调制解调器8.2 内核参数加固
sudo nano /etc/sysctl.d/99-security.conf# 禁用 IP 转发(如果不是路由器)
net.ipv4.ip_forward = 0
# 防 SYN Flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# 禁用 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 禁用 ping(可选,防探测)
# net.ipv4.icmp_echo_ignore_all = 1
# 忽略 ICMP 广播
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 记录可疑数据包
net.ipv4.conf.all.log_martians = 1sudo sysctl -p /etc/sysctl.d/99-security.conf8.3 配置时间同步
# Ubuntu 24.04 默认用 systemd-timesyncd
sudo timedatectl set-ntp true
timedatectl status时间准确对日志审计和证书验证非常重要。
8.4 安装 Rootkit 检测
sudo apt install rkhunter chkrootkit -y
# 更新数据库
sudo rkhunter --update
sudo rkhunter --propupd
# 扫描
sudo rkhunter --check
sudo chkrootkit加入定时任务:
# 每周扫描一次
echo "0 4 * * 0 root /usr/bin/rkhunter --check --sk --report-warnings-only | mail -s 'Rkhunter Report' yourname@localhost" | sudo tee /etc/cron.d/rkhunter九、一键加固脚本
把上面的步骤整合成一个脚本,新服务器上线时一键执行:
#!/bin/bash
# Ubuntu 24.04 安全加固脚本
# 使用方法:sudo bash harden.sh
set -e
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'
echo_step() {
echo -e "${GREEN}[✓]${NC} $1"
}
echo_error() {
echo -e "${RED}[✗]${NC} $1"
}
# 检查 root 权限
if [ "$EUID" -ne 0 ]; then
echo_error "请用 sudo 运行此脚本"
exit 1
fi
# 1. 系统更新
echo "=== 1. 系统更新 ==="
apt update && apt upgrade -y
apt autoremove -y
echo_step "系统已更新"
# 2. 安装安全工具
echo "=== 2. 安装安全工具 ==="
apt install -y fail2ban ufw unattended-upgrades auditd rkhunter
echo_step "安全工具已安装"
# 3. 配置 UFW 防火墙
echo "=== 3. 配置防火墙 ==="
ufw default deny incoming
ufw default allow outgoing
ufw limit 22/tcp comment 'SSH'
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
yes | ufw enable
echo_step "防火墙已启用"
# 4. 配置 Fail2ban
echo "=== 4. 配置 Fail2ban ==="
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = ufw
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
EOF
systemctl enable fail2ban
systemctl restart fail2ban
echo_step "Fail2ban 已配置"
# 5. 内核参数加固
echo "=== 5. 内核参数加固 ==="
cat > /etc/sysctl.d/99-security.conf << 'EOF'
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.log_martians = 1
EOF
sysctl -p /etc/sysctl.d/99-security.conf
echo_step "内核参数已加固"
# 6. 配置自动安全更新
echo "=== 6. 配置自动更新 ==="
cat > /etc/apt/apt.conf.d/20auto-upgrades << 'EOF'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
EOF
echo_step "自动更新已配置"
# 7. 审计规则
echo "=== 7. 配置审计规则 ==="
cat > /etc/audit/rules.d/hardening.rules << 'EOF'
-w /etc/ssh/sshd_config -p wa -k ssh_config_change
-w /etc/passwd -p wa -k user_modify
-w /etc/group -p wa -k group_modify
-w /etc/shadow -p wa -k shadow_modify
-w /etc/sudoers -p wa -k sudoers_modify
EOF
systemctl restart auditd
echo_step "审计规则已配置"
# 8. 时间同步
echo "=== 8. 配置时间同步 ==="
timedatectl set-ntp true
echo_step "时间同步已启用"
echo ""
echo "========================================"
echo " 安全加固完成!"
echo "========================================"
echo ""
echo "接下来请手动完成:"
echo "1. 配置 SSH 密钥登录"
echo "2. 禁用密码登录(修改 /etc/ssh/sshd_config)"
echo "3. 修改 SSH 默认端口"
echo "4. 创建非 root 管理用户"
echo "5. 初始化 AIDE 数据库:sudo aideinit"
echo ""十、加固检查清单
完成所有步骤后,用这个清单检查:
SSH 安全
- 已配置 SSH 密钥登录
- 已禁用密码登录(
PasswordAuthentication no) - 已禁用 root 登录(
PermitRootLogin no) - 已修改默认端口(22 → 高位端口)
- 已设置
MaxAuthTries 3 - 已配置
AllowUsers白名单
防火墙
- UFW 已启用
- 默认策略为 deny incoming
- 只开放必要端口
- SSH 端口已设置限速(
ufw limit)
入侵防护
- Fail2ban 已启用
- SSH jail 已配置
- 封禁时间合理(至少 1 小时)
系统更新
- unattended-upgrades 已启用
- 安全更新自动安装
- 旧内核自动清理
监控审计
- AIDE 已初始化
- auditd 规则已配置
- 知道关键日志位置
- rkhunter 已安装
其他
- 内核参数已加固
- 不必要的服务已禁用
- 时间同步已启用
- 非 root 用户已创建
【相关推荐】
- VPS 安全加固通用指南 - 通用版加固教程
- Linux 防火墙端口管理 - UFW/iptables 详解
- Proxmox VE 备份恢复指南 - 虚拟机数据安全
- 节点存活检测手册 - 节点健康监控
安全加固不是一劳永逸的事,而是一个持续的过程。建议每季度做一次安全审计,检查是否有新的风险。先把这份指南过一遍,你的服务器安全等级就能超过 90% 的个人项目了。🚀