Debian系统ssh安全加固,禁止密码登录
把服务器 SSH 从密码登录改成密钥登录,是降低暴力破解风险最有效的一步。
Debian 系统默认允许密码登录,而密码一旦被扫到弱口令,服务器就很容易被入侵。
本文会用最简单的方式,带你在 Debian 系统上完成 SSH 安全加固:生成密钥、上传公钥、关闭密码登录,并确认自己还能正常登录。
整个过程不需要太深的基础,照着命令执行即可。
先搞清楚一件事:密钥登录为什么更安全
SSH 密钥登录用的是非对称加密,客户端持有私钥,服务器只存放公钥。
登录时服务器会通过公钥验证客户端的私钥,私钥本身不会在网络上传输,所以比每次发送密码更安全。
再加上你关闭了密码登录,黑客就无法再通过猜测密码的方式尝试连接,暴力破解基本失效。
需要提前准备的东西只有两样:一个能登录 Debian 服务器的管理员账号(有 sudo 权限),以及你本地的电脑(Windows / macOS / Linux 都可以)。
第一步:在本地生成密钥对
如果你的电脑还没有现成的 SSH 密钥,可以新建一个。
在本地终端(Windows 使用 PowerShell,macOS / Linux 使用终端)执行:
ssh-keygen -t ed25519 -C "你的备注信息"
一路回车即可,默认生成到 ~/.ssh/id_ed25519。
如果提示输入 passphrase,可以设置一个保护私钥的密码,也可以直接留空。
生成完成后会在 ~/.ssh/ 下出现两个文件:id_ed25519(私钥,千万不要泄露)和 id_ed25519.pub(公钥,可以放到服务器上)。
如果你的旧服务器只支持 RSA,也可以改用:
ssh-keygen -t rsa -b 4096
第二步:把公钥上传到 Debian 服务器
推荐用 ssh-copy-id 一键上传,这样最不容易出错。
在本地终端执行:
ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名@服务器IP
执行后会提示输入一次服务器密码,输入后公钥就会被追加到服务器上 ~/.ssh/authorized_keys 文件里。
如果服务器不支持 ssh-copy-id,也可以手动创建:先用当前密码登录服务器,然后执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
再用本地的 cat id_ed25519.pub 查看公钥内容,复制后粘贴到服务器的 ~/.ssh/authorized_keys 文件里。
注意公钥必须是一行完整文本,不要多空格或换行。
第三步:修改 sshd_config,关闭密码登录
在服务器上执行下面命令编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config
找到并修改或新增以下两个关键项:
PubkeyAuthentication yes
PasswordAuthentication no
如果 PasswordAuthentication no 原文被注释,去掉行首的 # 再改为 no。
保存后,在重载服务之前,先检查配置是否有语法错误:
sudo sshd -t
没有任何输出表示配置正确。
然后重载 SSH 服务:
sudo systemctl reload ssh
这里用的是 reload,不是 restart。reload 不会断开现有连接,你测试失败时还能用当前会话补救。
第四步:验证是否真的只能密钥登录
保持当前 SSH 窗口不要关闭,再新开一个终端窗口,尝试用密钥登录:
ssh 用户名@服务器IP -i ~/.ssh/id_ed25519
如果你没有用 -i 指定私钥,SSH 也会默认读取 ~/.ssh/id_ed25519。
只要能成功登入,说明密钥登录正常。
下一步测试密码登录是否已被禁用:重新连接时故意输错密码,如果出现 Permission denied (publickey),就代表服务器已经拒绝密码登录。
看到这个提示,就说明加固生效了。
额外提醒一句:
如果你使用云服务器,
部分云厂商使用 ubuntu 或 debian 等非 root 账号登录,
建议先用 sudo -i 切到 root 再修改,
避免因为 sudo 权限丢失而无法处理配置。
常见坑与排查建议
改完配置文件后连不上,密钥登录也失败:先检查是否在 /etc/ssh/sshd_config 中把 PubkeyAuthentication 不小心设成了 no,或者 authorized_keys 文件存在覆盖规则。
Debian 默认还会读取 /etc/ssh/sshd_config.d/*.conf,如果你在子配置文件里设置了 PasswordAuthentication yes,即使主文件改成 no 也会被子配置覆盖。
检查一下这个目录下的内容,最好把关闭密码登录的配置写在子配置里,或者删除冲突项。
上传公钥后仍然要输密码:确认服务器上 ~/.ssh 目录权限是 700,authorized_keys 文件权限是 600,并且文件所在家目录不能对组和其他用户开放写权限。
可以执行:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
然后再次验证登录。
密钥登录成功后想彻底关闭密码登录:你可以在确认密钥登录稳定后,再执行一次 sudo systemctl reload ssh。
如果后续不小心搞丢私钥,需要回到云控制台通过 VNC 或救援模式登录修改配置,所以私钥一定要备份好。
完成以上步骤后,你的 Debian 服务器 SSH 已经变成只接受密钥登录。
以后登录服务器不再需要担心密码泄露,暴力破解也会被服务器直接拒绝。
如果你正在处理这台服务器的安全加固,建议先把这四步完整走一遍,再根据实际环境微调配置。
遇到问题时,优先从配置覆盖、文件权限和当前会话备用通道这几个方向排查,能帮你快速找到原因。