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/