OpenEuler SSH 防撞库攻击加固操作指南

文档信息

  • 适用系统: openEuler
  • 威胁类型: SSH 暴力破解/撞库攻击
  • 文档版本: 1.0
  • 更新日期: 2026-02-08

一、安全加固核心原则

多层防御策略

  1. 预防: 减少攻击面(改端口、禁root)
  2. 认证: 强化身份验证(密钥替代密码)
  3. 监控: 实时检测异常(fail2ban)
  4. 限制: 控制访问来源(防火墙/IP白名单)
  5. 审计: 定期检查日志

二、基础加固措施

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 变更记录表模板

日期 变更内容 操作人员 影响评估 回滚方案

总结与建议

优先级实施顺序

  1. 立即执行: 修改端口 + 密钥认证 + fail2ban基础配置
  2. 24小时内: 配置防火墙规则 + 日志监控
  3. 一周内: 定期审计脚本 + 备份机制
  4. 长期计划: 考虑2FA + 端口敲门等进阶方案

最低有效配置

如果资源有限,必须配置的三项: 1. 非22端口 2. 密钥认证 3. fail2ban基础防护

定期检查点

  • 每日: 查看关键日志条目
  • 每周: 分析攻击趋势
  • 每月: 全面安全审计
  • 每季度: 更新防护规则

最后提醒: 每次重大配置变更前,务必保持至少一个活动的SSH会话,避免配置错误导致无法远程连接。建议先在测试环境验证,再应用于生产系统。


文档结束 - 定期审查并更新此指南以适应新的安全威胁