服务器被暴力破解?8 步 SSH 安全加固方案,从端口到日志全方位防护
作为开发者或运维人员,服务器的 SSH 登录安全是重中之重。一旦遭遇暴力破解,不仅服务器数据可能被窃取,还可能沦为攻击者的 “肉鸡”,用于发起进一步攻击。本文结合实战经验,整理出 8 步 SSH 安全加固方案,从端口修改到日志监控,覆盖全链路防护,帮你筑牢服务器的第一道防线。
一、前置说明:为什么 SSH 容易被暴力破解?
SSH(Secure Shell)是远程管理 Linux 服务器的默认协议,但其默认配置存在两大风险点:
-
默认端口暴露:SSH 默认使用 22 端口,攻击者会通过端口扫描工具批量探测 22 端口开放的服务器;
-
弱口令 / 密码登录:若开启密码登录,攻击者可通过字典爆破(尝试常见用户名 + 密码组合)破解登录权限。
根据日志统计,一台暴露 22 端口且开启密码登录的服务器,平均每天会遭受 数百次甚至数千次 暴力破解尝试。因此,加固 SSH 配置刻不容缓。
二、8 步 SSH 安全加固方案(附具体操作)
SSH 的配置文件默认路径为 /etc/ssh/sshd_config,所有加固操作均围绕该文件展开(修改前建议先备份:cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak)。
第 1 步:修改 SSH 默认端口(规避批量扫描)
默认 22 端口是攻击者的首要目标,修改为非标准端口(如 10022-65535 之间的闲置端口),可大幅降低被扫描到的概率。
操作步骤:
-
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config; -
找到
#Port 22行,删除注释符#,并将 22 改为自定义端口(如Port 10022); -
保存退出后,重启 SSH 服务:
-
CentOS/RHEL:
systemctl restart sshd -
Ubuntu/Debian:
systemctl restart ssh
- 验证端口是否生效:
ss -tuln | grep 10022(出现监听记录即为成功)。
注意:若服务器开启防火墙(如 firewalld、ufw),需同步开放自定义端口,否则无法远程连接。
第 2 步:禁用 root 直接登录(减少攻击目标)
root 是 Linux 系统的最高权限用户,若被暴力破解,攻击者可直接掌控服务器。因此,建议禁用 root 直接登录,仅允许普通用户通过 SSH 登录后,再通过 sudo 提升权限。
操作步骤:
-
先创建一个普通用户(如
admin):useradd admin,并设置密码:passwd admin; -
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config; -
找到
#PermitRootLogin yes行,修改为PermitRootLogin no(若该行不存在,直接添加); -
重启 SSH 服务:
systemctl restart sshd(或ssh); -
验证:尝试用 root 账号登录,若提示 “Permission denied”,说明配置生效。
第 3 步:开启密钥登录,禁用密码登录(彻底杜绝暴力破解)
密码登录是暴力破解的核心目标,而 SSH 密钥登录 通过非对称加密(公钥 + 私钥)验证身份,安全性远高于密码。开启密钥登录后,即使攻击者知道用户名,也无法通过密码爆破登录。
操作步骤(以 Windows 客户端为例,使用 Xshell、FinalShell 等工具):
- 客户端生成密钥对:
-
打开工具,进入 “工具”→“新建用户密钥生成向导”,选择 “RSA” 算法,密钥长度设为 2048 位以上;
-
生成后,保存私钥(如
id_rsa.pem),并复制公钥内容(以ssh-rsa开头的字符串)。
- 服务器配置公钥:
-
登录普通用户(如
admin),进入用户家目录:cd ~; -
创建
.ssh目录并设置权限:mkdir -p .ssh && chmod 700 .ssh; -
创建公钥文件
authorized_keys并写入公钥:vim .ssh/authorized_keys,将客户端复制的公钥粘贴进去,保存退出; -
设置文件权限(必须严格,否则 SSH 会拒绝读取):
chmod 600 .ssh/authorized_keys。
- 禁用密码登录:
-
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config; -
找到
#PasswordAuthentication yes行,修改为PasswordAuthentication no; -
同时确保
PubkeyAuthentication yes(开启密钥登录,默认已开启); -
重启 SSH 服务:
systemctl restart sshd。
- 验证:重新连接服务器,选择 “密钥登录”,指定私钥文件,若能成功登录,说明配置生效。
第 4 步:限制 SSH 登录用户(缩小攻击范围)
若服务器仅需特定几个用户登录,可通过配置限制允许登录的用户列表,避免攻击者尝试其他无效用户名。
操作步骤:
-
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config; -
添加或修改
AllowUsers配置(仅允许列表中的用户登录):
-
例如:
AllowUsers admin test(允许admin和test两个用户登录,多个用户用空格分隔); -
若需限制用户只能从特定 IP 登录,可写成:
AllowUsers admin@``192.168.1.100(仅允许admin从192.168.1.100登录);
-
重启 SSH 服务:
systemctl restart sshd; -
验证:用未在列表中的用户登录,若提示 “Permission denied”,说明配置生效。
第 5 步:限制 SSH 登录 IP(精准防护)
若服务器仅需从固定 IP 或 IP 段访问(如公司内网、个人电脑),可通过配置限制登录 IP,彻底阻断外部陌生 IP 的访问。
操作方式(二选一):
方式 1:通过 SSH 配置文件限制
-
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config; -
添加
AllowUsers配置(结合 IP 限制):
- 例如:
AllowUsers admin@``192.168.1.0/24(允许admin从192.168.1.0网段登录);
- 重启 SSH 服务:
systemctl restart sshd。
方式 2:通过防火墙限制(推荐,更灵活)
以 firewalld 为例(CentOS/RHEL 系统):
- 允许特定 IP 访问 SSH 端口(如 10022):
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="``192.168.1.100``" port protocol="tcp" port="10022" accept";
- 若需允许 IP 段(如
192.168.1.0/24):
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="``192.168.1.0/24``" port protocol="tcp" port="10022" accept";
-
重新加载防火墙规则:
firewall-cmd --reload; -
验证:用非允许 IP 尝试登录,若无法连接,说明配置生效。
第 6 步:设置 SSH 登录失败次数限制(阻断爆破行为)
即使开启了密钥登录,若因误操作开启密码登录,可通过限制登录失败次数,防止攻击者通过 “多次尝试” 爆破密码。
操作步骤(通过 pam_tally2 模块实现):
-
编辑 PAM 配置文件(SSH 登录验证依赖 PAM):
vim /etc/pam.d/sshd; -
在文件顶部添加一行(限制普通用户,root 用户可豁免):
-
auth required ``pam_tally2.so`` deny=5 unlock_time=300 even_deny_root root_unlock_time=1800; -
参数说明:
-
deny=5:普通用户登录失败 5 次后锁定; -
unlock_time=300:普通用户锁定 300 秒(5 分钟)后自动解锁; -
even_deny_root:对 root 用户也生效; -
root_unlock_time=1800:root 用户锁定 1800 秒(30 分钟)后自动解锁。
-
-
重启 SSH 服务:
systemctl restart sshd; -
查看登录失败记录:
pam_tally2; -
手动解锁用户(若需):
pam_tally2 -r -u admin(解锁admin用户)。
第 7 步:隐藏 SSH 版本信息(减少攻击针对性)
SSH 服务会默认暴露版本信息(如 OpenSSH_7.4p1),攻击者可通过版本信息查找对应漏洞。隐藏版本信息可降低被针对性攻击的风险。
操作步骤:
-
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config; -
添加一行:
VersionAddendum ""(清空版本附加信息); -
重启 SSH 服务:
systemctl restart sshd; -
验证:通过
nmap扫描服务器 SSH 端口,查看版本信息是否隐藏:
- 客户端执行:
nmap -p 10022 服务器IP,若版本信息显示为SSH-2.0-OpenSSH(无具体版本号),说明配置生效。
第 8 步:开启 SSH 日志监控(及时发现异常)
加固后需实时监控 SSH 登录行为,一旦出现异常登录(如失败次数骤增、陌生 IP 登录),可及时发现并处理。
操作步骤:
- 开启 SSH 详细日志:
-
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config; -
找到
#LogLevel INFO行,修改为LogLevel VERBOSE(详细日志,包含登录 IP、用户名、登录结果等); -
重启 SSH 服务:
systemctl restart sshd。
- 查看 SSH 日志:
-
SSH 日志默认存储在
/var/log/secure(CentOS/RHEL)或/var/log/auth.log(Ubuntu/Debian); -
查看最近登录记录:
tail -f /var/log/secure | grep sshd; -
查找登录失败记录:
grep "Failed password" /var/log/secure; -
查找成功登录记录:
grep "Accepted" /var/log/secure。
-
进阶:日志告警(可选)
若需实时告警,可通过脚本监控日志,当出现异常登录时,自动发送邮件或短信通知。例如,编写 Shell 脚本,监控
Failed password次数,超过阈值则发送邮件:
# 示例脚本(需安装 mailx 工具)
# 统计 10 分钟内登录失败次数
fail_count=$(grep "Failed password" /var/log/secure | grep "$(date +%Y-%m-%d) $(date +%H):$(($(date +%M)-10))-" | wc -l)
if [ $fail_count -gt 10 ]; then
echo "服务器 SSH 登录失败次数超过 10 次,可能遭遇暴力破解!" | mailx -s "SSH 安全告警" your@email.com
fi
将脚本添加到 crontab 定时执行(如每 5 分钟执行一次):crontab -e,添加一行:*/5 * * * * /path/to/``ssh_alert.sh。
三、加固后验证:确保配置生效
完成 8 步加固后,建议通过以下方式验证:
-
用 root 账号登录:应提示 “Permission denied”;
-
用普通用户 + 密码登录:应提示 “Permission denied”(已禁用密码登录);
-
用普通用户 + 密钥登录:应能成功登录;
-
用陌生 IP 登录:应无法连接(若配置了 IP 限制);
-
查看日志:登录行为应清晰记录在
/var/log/secure中。
四、总结
SSH 安全加固的核心逻辑是 “减少攻击面 + 提升攻击成本”:通过修改端口、禁用 root、限制 IP 减少被攻击的概率;通过密钥登录、失败次数限制彻底杜绝暴力破解;通过日志监控及时发现异常。
按照本文的 8 步方案操作后,服务器的 SSH 安全等级将大幅提升,可有效抵御绝大多数暴力破解攻击。同时,建议定期检查 SSH 日志和配置,确保加固措施持续生效。
(注:文档部分内容可能由 AI 生成)






