1. 认证与访问控制
1.1 强化 SSH 认证方式
SSH 是 Linux 服务器对外的第一道防线,在运维全攻略中将其作为重点防护对象尤为关键。通过禁用密码认证、强制公钥认证,可以显著降低暴力破解的成功概率。将认证方式锁定为公钥+可选的一次性验证码,是一种稳健的做法。
在实际操作中,不要依赖默认端口进行暴露,请结合端口改造与访问控制实现分层保护。同时,对根用户的远程登录设定严格限制,避免成为攻击目标。
# 修改 /etc/ssh/sshd_config 的关键设置示例
Port 2222
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
1.2 公钥认证与密钥管理
使用公钥认证能够实现无密码登录,降低被暴力破解的几率。确保私钥在客户端安全存放,公钥正确分发到目标服务器,并且定期轮换密钥以提升长期安全性。
推荐对私钥设置强口令,并启用 SSH 代理以便在多台服务器间复用密钥。

# 生成带口令的私钥
ssh-keygen -t rsa -b 4096 -C "admin@server"
# 将公钥拷贝到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server -p 2222
1.3 端口变更与登录限制
将 SSH 服务端口从默认的 22 改为非标准端口,可以降低全网扫描命中的概率,但并不能替代其他核心防护。结合白名单和登录时限策略能够进一步降低暴力攻击面。
通过精确的用户白名单、禁止不必要的用户远程登录,以及限制登录时长,可以提升整体防护等级。
# /etc/ssh/sshd_config 示意
Port 2222
LoginGraceTime 60
PermitRootLogin no
AllowUsers admin alice bob
2. 密码安全策略与账户保护
2.1 最小权限与账户锁定策略
为了避免暴力破解对单个账户的持续尝试,设置账户锁定策略是关键,应使用 PAM 相关模块对登录失败进行累积并锁定账户。
结合系统级别的失败计数器与锁定策略,能有效防止暴力破解的持续尝试,并确保在误判时可通过解锁时间进行自我保护。
# 以 PAMFaiIlock 的示例(RHEL/CentOS 7+)
auth required pam_faillock.so preauth audit deny=5 unlock_time=900
auth [success=1 default=ignore] pam_unix.so
account required pam_faillock.so
不同发行版对 PAM 配置路径可能不同,请结合 /etc/pam.d/ 目录下实际文件进行调整,确保账户锁定在密码失败达到阈值后生效。
# Ubuntu/Debian 体系的简化示例
auth required pam_tally2.so onerr=fail deny=5 unlock_time=900
2.2 密码复杂度与过期策略
为了提升基线防护,应强制执行密码复杂度与定期更新策略。设定最小长度、字符类型及定期变更要求,避免出现容易被猜到的口令。
在 PAM 配置中开启复杂度检查,同时设定合理的密码有效期与提醒期限,以降低长期使用弱口令的风险。
# 在 /etc/pam.d/common-password 添加或修改
password requisite pam_pwquality.so try_first_pass retry=3 minlen=14 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
# 设置用户密码有效期(示例:90 天)
chage -M 90 -m 7 -W 7 username
2.3 两步验证与密钥轮换
两步验证(2FA)能为 SSH 增加额外的安全层,尤其是在云主机环境中。结合 TOTP(如 Google Authenticator)作为二次认证,能够有效防止凭证被盗后的即刻入侵。
实现示例中,安装并配置 PAM 的 Google Authenticator 模块,确保在登录流程中触发一次性验证码验证。
# 安装 Google Authenticator PAM
apt-get install libpam-google-authenticator# 配置 PAM(示例,具体路径视发行版而定)
# 在 /etc/pam.d/sshd 或相应服务文件中添加
auth required pam_google_authenticator.so
此外,定期轮换密钥对与公钥也非常重要,制定密钥轮换策略,降低长期使用同一密钥带来的风险。
# 轮换公钥的简要流程
mv ~/.ssh/id_rsa ~/.ssh/id_rsa.bak
ssh-keygen -t rsa -b 4096 -C "admin@server (rotated)"
# 将新公钥分发到服务器并删除旧公钥
3. 暴力破解防护工具与日志监控
3.1 Fail2ban 与 CSF
Fail2ban 能对 SSHD 的暴力破解行为进行自动封禁,帮助运维人员实现“看门人”式的防护。通过 jail.local 设置合理的 maxretry 与 bantime,可在攻击初期自动封禁可疑 IP。
在大规模环境中,结合 CSF(ConfigServer Firewall)可以实现更细粒度的规则管理,并与 Fail2ban 产生协同效应。
# Fail2ban 的配置片段(/etc/fail2ban/jail.local)
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
# 重启 Fail2ban 以应用设置
systemctl restart fail2ban
3.2 IPtables/nftables 的速率限制
通过对 SSH 连接建立阶段施加速率限制,可以降低暴力尝试的效率。结合 iptables 或 nftables 动态规则实现速率控制,并将策略与日志对齐。
在实际落地时,可以先在测试环境验证规则的正确性,避免误拦合法用户。
# 以 iptables 为例,对自定义端口 2222 进行简单限流
iptables -A INPUT -p tcp --dport 2222 -i eth0 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 2222 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
# 使用 nftables 的简单限流
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy accept; }
nft add rule inet filter input tcp dport 2222 limit rate 5/minute accept
3.3 日志分析与告警
日志分析与告警是持续性的防护手段。结合日志轮转、集中化日志分析与告警机制,确保可疑事件能被及时发现。
常见做法包括使用 logwatch、rsyslog、ELK/OpenSearch 以及邮件告警等组合,确保 SSH 登录行为处于可观测状态。
# 使用 logwatch 对 SSHD 日志进行摘要与定期邮件通知
apt-get install logwatch
logwatch --service sshd --output mail
# 基本的 auditd 配置示例(用于登录相关事件)
apt-get install auditd
service auditd start
ausearch -m USER_LOGIN -ts today


