OpenEuler SSH 防撞库攻击加固操作指南
文档信息
- 适用系统: openEuler
- 威胁类型: SSH 暴力破解/撞库攻击
- 文档版本: 1.0
- 更新日期: 2026-02-08
一、安全加固核心原则
多层防御策略
- 预防: 减少攻击面(改端口、禁root)
- 认证: 强化身份验证(密钥替代密码)
- 监控: 实时检测异常(fail2ban)
- 限制: 控制访问来源(防火墙/IP白名单)
- 审计: 定期检查日志
二、基础加固措施
2.1 修改SSH默认端口
# 1. 编辑SSH配置文件
sudo vim /etc/ssh/sshd_config
# 2. 修改或添加端口(建议使用1024-65535之间)
Port 2222
# 可选:保留22端口用于过渡,确认新端口可用后再移除
# Port 22
# Port 2222
# 3. 重启SSH服务
sudo systemctl restart sshd
# 4. 验证新端口连接(新建终端窗口测试)
ssh -p 2222 用户名@服务器IP
# 5. 确认新端口可用后,移除Port 22行并再次重启
2.2 禁用root用户SSH登录
# /etc/ssh/sshd_config 中设置
PermitRootLogin no
# 创建普通用户并授予sudo权限作为替代
sudo useradd -m -s /bin/bash 用户名
sudo passwd 用户名
sudo usermod -aG wheel 用户名 # openEuler通常使用wheel组
2.3 启用密钥认证并禁用密码登录
# 客户端生成密钥(在本地计算机执行)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 或使用更安全的ed25519算法
ssh-keygen -t ed25519 -C "your_email@example.com"
# 上传公钥到服务器
ssh-copy-id -p 端口号 用户名@服务器IP
# 服务器配置 /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no # 确认密钥登录正常后再设置为no
ChallengeResponseAuthentication no
UsePAM no
# 重要:保持当前SSH连接,新开终端测试密钥登录
# 确认无误后再重启服务
sudo systemctl restart sshd
2.4 配置SSH超时与连接限制
# /etc/ssh/sshd_config 中添加
ClientAliveInterval 300 # 5分钟发送一次保活消息
ClientAliveCountMax 2 # 客户端2次无响应则断开
MaxAuthTries 3 # 每次连接最多认证尝试次数
MaxSessions 10 # 每个连接最多会话数
三、部署fail2ban主动防御
3.1 安装与基本配置
# 1. 安装fail2ban
sudo dnf install -y fail2ban fail2ban-firewalld fail2ban-systemd
# 2. 创建本地配置文件(避免升级被覆盖)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 3. 创建SSH防护专用配置
sudo vim /etc/fail2ban/jail.d/sshd.local
3.2 SSH防护配置示例
[sshd]
# 启用防护
enabled = true
# 如果修改了SSH端口,需指定实际端口
port = ssh
# 如果修改了端口号,例如2222,则改为:
# port = 2222
# 日志路径(openEuler使用secure日志)
logpath = /var/log/secure
# 封禁策略
maxretry = 5 # 最大尝试次数
findtime = 600 # 统计时间窗口(秒)
bantime = 3600 # 封禁时长(秒)
# 忽略IP(白名单)
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16 10.0.0.0/8
# 使用的过滤器
filter = sshd
# 防护动作(使用firewalld)
banaction = firewallcmd-ipset
action = %(action_mwl)s
3.3 增强防护策略
# 针对频繁攻击者的长期封禁
[sshd-longterm]
enabled = true
filter = sshd
logpath = /var/log/secure
maxretry = 3
findtime = 86400 # 24小时内
bantime = 604800 # 封禁7天
# 只针对之前被封禁过的IP
action = iptables-allports[name=SSH-longterm, blocktype=REJECT]
# 防护无效用户攻击(针对不存在的用户名)
[sshd-invaliduser]
enabled = true
filter = sshd[mode=aggressive]
logpath = /var/log/secure
maxretry = 2
bantime = 86400
3.4 启动与管理服务
# 启动并设置开机自启
sudo systemctl enable --now fail2ban
# 查看服务状态
sudo systemctl status fail2ban
# 查看封禁状态
sudo fail2ban-client status
sudo fail2ban-client status sshd
# 手动封禁/解封IP
sudo fail2ban-client set sshd banip 192.168.1.100
sudo fail2ban-client set sshd unbanip 192.168.1.100
# 查看日志
sudo tail -f /var/log/fail2ban.log
3.5 邮件告警配置(可选)
# 安装邮件工具
sudo dnf install -y mailx
# 编辑fail2ban配置
sudo vim /etc/fail2ban/jail.local
在对应监狱段添加:
action = %(action_)s
sendmail[name=SSH, dest=admin@example.com, sender=fail2ban@yourdomain.com]
四、防火墙访问控制
4.1 使用firewalld限制访问源
# 1. 启用firewalld(如果未启用)
sudo systemctl enable --now firewalld
# 2. 仅允许特定IP访问SSH
sudo firewall-cmd --permanent --remove-service=ssh # 移除默认规则
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="允许的IP/32" port protocol="tcp" port="2222" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="另一个IP/掩码" port protocol="tcp" port="2222" accept'
# 3. 重新加载配置
sudo firewall-cmd --reload
# 4. 查看规则
sudo firewall-cmd --list-all
4.2 应急情况下快速封锁
# 临时封锁IP段
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="攻击IP段/掩码" drop'
# 永久封锁
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="攻击IP段/掩码" drop'
sudo firewall-cmd --reload
五、密码策略强化(如需保留密码登录)
5.1 配置密码复杂度
# 编辑密码策略配置
sudo vim /etc/security/pwquality.conf
# 推荐配置
minlen = 12 # 最小长度
minclass = 3 # 至少包含3种字符类型(大小写、数字、特殊字符)
maxrepeat = 3 # 同一字符最多重复3次
maxsequence = 4 # 最多连续字符数(如abcd)
dictcheck = 1 # 检查字典词汇
usercheck = 1 # 检查用户名相关
enforcing = 1 # 强制执行
5.2 设置密码过期策略
# 编辑登录配置
sudo vim /etc/login.defs
# 修改以下参数
PASS_MAX_DAYS 90 # 密码最长使用天数
PASS_MIN_DAYS 7 # 密码最短使用天数
PASS_MIN_LEN 12 # 密码最小长度
PASS_WARN_AGE 14 # 密码过期前警告天数
六、日志与监控配置
6.1 增强SSH日志记录
# /etc/ssh/sshd_config 配置
LogLevel VERBOSE # 详细日志
PrintLastLog yes # 显示上次登录信息
PrintMotd no # 禁用动态MOTD(减少日志噪音)
# 重启服务生效
sudo systemctl restart sshd
6.2 日志轮转配置
# 确保日志轮转配置
sudo vim /etc/logrotate.d/rsyslog
# 添加或确保包含以下内容
/var/log/secure {
missingok
notifempty
compress
delaycompress
size 100M
weekly
rotate 4
create 0600 root root
postrotate
/usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
6.3 关键监控命令
# 实时监控SSH登录尝试
sudo tail -f /var/log/secure | grep -E "(Failed|Accepted|Invalid)"
# 统计失败登录
sudo grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
# 查看当前SSH连接
sudo netstat -tnpa | grep :22
# 或使用ss命令
sudo ss -tnp | grep :2222
# 检查fail2ban封禁列表
sudo fail2ban-client status sshd | grep "Banned IP list"
七、定期维护与审计
7.1 安全审计清单
# 每月执行一次的安全检查
#!/bin/bash
echo "=== SSH安全审计报告 ==="
echo "生成时间: $(date)"
echo ""
# 1. 检查SSH配置
echo "1. SSH配置检查:"
sudo sshd -t
echo ""
# 2. 检查失败登录
echo "2. 近期失败登录统计:"
sudo grep "Failed password" /var/log/secure* | wc -l
echo ""
# 3. 检查封禁IP
echo "3. 当前封禁IP:"
sudo fail2ban-client status sshd | grep "Banned"
echo ""
# 4. 检查异常登录时间
echo "4. 非工作时间登录记录:"
sudo grep "Accepted" /var/log/secure | grep -E "(22:[0-5]|0[0-6]:)"
echo ""
# 5. 检查系统更新
echo "5. 安全更新检查:"
sudo dnf check-update openssh-server fail2ban
7.2 应急响应流程
发现攻击时的步骤:
1. 立即检查: sudo tail -f /var/log/secure
2. 临时封锁:
```bash
# 使用firewalld临时封锁
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="攻击IP" drop'
# 或使用fail2ban
sudo fail2ban-client set sshd banip 攻击IP
3. **分析来源**:bash
whois 攻击IP
curl ipinfo.io/攻击IP
```
4. 调整策略: 根据攻击模式调整fail2ban参数
5. 文档记录: 记录攻击时间、IP、类型和响应措施
八、进阶防护选项
8.1 双因素认证(2FA)
# 安装Google Authenticator
sudo dnf install -y google-authenticator
# 为用户配置
google-authenticator
# 配置SSH使用PAM + Google Authenticator
# 编辑 /etc/pam.d/sshd
auth required pam_google_authenticator.so
# 编辑 /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
8.2 端口敲门(Port Knocking)
# 使用knockd实现隐蔽端口
sudo dnf install -y knock-server
# 配置 /etc/knockd.conf
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
tcpflags = syn
九、恢复与故障排除
9.1 被锁定后的恢复方法
# 如果被误封或配置错误导致无法连接:
# 方法1:通过控制台登录(物理/VNC)
# 方法2:通过其他未封禁IP连接
# 方法3:临时禁用fail2ban
sudo systemctl stop fail2ban
sudo firewall-cmd --reload
# 检查并修复配置后重新启用
sudo systemctl start fail2ban
9.2 常见问题解决
Q: 修改配置后无法连接SSH
# 检查配置语法
sudo sshd -t
# 查看详细错误日志
sudo journalctl -u sshd -f
# 回滚配置
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo systemctl restart sshd
Q: fail2ban不生效
# 检查日志路径是否正确
sudo ls -la /var/log/secure
# 测试过滤器
sudo fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
# 重新加载配置
sudo fail2ban-client reload
十、配置备份与文档
10.1 重要配置文件备份
#!/bin/bash
# 备份脚本
BACKUP_DIR="/root/ssh_security_backup_$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
cp -p /etc/ssh/sshd_config $BACKUP_DIR/
cp -p /etc/fail2ban/jail.local $BACKUP_DIR/
cp -p /etc/fail2ban/jail.d/sshd.local $BACKUP_DIR/
cp -p /etc/firewalld/zones/public.xml $BACKUP_DIR/
# 打包备份
tar -czf /root/ssh_security_backup.tar.gz $BACKUP_DIR
10.2 变更记录表模板
| 日期 | 变更内容 | 操作人员 | 影响评估 | 回滚方案 |
|---|---|---|---|---|
总结与建议
优先级实施顺序
- 立即执行: 修改端口 + 密钥认证 + fail2ban基础配置
- 24小时内: 配置防火墙规则 + 日志监控
- 一周内: 定期审计脚本 + 备份机制
- 长期计划: 考虑2FA + 端口敲门等进阶方案
最低有效配置
如果资源有限,必须配置的三项: 1. 非22端口 2. 密钥认证 3. fail2ban基础防护
定期检查点
- 每日: 查看关键日志条目
- 每周: 分析攻击趋势
- 每月: 全面安全审计
- 每季度: 更新防护规则
最后提醒: 每次重大配置变更前,务必保持至少一个活动的SSH会话,避免配置错误导致无法远程连接。建议先在测试环境验证,再应用于生产系统。
文档结束 - 定期审查并更新此指南以适应新的安全威胁