
Linux SSH 安全加固:10 步实战显著降低暴力破解风险
⚠️ 本文适用于:CentOS/RHEL、Ubuntu/Debian 系列系统,不同发行版部分路径略有差异,请按需适配。
💡 救命提示:强烈建议操作前保留云控制台登录入口或开启VNC/串口控制台,避免配置失误导致服务器无法链接。
据网络安全机构相关统计,公网上绝大多数Linux服务器初始入侵,都是从SSH暴力破解开始的。黑客用自动化脚本24小时扫描全网的22端口,尝试弱密码组合,一台暴露在公网的服务器,平均每天会遭受上千次暴力破解尝试。一旦你的root密码被破解,黑客就会获得服务器的完全控制权,轻则挖矿、勒索,重则窃取数据、利用你的服务器发起网络攻击,甚至让你承担法律责任。
但不用怕,SSH安全加固并不复杂。这篇文章,会用10个循序渐进的实战步骤,从基础配置到主动防御,再到生产级最佳实践,手把手教你加固服务器的SSH入口,显著降低暴力破解风险
在做任何SSH配置修改之前,第一步必须是备份原始配置文件。这是新手最容易忽略的点,也是避免你改崩配置后彻底连不上服务器的最后一道防线。
执行以下命令,给当前的SSH配置文件打一个带日期的备份包:
# 备份SSH主配置文件,带日期后缀,方便回溯cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)执行完成后,可以用ls /etc/ssh/sshd_config.bak.*查看备份文件是否生成成功。
如果修改配置后,SSH服务无法启动、或者你无法登录服务器,就可以用备份文件恢复:
# 用备份文件覆盖修改后的配置cp /etc/ssh/sshd_config.bak.你的备份日期 /etc/ssh/sshd_config# 测试配置语法是否正确sshd -t# 重启SSH服务恢复systemctl restart sshd💡 经验提示:每次修改SSH配置前,都建议重新打一次备份。同时,修改配置的过程中,永远不要关闭当前已经登录的SSH会话,一定要新开一个终端窗口测试登录是否正常,确认没问题后再关闭旧会话。
以下步骤严格遵循「先兜底、后操作、先测试、后生效」的原则,新手请严格按照顺序操作,避免踩坑。
SSH默认使用22端口,全网的黑客扫描脚本都会优先扫22端口,哪怕你的密码强度很高,每天也会被上千次尝试。修改默认端口,能直接过滤掉绝大多数自动化扫描攻击,是性价比最高的基础防护。 ⚠️ 注意:修改端口仅能降低扫描噪音,不能替代其他安全措施,需配合后续加固步骤使用。
# 新手推荐用nano编辑器,操作更简单;熟悉vim的可以用vimnano /etc/ssh/sshd_config#Port 22这一行,去掉前面的注释#,把22改成1024-65535之间的未被占用端口(比如22022,不要用80、443、3306等常用服务端口) 修改后示例:Port 22022sshd -t# CentOS/RHEL 系列systemctl restart sshd# Debian/Ubuntu 系列systemctl restart ssh⚠️ 90%新手都会踩的坑:修改端口后,必须同时在服务器防火墙和云服务器控制台的安全组里放行新端口,否则会直接连不上服务器!
firewall-cmd --add-port=22022/tcp --permanentfirewall-cmd --reloadufw allow 22022/tcpufw reload# 格式:ssh 用户名@服务器IP -p 新端口ssh root@1.2.3.4 -p 22022能正常登录,即说明端口修改成功。
密码登录是暴力破解的核心目标,哪怕你的密码再复杂,也有被破解的可能。而SSH密钥登录采用非对称加密算法,通过公钥和私钥配对验证,只有持有私钥的人才能登录服务器,是当前主流的安全登录方案,能大幅提升SSH登录安全性。
操作在你的本地电脑执行,不是服务器。
直接在终端执行:
# 推荐ed25519算法,比传统RSA更安全、性能更好ssh-keygen -t ed25519 -C "你的备注(比如邮箱)"若你的系统较老不支持ed25519,可使用RSA算法:
ssh-keygen -t rsa -b 4096
执行后,回车使用默认密钥保存路径;随后会提示设置私钥密码(Passphrase),强烈建议设置,哪怕私钥泄露,别人没有密码也无法使用,相当于二次防护。
生成完成后,密钥对保存在~/.ssh/目录下:
id_ed25519id_ed25519.pubssh-keygen命令,密钥生成在C:\Users\你的用户名\.ssh\目录下在本地终端执行以下命令,自动将公钥上传到服务器对应用户的授权文件中:
⚠️ 说明:Windows 用户若提示该命令不存在,请使用 Git Bash 或手动复制公钥的方式上传。
# 格式:ssh-copy-id -p 端口号 用户名@服务器IPssh-copy-id -p 22022 root@1.2.3.4执行后输入服务器用户密码,公钥会自动写入服务器的~/.ssh/authorized_keys文件中。
若本地不支持ssh-copy-id,可手动上传:
cat ~/.ssh/id_ed25519.pubmkdir -p ~/.sshchmod 700 ~/.sshecho"你的公钥完整内容" >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys重点:不要关闭当前的SSH会话! 新开一个终端窗口,执行登录命令:
ssh root@1.2.3.4 -p 22022若能直接登录(或仅需输入你设置的私钥密码,无需输入服务器用户密码),即说明密钥登录配置成功。
⚠️ 高频坑点:配置后仍需输入密码?99%是权限问题!服务器上的
.ssh目录权限必须为700,authorized_keys文件权限必须为600,否则SSH会因安全问题拒绝公钥认证。执行以下命令修复:
chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys# 确保目录所有者为登录用户,而非rootchown -R 你的用户名:你的用户组 ~/.sshroot是Linux系统的超级管理员,拥有最高权限,也是黑客暴力破解的头号目标。一旦root密码被破解,服务器就彻底沦陷了。禁用root用户的远程登录,能大幅缩小攻击面,哪怕普通用户的密码泄露,黑客也只能拿到有限权限,不会直接控制整台服务器。 ⚠️ 注意:某些自动化工具或脚本可能依赖root登录,禁用前请确认业务兼容性。
⚠️ 高危提示:操作此步骤前,必须先创建一个有sudo权限的普通用户!否则禁用root登录后,你将无法管理服务器!
# 1. 创建用户(-m 自动创建home目录,避免后续密钥登录失败),示例用户名为ops,可自定义useradd -m ops# 2. 给用户设置登录密码passwd ops# 3. 给用户添加sudo权限(CentOS/RHEL 系列)usermod -aG wheel ops# 3. 给用户添加sudo权限(Debian/Ubuntu 系列)usermod -aG sudo ops创建完成后,新开终端窗口,测试普通用户登录和sudo权限是否正常:
# 用普通用户登录ssh ops@1.2.3.4 -p 22022# 测试sudo权限,能正常输出即说明权限正常sudo ls /root编辑SSH配置文件:
nano /etc/ssh/sshd_config找到#PermitRootLogin yes这一行,去掉注释,将yes改为no:
PermitRootLogin no特殊场景说明:若你需要root用户用密钥登录,可设置为
PermitRootLogin prohibit-password,这样root用户仅能通过密钥登录,禁止密码登录,兼顾便利与安全。
# 测试配置语法sshd -t# 重启SSH服务systemctl restart sshd新开终端窗口,尝试用root用户登录,会被直接拒绝;用普通用户登录正常,即说明配置成功。
当你配置好密钥登录,并且测试完全正常后,就可以彻底禁用密码登录了。这样一来,黑客哪怕有再强大的密码字典,也没法通过暴力破解你的服务器,SSH入口仅剩下密钥这一条路,能大幅提升安全性。 ⚠️ 重点强调:必须保证密钥登录可正常使用,且已准备好备份登录方案(如VNC、控制台登录),再执行此操作。
⚠️ 高危提示:此步骤必须在密钥登录100%测试成功后再操作!否则你会彻底失去远程登录服务器的能力!
nano /etc/ssh/sshd_config# 启用公钥认证(必须开启)PubkeyAuthentication yes# 彻底禁用密码认证PasswordAuthentication no# 禁用挑战响应认证ChallengeResponseAuthentication no# 禁用基于键盘的交互式认证KbdInteractiveAuthentication nosshd -tsystemctl restart sshd这里推荐两种配置方式,优先使用防火墙配置,可根据需求选择:
这是终极防护手段之一,哪怕你的私钥泄露了,黑客也只能从你允许的IP地址登录服务器,从源头拦截绝大多数公网攻击。适合有固定办公IP、堡垒机IP的场景,生产环境强烈建议配置。 ⚠️ 极高风险操作:错误配置会直接导致服务器永久无法访问,操作前务必确认信任IP正确。
这里推荐两种配置方式,可同时配置实现双重防护。
⚠️ 注意:TCP Wrappers(hosts.allow/deny)在现代Linux系统(CentOS 8+、RHEL 8+、Ubuntu 20.04+)中已逐步废弃,OpenSSH新版本默认不再支持libwrap,配置后可能无效,不建议作为主要防护手段。
/etc/hosts.allow文件,添加信任的IP/网段:nano /etc/hosts.allow添加以下内容,替换为你的信任IP:
# 允许单个IP访问SSHsshd: 192.168.1.100# 允许整个内网网段访问SSHsshd: 10.0.0.0/8sshd: 192.168.0.0/16# 允许你的办公公网IPsshd: 你的固定办公IP/etc/hosts.deny文件,拒绝所有其他IP访问SSH:nano /etc/hosts.deny添加以下内容:
sshd: ALL原理:hosts.allow的优先级高于hosts.deny,仅allow列表中的IP能访问SSH,其他所有IP都会被直接拒绝。
若你的服务器仅需固定IP访问,可直接在防火墙中配置,仅允许信任IP访问SSH端口,拒绝其他所有请求。
以firewalld为例:
# 先移除之前放行的SSH端口通用规则firewall-cmd --remove-port=22022/tcp --permanent# 仅允许指定IP访问22022端口firewall-cmd --add-rich-rule='rule family="ipv4" source address="你的信任IP" port protocol="tcp" port="22022" accept' --permanent# 重载规则生效firewall-cmd --reload💡 经验提示:配置IP白名单前,务必确认你添加的信任IP正确,否则自己也会被拦截。若你的IP是动态变化的(如家用宽带),不建议配置全局限白,可使用后文的fail2ban做动态防护。
SSH默认开启了DNS反向解析,每次登录时,服务器都会反向解析客户端IP的域名,这个过程主要会导致登录卡顿(严重时要等十几秒),其安全影响非常有限。关闭这个功能,不影响正常登录,可显著提升登录速度。
nano /etc/ssh/sshd_config#UseDNS yes这一行,去掉注释,改为no:UseDNS nosshd -tsystemctl restart sshd配置完成后,你会发现SSH登录速度有明显提升。
如果你登录服务器后忘记退出会话,别人拿到你的电脑,就能直接操作服务器。设置空闲超时时间,当会话闲置超过指定时长,就会自动断开连接,避免安全风险。
nano /etc/ssh/sshd_config# 客户端空闲超时时间,单位秒,这里设置300秒=5分钟ClientAliveInterval 300# 超时无响应的最大探测次数,0表示无响应直接断开ClientAliveCountMax 0sshd -tsystemctl restart sshd虽然绝大多数Linux发行版默认禁用了空密码登录,但仍需在配置文件中显式禁用,防止配置被篡改、系统默认配置被修改后,出现空密码就能登录的高危风险。
nano /etc/ssh/sshd_config#PermitEmptyPasswords no这一行,去掉注释,确保值为no:PermitEmptyPasswords nosshd -tsystemctl restart sshd设置SSH的最大认证尝试次数,当客户端登录失败超过指定次数,就直接断开连接,减少黑客暴力破解的尝试频率,降低服务器的性能压力。
nano /etc/ssh/sshd_config# 最大认证尝试次数,超过就断开连接,建议设置3-5次MaxAuthTries 3# 最大并发登录会话数,根据你的业务需求设置MaxSessions 10sshd -tsystemctl restart sshdSSH有很多高级功能,比如X11转发、TCP端口转发、SFTP等,如果你用不到这些功能,就直接禁用,减少潜在的攻击面,提升服务器安全性。
nano /etc/ssh/sshd_config# 禁用X11图形转发,绝大多数服务器都用不到X11Forwarding no# 禁用TCP端口转发/SSH隧道,不需要就关闭# ⚠️ 若使用跳板机、端口转发、代理,请不要关闭AllowTcpForwarding noAllowAgentForwarding no# 禁用SFTP文件传输功能(需确认路径,不同发行版路径不同)# Subsystem sftp /usr/lib/openssh/sftp-server # Debian/Ubuntu# Subsystem sftp /usr/libexec/openssh/sftp-server # CentOS/RHEL# 可通过 `sshd -T | grep subsystem` 查看当前系统的实际路径sshd -tsystemctl restart sshd💡 经验提示:这些功能按需禁用即可,如果你需要用SFTP传输文件,就不要关闭SFTP子系统;如果你需要用SSH隧道,就不要关闭端口转发。
前面的10个步骤是静态防护,而fail2ban是主动防御工具。它会实时监控SSH的登录日志,当某个IP在指定时间内登录失败超过你设置的次数,就会自动把这个IP加入防火墙黑名单,封禁指定时长,彻底杜绝自动化暴力破解的持续攻击。
# CentOS/RHEL 系列(需先安装epel源)yum install -y epel-releaseyum install -y fail2ban# Debian/Ubuntu 系列apt update && apt install -y fail2banfail2ban官方推荐不要直接修改默认的.conf文件,而是创建.local文件覆盖配置,避免版本更新时丢失配置。
nano /etc/fail2ban/jail.local[DEFAULT]# 封禁白名单,填写你的信任IP,避免自己被封禁(⚠️ 必须配置,否则极易误封自己)ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.0.0/16 你的信任IP# 封禁时长,单位秒,86400=1天,永久封禁设置为-1bantime = 86400# 检测时间窗口,单位秒,600=10分钟findtime = 600# 检测窗口内,最大失败次数,超过就封禁maxretry = 5# 自动适配系统防火墙(通用兼容写法,避免依赖ipset导致失效)banaction = firewallcmd-rich-rules# 自动适配日志模式,兼容不同系统的日志存储方式backend = auto# SSH防护规则[sshd]# 启用规则enabled = true# 你的SSH端口,修改过默认端口必须在这里同步port = 22022# SSH日志路径,自动适配系统logpath = %(sshd_log)s# 过滤规则,使用默认的sshd规则filter = sshd# 启动fail2bansystemctl start fail2ban# 设置开机自启systemctl enable fail2ban# 查看服务运行状态systemctl status fail2ban# 查看SSH防护状态,包括已封禁的IP列表fail2ban-client status sshd# 手动解封某个IPfail2ban-client set sshd unbanip 要解封的IP# 手动封禁某个IPfail2ban-client set sshd banip 要封禁的IP# 重新加载配置文件fail2ban-client reload⚠️ 坑点提示:如果你修改了SSH默认端口,一定要在jail.local的port参数中同步修改,否则fail2ban不会生效!同时务必把自己的办公IP加入ignoreip白名单,避免自己输错密码被封禁。
前面的步骤已经能满足绝大多数个人和中小团队的需求,若是企业级生产环境,还需遵循以下最佳实践,构建层层防护的安全体系:
生产环境的服务器,绝对不要直接把SSH端口暴露在公网,应仅允许堡垒机/跳板机的IP访问SSH端口,所有运维人员必须先登录堡垒机,才能操作业务服务器。这样一来,SSH的攻击面就收敛到堡垒机一台机器,方便统一管控和审计。
哪怕你的私钥泄露了,多因素认证也能拦住黑客。可给SSH配置谷歌验证器(Google Authenticator),登录时除了持有私钥,还需输入手机上的动态验证码,双重防护,安全性拉满。
生产环境禁止共享root账号,每个运维人员都要有独立账号,根据工作内容分配最小sudo权限(比如仅允许某个账号重启nginx服务,不能执行其他高危命令)。同时开启SSH操作日志审计,做到所有操作可追溯、可定位。
把所有服务器的SSH登录日志,统一收集到ELK、Graylog等日志平台,设置告警规则,比如非工作时间登录、陌生IP登录、sudo执行高危命令等场景实时触发告警,第一时间发现异常行为。
这里整理了新手操作时最容易遇到的问题和解决方案,帮你避坑:
A:按以下步骤排查:
sshd -t,查看配置文件是否有语法错误,有则修复;A:常见情况是权限问题,按以下步骤修复:
.ssh目录权限必须为700:chmod 700 ~/.sshauthorized_keyschmod 600 ~/.ssh/authorized_keyschown -R 你的用户名:你的用户组 ~/.sshPubkeyAuthentication yes是否已开启。A:常见原因和解决方案:
fail2ban-client status sshd查看日志匹配情况,确认过滤规则是否正确。A:确认你已给普通用户添加了sudo权限:
usermod -aG wheel 你的用户名usermod -aG sudo 你的用户名 若仍无法使用,编辑/etc/sudoers文件,确认wheel/sudo组的权限已开启,没有被注释。如果你觉得本文对你有帮助,欢迎点赞、推荐、转发,关注我,后续会分享更多Linux入门干货!
文 / 零距技术仓记录每一次真实的折腾 (#^.^#)🚀 想看到更多实用折腾技巧?👉 先关注💬 评论区说说你的经历或想看的内容👍 点赞表示支持🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