在Debian系统中禁用root用户的SSH密码登录并强制使用密钥认证,核心操作就是修改SSH服务配置文件/etc/ssh/sshd_config,将PasswordAuthentication设为no,PermitRootLogin设为prohibit-password或直接设为no,同时确保你已经提前配置好了SSH密钥对并验证密钥登录正常工作。这套操作是Debian服务器安全加固的基础步骤,做完之后任何暴力破解root密码的攻击都会直接失效。下面我把每一步怎么做、为什么这么做、做错了怎么补救,全部讲清楚。
一、为什么必须禁用root密码登录
root是Linux系统的最高权限账户,一旦密码被猜中或者被暴力破解,攻击者就能直接控制整台服务器。SSH默认允许root用密码登录,这等于把大门敞开等人来撞。Debian作为服务器领域使用最广泛的发行版之一,其默认SSH配置在较新版本中已经把PermitRootLogin设为prohibit-password,也就是只允许密钥登录不允许密码登录,但很多人装完系统后没有检查这个设置,或者手动改回去了。所以不管你是新装的Debian 11、12还是老版本的Debian 10,都应该主动确认并加固这个配置。
二、操作前的准备工作:生成SSH密钥对
在你动手改配置之前,必须先确保你有一对可用的SSH密钥。如果你还没有,现在就生成。在你本地电脑(不是服务器)上打开终端执行以下命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
系统会提示你保存密钥的位置,直接回车用默认路径~/.ssh/id_ed25519。然后会让你设置密码短语(passphrase),强烈建议设置一个,这是密钥的第二层保护。生成完毕后,你会得到两个文件:id_ed25519是私钥,id_ed25519.pub是公钥。私钥绝对不能泄露,公钥才是要放到服务器上的。
把公钥复制到Debian服务器的root用户目录下:
ssh-copy-id root@你的服务器IP
这条命令会自动把你的公钥追加到服务器的/root/.ssh/authorized_keys文件中。如果ssh-copy-id不可用,你也可以手动操作:在本地电脑上查看公钥内容,然后登录服务器,执行:
mkdir -p /root/.ssh chmod 700 /root/.ssh echo "你的公钥内容粘贴到这里" >> /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys
三、验证密钥登录是否正常
这一步极其关键,很多人改完配置才发现密钥登录不通,结果把自己锁在外面了。在修改SSH配置之前,你必须开一个新的终端窗口,用密钥方式登录一次:
ssh -i ~/.ssh/id_ed25519 root@你的服务器IP
如果能正常登录并看到命令行提示符,说明密钥认证没问题。如果登录失败,先排查问题:检查服务器上/root/.ssh目录权限是否为700,authorized_keys文件权限是否为600,文件内容是否完整没有多余空格或换行。确认无误后再进行下一步。
四、修改SSH服务配置文件
用你喜欢的编辑器打开配置文件:
nano /etc/ssh/sshd_config
找到以下几个关键参数,逐一修改:
第一,PermitRootLogin。如果你想完全禁止root登录(推荐),设为:
PermitRootLogin no
如果你还需要root用密钥登录(比如某些运维场景),设为:
PermitRootLogin prohibit-password
第二,PasswordAuthentication,设为:
PasswordAuthentication no
第三,PubkeyAuthentication,确保是yes:
PubkeyAuthentication yes
第四,AuthorizedKeysFile,确认指向正确路径:
AuthorizedKeysFile .ssh/authorized_keys
第五,如果你还想禁止其他普通用户用密码登录,可以加一行:
ChallengeResponseAuthentication no
改完之后保存文件,然后检查配置语法是否正确:
sshd -t
如果没有任何输出,说明配置语法没问题。如果报错,根据提示修正后再试。
五、重启SSH服务使配置生效
在Debian系统上执行:
systemctl restart sshd
或者用:
service ssh restart
重启完成后,立即用密钥方式重新登录验证。注意:不要关闭当前正在使用的SSH会话,开一个新的终端窗口去测试。如果新窗口能用密钥登录成功,说明配置生效。如果新窗口连不上,你还有旧的会话可以回滚修改。
六、进阶安全加固:不只是禁用root密码
禁用root密码登录只是第一步,要真正把SSH安全做到位,还需要做以下几件事:
第一,修改SSH默认端口。把22端口改成一个不常用的高位端口,比如22222:
Port 22222
改完后记得在防火墙中放行新端口:
ufw allow 22222/tcp
或者如果你用iptables:
iptables -A INPUT -p tcp --dport 22222 -j ACCEPT
第二,限制可以登录SSH的用户。在sshd_config中添加:
AllowUsers your_username
这样只有指定用户能登录SSH,其他人连尝试的机会都没有。
第三,安装并配置fail2ban。它能自动监控SSH登录日志,发现多次失败尝试就自动封禁IP:
apt install fail2ban -y systemctl enable fail2ban systemctl start fail2ban
fail2ban默认就有sshd的过滤规则,装好就能用,不需要额外配置。它会在/var/log/auth.log中监控失败登录,默认5次失败就封24小时。
第四,禁用SSH协议版本1。在配置文件中确保:
Protocol 2
SSHv1有已知的安全漏洞,现代系统默认只用v2,但检查一下总没错。
七、常见错误和应急处理
最常见的翻车场景就是改完配置后密钥登录不通,自己被锁在外面。如果你真的遇到了这种情况,有几个办法可以救:
如果你有服务器的控制台访问权限(比如云服务商提供的VNC控制台或者物理机的键盘显示器),直接登录本地,用root权限修改/etc/ssh/sshd_config把PasswordAuthentication改回yes,重启sshd服务,然后用密码登录进去修复密钥配置。
如果你没有控制台访问权限,但服务器上还有其他有sudo权限的用户,用那个用户登录后sudo修改配置。
如果以上都不行,就只能通过服务商的救援模式或者挂载系统盘到另一台机器上修改配置文件了。所以再次强调:改配置之前一定要先验证密钥登录能用,这是铁律。
八、定期检查和维护
安全不是一次性的事情。建议定期做以下检查:每隔一段时间查看/var/log/auth.log中的SSH登录记录,关注是否有异常IP在尝试登录。用以下命令查看最近的登录情况:
last -f /var/log/wtmp | grep ssh
同时定期轮换你的SSH密钥,特别是私钥如果有泄露风险的时候。生成新密钥对后,把旧公钥从authorized_keys中删除,换上新的。
另外,如果你的Debian服务器对外提供服务,建议用Debian自带的unattended-upgrades保持系统和OpenSSH包及时更新,修补已知漏洞:
apt install unattended-upgrades -y dpkg-reconfigure -plow unattended-upgrades
九、总结
在Debian上禁用root的SSH密码登录并强制密钥认证,操作本身不复杂,核心就是三步:生成密钥对、把公钥放到服务器、修改sshd_config并重启服务。但真正体现专业水平的是操作前的验证、操作后的测试、以及后续的持续加固。把SSH端口改掉、装fail2ban、限制登录用户、保持系统更新,这些组合拳打下来,你的Debian服务器SSH安全等级会提升好几个档次。记住一个原则:永远不要在没有备用访问通道的情况下修改SSH配置,这是运维的基本纪律。
