知识库

添加 SSH 密钥并关闭密码登录

生成 ed25519 密钥,正确安装,在破坏任何东西之前测试它,然后彻底关闭密码认证。

在您操作的机器上生成密钥

不是在服务器上。私钥部分绝不应存在于您可能失去访问权限的主机上,而将其复制到各处将破坏拥有私钥的意义。

ssh-keygen -t ed25519 -a 100 -C "laptop-2026"

-a 100 设置保护密码短语的 KDF 轮数,这是防止笔记本电脑被盗与您的服务器群之间唯一的屏障。请使用密码短语。如果您拥有硬件令牌,请改用该令牌:

ssh-keygen -t ed25519-sk -O resident -C "token-1"

安装公钥部分

ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@<ipv4>

手动,从 root 会话,如果该账户尚无密码:

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /dev/null /home/deploy/.ssh/authorized_keys
cat >> /home/deploy/.ssh/authorized_keys

粘贴该行,然后按 Ctrl-D。权限比人们预期的更重要:sshd 拒绝组可写的主目录或 .ssh 目录,并且仅在守护进程日志中说明原因,绝不会告知客户端。

趁您还在操作时限制密钥

authorized_keys 中的选项适用于每个密钥。restrict 关闭所有功能,然后您再添加回该密钥真正需要的功能:

restrict,pty ssh-ed25519 AAAAC3Nza... deploy@laptop

一个为了运行单个任务而存在的密钥应被允许运行单个任务:

restrict,command="/usr/local/bin/backup-receive" ssh-ed25519 AAAAC3Nza... backup

在锁定之前进行测试

保持第一个会话连接。从第二个终端:

ssh -o PreferredAuthentications=publickey deploy@<ipv4> id

如果打印出您的 uid,则密钥路径正常。如果不是,客户端的 ssh -vvv 和服务器的 journalctl -u ssh -n 50 将共同说明问题出在哪一边。大约一半时间是权限问题,其余大部分是用户名错误。

关闭密码登录

cat > /etc/ssh/sshd_config.d/20-keys-only.conf <<EOF
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
AuthenticationMethods publickey
EOF
sshd -t && systemctl reload ssh

AuthenticationMethods publickey 是腰带下的安全保障。即使稍后一个 drop-in 文件悄悄重新启用密码,守护进程仍会拒绝非密钥的任何登录方式。

从客户端确认门已关闭:

ssh -o PreferredAuthentications=password deploy@<ipv4>

预期结果为 Permission denied (publickey)

部署时的密钥

面板维护每个账户的密钥列表。勾选所需的密钥,cloud-init 将在首次启动时写入这些密钥,这意味着实例可以在密码认证已关闭的情况下首次存在。将密钥附加到订单即可将上述十分钟缩短为一分钟。

如果丢失了密钥

这里没有基于身份的恢复,因为我们不持有您的身份。带外控制台是返回的途径:它通过一条从不经过 sshd 的路径访问实例,并且从救援 shell 中您可以追加新密钥并继续操作。

在另一台机器上保留第二个密钥,您就永远不需要阅读这篇文章。

随时恭候

选择城市,选择大小,用加密货币支付。

无需填写关于您的身份信息的表格,无需等待人工审批,无需电话验证。账单结清后,凭证将发送到您的邮箱。