Linux服务器SSH安全加固实战:密钥认证配置与Fail2ban入侵防御部署

SSH是Linux服务器远程管理的核心通道,也是攻击者最常尝试入侵的入口。默认配置的SSH服务存在密码暴力破解、root直接登录、默认端口扫描等风险。通过密钥认证替代密码登录、部署Fail2ban自动封禁恶意IP、配置端口跳转与防火墙联动,可以将SSH服务的安全等级提升到生产可用标准。本文覆盖SSH安全加固的完整配置流程。

SSH服务安全风险评估

暴露在公网的SSH服务平均每天会收到数千次扫描和登录尝试。通过分析/var/log/secure(CentOS)或/var/log/auth.log(Ubuntu)中的认证日志,可以清晰看到攻击模式:扫描器使用常见用户名(root、admin、test)和弱密码字典进行批量尝试。

默认配置的主要风险点包括:Port 22端口暴露,容易被自动化扫描器发现;PermitRootLogin设置为yes,root账户直接暴露在暴力破解范围内;PasswordAuthentication为yes,密码认证可被字典攻击破解;没有登录失败次数限制,攻击者可以无限重试。

密钥认证配置与密码登录关闭

SSH密钥认证基于非对称加密,私钥保存在客户端,公钥部署在服务器。攻击者即使知道用户名和服务器地址,没有私钥也无法登录。密钥认证的暴力破解难度远高于密码,2048位RSA密钥的破解计算量在当前算力下不可行。

客户端生成密钥对:

# 在本地机器执行,生成Ed25519密钥(比RSA更安全、更短)
ssh-keygen -t ed25519 -C "admin@yunthe-server" -f ~/.ssh/yunthe_ed25519

# 参数说明:
# -t ed25519:使用Ed25519算法,比RSA更高效安全
# -C:注释信息,标识密钥用途
# -f:指定密钥文件路径

# 设置passphrase保护私钥(即使私钥文件泄露,没有passphrase也无法使用)
# 建议设置强passphrase:至少16位,包含大小写字母、数字、符号

将公钥部署到服务器:

# 方法一:使用ssh-copy-id自动部署
ssh-copy-id -i ~/.ssh/yunthe_ed25519.pub matao@server_ip

# 方法二:手动部署
cat ~/.ssh/yunthe_ed25519.pub | ssh matao@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

服务器端sshd_config配置关闭密码认证:

# /etc/ssh/sshd_config 关键配置项

Port 2222                          # 修改默认端口
PermitRootLogin no                 # 禁止root直接登录
PasswordAuthentication no          # 关闭密码认证
PubkeyAuthentication yes           # 开启密钥认证
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3                     # 单次连接最大认证尝试次数
LoginGraceTime 30                  # 认证超时时间30秒
AllowUsers matao deploy            # 仅允许指定用户SSH登录
ClientAliveInterval 300            # 300秒无操作发送心跳
ClientAliveCountMax 0              # 不响应心跳则断开(防止僵尸连接)

# 保存后验证配置语法
sshd -t

# 重载SSH服务(不要直接restart,先reload确保配置正确)
systemctl reload sshd

配置完成后,保持当前SSH会话不要断开,另开一个终端使用新配置连接测试。确认密钥登录正常后再关闭旧会话,避免配置错误导致无法登录。

Fail2ban入侵检测与自动封禁部署

Fail2ban通过监控SSH认证日志,自动识别暴力破解行为并调用iptables/firewalld封禁来源IP。默认配置下,10分钟内5次认证失败即封禁该IP 1小时,可按需调整阈值。

# 安装Fail2ban
yum install -y epel-release && yum install -y fail2ban
# 或
apt install -y fail2ban

# 创建本地配置文件(不要直接修改jail.conf,升级会覆盖)
# /etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8    # 信任IP段,不封禁
bantime = 3600                             # 封禁时长1小时
findtime = 600                              # 检测窗口10分钟
maxretry = 3                                # 3次失败即封禁
banaction = firewallcmd-ipset               # 使用firewalld封禁
backend = systemd                           # 从systemd journal读取日志

[sshd]
enabled = true
port = 2222                                # 与sshd_config端口一致
logpath = %(sshd_log)s
maxretry = 3
bantime = 86400                            # SSH封禁延长至24小时

启动Fail2ban并设置开机自启:

systemctl enable fail2ban
systemctl start fail2ban

# 查看SSH防护状态
fail2ban-client status sshd

# 输出示例:
# Status for the jail: sshd
# |- Filter
# |  |- Currently failed: 0
# |  |- Total failed:     127
# |  `- File list:        /var/log/secure
# `- Actions
#    |- Currently banned: 3
#    |- Total banned:     15
#    `- Banned IP list:   192.168.1.100 10.0.0.50 203.0.113.45

手动解封IP或手动封禁IP:

# 解封指定IP
fail2ban-client set sshd unbanip 192.168.1.100

# 手动封禁IP
fail2ban-client set sshd banip 203.0.113.50

# 查看封禁策略详情
fail2ban-client get sshd actions
fail2ban-client get sshd bantime

SSH端口修改与防火墙联动

修改SSH端口可以过滤掉90%以上的自动化扫描。攻击者使用nmap等工具扫描全端口虽然可以发现非标准端口,但扫描全端口的时间成本远高于只扫描22端口,修改端口本身就是一种有效的防御手段。

# firewalld放行新SSH端口
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --remove-port=22/tcp    # 关闭旧端口
firewall-cmd --reload

# 如果使用iptables
iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 上述规则限制同一IP在60秒内最多5次SSH连接尝试

SSH审计日志与安全监控

配置SSH详细日志记录,便于事后审计追溯:

# /etc/ssh/sshd_config 增加审计配置
LogLevel VERBOSE                    # 记录详细日志
PermitTunnel no                     # 禁止隧道转发
AllowTcpForwarding yes              # 按需开放端口转发
X11Forwarding no                    # 禁止X11转发
AllowAgentForwarding no             # 禁止Agent转发

# 记录SSH登录成功/失败到单独审计文件
# /etc/rsyslog.d/ssh-audit.conf
if $programname == 'sshd' then /var/log/ssh-audit.log
& stop

# 重启rsyslog
systemctl restart rsyslog

定期审查SSH登录记录,关注异常登录行为:

# 查看最近成功登录记录
last -a | head -20

# 查看失败登录记录
lastb -a | head -20

# 统计各IP登录失败次数(排查暴力破解)
journalctl -u sshd --since "24 hours ago" | grep "Failed password" | awk '{print $(NF)}' | sort | uniq -c | sort -rn | head -20

# 统计当前在线用户
who

对于多台服务器的统一SSH管理,建议配合堡垒机(Jump Server)使用。堡垒机集中管理SSH访问入口,所有操作录屏审计,即使单台服务器SSH配置存在漏洞,攻击者也需要先突破堡垒机才能接触到内网服务器。开源方案如JumpServer提供完整的身份认证、权限管理和操作审计功能。

密钥管理方面,生产环境建议定期轮换SSH密钥(每季度或人员变动时),废弃密钥及时从authorized_keys中删除。对于离职人员,应在第一时间清除其公钥和系统账号,避免权限残留。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-shi-zhan-mi-yao-ren-zheng/

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

相关推荐