前言
根据统计,一台暴露在公网的Linux服务器,平均每天会遭受数千次SSH暴力破解尝试。本文从实战角度,系统讲解Linux服务器安全加固的完整方案。
一、SSH安全加固
1.1 禁用root直接登录
风险:root账号权限最高,一旦被破解后果严重
加固方案:
# 创建普通用户
useradd -m -s /bin/bash admin
passwd admin
# 添加sudo权限
echo "admin ALL=(ALL:ALL) ALL" >> /etc/sudoers
# 禁用root登录
sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
1.2 修改默认SSH端口
风险:22端口是黑客扫描器的首要目标
加固方案:
# 修改为随机端口(如 23456)
sed -i 's/^#Port 22/Port 23456/' /etc/ssh/sshd_config
# 防火墙放行新端口
ufw allow 23456/tcp
ufw delete allow 22/tcp
systemctl restart sshd
1.3 禁用密码登录,强制密钥认证
风险:密码可被暴力破解,密钥几乎无法破解
加固方案:
# 本地生成密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"
# 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@server_ip
# 禁用密码登录
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd
二、自动化防御:fail2ban
2.1 安装配置
# 安装
apt install fail2ban -y
# 配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 23456
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
systemctl restart fail2ban
2.2 查看封禁状态
# 查看被封IP
fail2ban-client status sshd
# 手动解封
fail2ban-client set sshd unbanip 1.2.3.4
三、防火墙配置
3.1 UFW基础配置
# 启用防火墙
ufw enable
# 默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing
# 只开放必要端口
ufw allow 23456/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
# 查看规则
ufw status numbered
四、系统安全加固
4.1 内核参数优化
# /etc/sysctl.conf 添加
# 防止SYN洪水攻击
net.ipv4.tcp_syncookies = 1
# 忽略ICMP ping请求
net.ipv4.icmp_echo_ignore_all = 1
# 防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
# 应用配置
sysctl -p
4.2 定期更新系统
# 自动安全更新
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
五、日志审计与监控
5.1 登录日志监控
# 查看SSH登录记录
last -a
# 查看失败登录
lastb
# 实时监控登录尝试
tail -f /var/log/auth.log | grep sshd
5.2 异常检测脚本
#!/bin/bash
# 检测异常登录尝试
THRESHOLD=100
COUNT=$(grep "Failed password" /var/log/auth.log | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
echo "⚠️ 检测到 $COUNT 次失败登录尝试!" | mail -s "安全告警" admin@example.com
fi
六、安全检查清单
#!/bin/bash
# 安全检查脚本
echo "=== SSH配置检查 ==="
grep "^PermitRootLogin" /etc/ssh/sshd_config
grep "^PasswordAuthentication" /etc/ssh/sshd_config
grep "^Port" /etc/ssh/sshd_config
echo "=== 防火墙状态 ==="
ufw status
echo "=== fail2ban状态 ==="
fail2ban-client status
echo "=== 最近登录记录 ==="
last -10
echo "=== 失败登录统计 ==="
lastb | wc -l
总结
| 防护层级 | 措施 | 难度 |
|---|---|---|
| 基础 | 改端口+禁root+密钥登录 | ⭐ |
| 进阶 | fail2ban+防火墙+日志监控 | ⭐⭐ |
| 高级 | 堡垒机+IDS+SELinux | ⭐⭐⭐ |
记住:安全加固不是一次性工作,需要持续监控和更新。