首页 帮助中心 SSH密码登录怎么禁用?只允许密钥登录的安全配置!
SSH密码登录怎么禁用?只允许密钥登录的安全配置!
时间 : 2026-10-15 10:19:07
编辑 : 华纳云
阅读量 : 55

  一台刚上线的VPS,默认配置通常允许root用户通过密码登录。这个默认设置意味着:全球任何一台能连上你服务器22端口的机器,都可以尝试用密码登录你的服务器。自动化扫描工具会持续不断地尝试常见密码组合,速度是每秒几十次。

  禁用密码登录、只允许密钥认证,是服务器安全配置中优先级最高的一步。它的原理很简单:密码可以被猜、被撞库、被暴力破解;密钥几乎不可能。但配置过程中有几个关键步骤不能省略,否则你会把自己锁在服务器外面。

  先理解原理:密钥认证为什么比密码安全

  SSH密钥认证基于非对称加密。你本地保存一个私钥,服务器上保存对应的公钥。登录时,服务器用公钥加密一段随机数据发给你的客户端,客户端用私钥解密后返回,服务器验证解密结果是否正确。整个过程中,私钥从不离开你的本地电脑。

  密码认证的问题在于:密码是一个可以被猜测的字符串。自动化工具可以每秒尝试几十个常见密码,只要时间足够,弱密码必然被攻破。密钥认证不存在“猜测”这个攻击面——私钥是一个几百位的随机数,暴力枚举在计算上不可行。

  密钥认证的另一个优势是防中间人。 密码在传输过程中可能被截获(如果SSH配置不当),密钥认证中私钥从不传输,截获了也没有用。

  第一步:确认密钥登录已经生效

  在禁用密码登录之前,你必须先确认密钥登录是能用的。 这是整个流程中最重要的一个检查点,跳过这一步的后果是:禁用密码后,你的密钥如果没配好,你就登不上了。

  如果你还没有SSH密钥,在本地电脑生成:

ssh-keygen -t ed25519 -C "your_email@example.com"

  ed25519比RSA更短、更快、更安全。生成过程中会提示选择保存路径(直接回车用默认)和设置密钥密码(可以留空,但建议设置)。

  生成后,把公钥传到服务器:

ssh-copy-id root@你的服务器IP

  输入服务器密码后,公钥会被写入服务器的 ~/.ssh/authorized_keys 文件。

  现在打开一个新的终端窗口,尝试用密钥登录:

ssh root@你的服务器IP

  如果不需要输入密码就能登录成功,说明密钥认证已经生效。如果仍然提示输入密码,说明公钥没有正确安装,需要先排查这一步。

  第二步:创建普通用户(推荐但非必须)

  长期用root操作不是好习惯。创建一个普通用户,按需提权:

adduser yourusername
usermod -aG sudo yourusername

  把root的SSH密钥复制给新用户:

mkdir -p /home/yourusername/.ssh
cp /root/.ssh/authorized_keys /home/yourusername/.ssh/
chown -R yourusername:yourusername /home/yourusername/.ssh
chmod 700 /home/yourusername/.ssh
chmod 600 /home/yourusername/.ssh/authorized_keys

  新开一个终端窗口,测试新用户能否用密钥登录:

ssh yourusername@你的服务器IP

  成功了再继续下一步。

  第三步:修改SSH服务端配置

  Ubuntu 22.04/24.04推荐用drop-in文件的方式,不动主配置文件:

sudo nano /etc/ssh/sshd_config.d/00-hardening.conf

  写入以下内容:

# 只允许指定用户通过SSH登录
AllowUsers yourusername

# 禁止root直接登录
PermitRootLogin no

# 只允许密钥认证,禁用密码
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

# 限制认证尝试次数
MaxAuthTries 3

# 认证超时时间(秒)
LoginGraceTime 60

  如果你需要保留root登录但禁用密码,把 PermitRootLogin no 改成 PermitRootLogin prohibit-password。这个设置允许root用密钥登录,但禁止root用密码登录。

  保存后,先测试配置语法是否正确:

sudo sshd -t

  没有输出说明语法没问题。如果有报错,根据提示检查文件内容。

  第四步:重启SSH之前的关键操作

  保持当前SSH连接不要关闭。 这是整个流程中最重要的一步。如果你关掉了当前连接,新配置又出了问题,你就彻底登不上了。

  另开一个终端窗口,用密钥测试新连接:

