Linux服务器SSH安全加固与暴力破解防护实战配置

SSH暴力破解仍是服务器安全头号威胁

服务器安全加固的第一道防线是SSH访问控制。根据公开蜜罐数据,一台公网暴露22端口的Linux服务器平均每分钟遭受超过50次暴力破解尝试,弱密码机器被攻破的平均时间不到8小时。暴力破解成功后攻击者通常植入挖矿木马、建立持久化后门、横向移动内网,造成的损失远超服务器本身价值。

本文从SSH服务配置、认证策略、入侵检测三个层面,给出一套可直接落地的服务器安全加固方案。

SSH服务端核心安全配置

编辑/etc/ssh/sshd_config,逐项调整以下参数:

# 禁止root直接登录
PermitRootLogin no

# 禁用密码认证,仅允许密钥
PasswordAuthentication no
PubkeyAuthentication yes

# 限制可登录用户组
AllowGroups ssh-users

# 修改默认端口(降低自动扫描命中率)
Port 2222

# 禁用空密码
PermitEmptyPasswords no

# 限制认证尝试次数
MaxAuthTries 3

# 登录超时断开
LoginGraceTime 30

# 禁用不安全的转发功能
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no

# 会话超时自动断开
ClientAliveInterval 300
ClientAliveCountMax 2

# 仅允许SSH协议版本2
Protocol 2

修改后执行sshd -t验证配置语法无误,再systemctl reload sshd生效。

密钥认证配置

客户端生成密钥对:

ssh-keygen -t ed25519 -C "deploy@prod-server" -f ~/.ssh/id_ed25519_prod

推荐ed25519而非RSA,同等安全强度下密钥更短、签名更快。将公钥上传到服务器:

ssh-copy-id -i ~/.ssh/id_ed25519_prod.pub -p 2222 user@server-ip

服务端确认~/.ssh/authorized_keys权限为600,~/.ssh目录权限为700。

Fail2Ban自动封禁暴力破解IP

Fail2Ban通过解析SSH日志识别失败登录模式,自动触发iptables/nftables封禁规则:

# CentOS/RHEL
yum install fail2ban fail2ban-firewalld

# Ubuntu/Debian
apt install fail2ban

创建本地配置覆盖默认值,/etc/fail2ban/jail.local

[DEFAULT]
bantime  = 86400
findtime = 600
maxretry = 3
banaction = firewallcmd-rich-rules
action = %(action_mwl)s

[sshd]
enabled = true
port    = 2222
filter  = sshd
logpath = /var/log/secure
maxretry = 3
bantime  = 86400

参数解释:

– bantime:封禁时长,86400秒即24小时,对持续扫描的僵尸网络建议设更长
– findtime:检测窗口,600秒内触发maxretry次失败即封禁
– maxretry:最大重试次数,3次足够严格

启动服务:

systemctl enable fail2ban
systemctl start fail2ban

查看封禁状态:

fail2ban-client status sshd

两步验证与证书固定增强认证

在密钥认证基础上叠加Google Authenticator TOTP两步验证:

yum install google-authenticator   # CentOS
apt install libpam-google-authenticator  # Debian/Ubuntu

用户初始化:

google-authenticator -t -d -r3 -R30
# 扫描二维码绑定手机Authenticator应用
# 保存emergency scratch codes到安全位置

PAM配置,编辑/etc/pam.d/sshd,在文件顶部添加:

auth required pam_google_authenticator.so nullok

sshd_config启用ChallengeResponse认证:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

此配置要求同时满足密钥认证和TOTP验证,单一因素泄露不会导致服务器被入侵。

SSH日志监控与入侵检测

1. 实时监控异常登录

使用journalctl持续监控SSH事件:

# 监控成功登录
journalctl -u sshd -f | grep "Accepted"

# 监控失败登录
journalctl -u sshd -f | grep "Failed"

# 统计今日失败登录IP Top10
journalctl -u sshd --since today | grep "Failed password" | \
  awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10

2. OSSEC/HIDS主机入侵检测

OSSEC是轻量级主机入侵检测系统,专注于日志分析和文件完整性校验:

# 安装OSSEC服务端
wget https://github.com/ossec/ossec-hids/releases/download/3.7.0/ossec-hids-3.7.0.tar.gz
tar xzf ossec-hids-3.7.0.tar.gz
cd ossec-hids-3.7.0
./install.sh

OSSEC对SSH的默认规则已覆盖:

– 多次认证失败(规则5710-5716)
– 非法用户尝试登录(规则5718)
– 认证成功后异常命令执行(规则5302)

触发告警后OSSEC通过邮件或Webhook通知运维人员。

网络层防护:防火墙与端口敲门

firewalld限制SSH来源

# 仅允许办公网段访问SSH
firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4" source address="10.0.1.0/24" \
  port protocol="tcp" port="2222" accept'

# 拒绝其他所有来源
firewall-cmd --permanent --remove-port=2222/tcp
firewall-cmd --reload

Port Knocking端口敲门

对于极高安全要求的服务器,SSH端口默认关闭,只有按特定顺序访问一组端口后才临时开放:

yum install knockd
# /etc/knockd.conf
[openSSH]
  sequence    = 7000,8000,9000
  seq_timeout = 15
  command     = /sbin/firewall-cmd --add-port=2222/tcp
  tcpflags    = syn

[closeSSH]
  sequence    = 9000,8000,7000
  seq_timeout = 15
  command     = /sbin/firewall-cmd --remove-port=2222/tcp
  tcpflags    = syn

客户端敲门后连接:

knock server-ip 7000 8000 9000
ssh -p 2222 user@server-ip
# 用完后关闭
knock server-ip 9000 8000 7000

安全配置自查清单

逐项检查确认以下加固措施已生效:

1. SSH默认端口已修改,22端口已关闭
2. root直接登录已禁止
3. 密码认证已禁用,仅允许密钥
4. AllowGroups限制了可登录用户组
5. MaxAuthTries设为3次以内
6. Fail2Ban运行正常,封禁规则生效
7. 两步验证已启用(生产环境必选)
8. 防火墙规则限制SSH来源IP段
9. SSH日志监控告警链路正常
10. 定期轮换密钥对,清理离职人员authorized_keys

以上措施全部到位后,SSH暴力破解攻破概率趋近于零。唯一需要持续关注的是密钥泄露风险,建议每90天轮换一次密钥对,并对authorized_keys文件配置inotify监控变更。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-yu-bao-li-po-jie-fang-hu/

(0)
小编小编
上一篇 8小时前
下一篇 8小时前

相关推荐