ssh yourusername@你的服务器IP

  新连接成功了,再回到原来的窗口,重启SSH服务:

sudo systemctl restart ssh

  如果新连接失败,回到旧连接里检查配置。常见的失败原因包括:AllowUsers 里写的用户名拼错了、authorized_keys 权限不对、或者drop-in文件的路径或文件名不符合系统要求。

  这个“保持旧连接、另开新窗口测试”的操作顺序不能颠倒。 很多人在这一步把自己锁在外面,就是因为先重启了SSH,然后发现新连接上不去,旧连接也被断开了。

  第五步:验证密码登录确实被禁用

  配置完成后,做一次验证。从本地尝试用密码登录(强制使用密码认证):

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no yourusername@你的服务器IP

  如果配置正确,服务器会直接拒绝,提示 Permission denied (publickey)。这个报错说明服务器不再接受密码认证,你的配置生效了。

  另一种验证方式是查看SSH的详细日志:

sudo journalctl -u ssh --since "5 minutes ago" | grep -i password

  如果日志里没有出现密码认证成功的记录,说明密码登录已经被关闭。

  第六步:配合Fail2ban做额外防护

  即使禁用了密码登录,攻击者仍然会尝试连接你的SSH端口。Fail2ban监控日志,发现多次失败尝试后自动封禁来源IP。

sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

  编辑 jail.local,确保 [sshd] 段启用:

[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 3600

  重启服务:

sudo systemctl restart fail2ban

  查看封禁状态:

sudo fail2ban-client status sshd

  几个容易踩的坑

  1. 公钥权限不对。 ~/.ssh 必须是700,authorized_keys 必须是600。权限太开放(比如777或755),SSH会拒绝使用这个密钥。

  2. AllowUsers写错了用户名。 这个指令是白名单,写进去的用户才能登录。如果你写的是 admin,但你实际用的是 ubuntu,那 ubuntu 就登不上了。

  3. drop-in文件的路径不对。 Ubuntu 22.04/24.04的drop-in目录是 /etc/ssh/sshd_config.d/,文件名要以 .conf 结尾。如果目录不存在,需要先创建。

  4. 忘了测试就重启。 这是最常见的“自锁”原因。永远保持一个已连接的SSH窗口不动,另开新窗口测试。

  常见问答

  问:禁用密码登录后,我的密钥丢了怎么办?

  如果密钥丢失,而你之前没有配置其他备用登录方式,你将无法通过SSH登录服务器。大多数云服务商提供VNC控制台或救援模式作为应急入口,可以通过控制台重置密码或重新注入密钥。建议在禁用密码之前,确认你有可用的控制台访问方式。

  问:修改配置后SSH服务启动失败,怎么排查?

  用 sudo sshd -t 检查配置语法。如果报错指向某个文件或某一行,根据提示修正。常见的语法错误包括:指令拼写错误、参数值不合法、或者drop-in文件里有冲突的配置。如果服务已经启动失败,用云服务商的控制台进入救援模式修复。

  问:禁用密码登录后,我还能用密码登录其他用户吗?

  不能。PasswordAuthentication no 是全局设置,对所有用户生效。如果你需要保留某个用户的密码登录(比如一个临时账户),需要在配置中单独为该用户设置 Match User 规则,但这样做会降低整体安全性。

  问:SSH密钥认证需要设置密钥密码吗?

  建议设置。密钥密码(passphrase)是对私钥文件的加密保护。如果私钥文件被盗,没有密码就无法使用。设置后每次使用密钥时需要输入密码,可以用 ssh-agent 缓存密码,避免频繁输入。不设密码的私钥文件一旦泄露,任何人都可以直接使用。

  问:我已经禁用了密码登录,还需要改SSH端口吗?

  改端口不是必须的,但可以减少自动化扫描的噪音。默认的22端口是扫描工具的重点目标,改到一个高位端口(比如2222或49152以上)能过滤掉大部分低级的自动化探测。但改端口不能替代密钥认证——它只是一种“降噪”手段,不是安全措施。真正的安全防线是密钥认证加防火墙规则。

相关内容
客服咨询
7*24小时技术支持
技术支持
渠道支持