在您操作的机器上生成密钥
不是在服务器上。私钥部分绝不应存在于您可能失去访问权限的主机上,而将其复制到各处将破坏拥有私钥的意义。
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 sshAuthenticationMethods publickey 是腰带下的安全保障。即使稍后一个 drop-in 文件悄悄重新启用密码,守护进程仍会拒绝非密钥的任何登录方式。
从客户端确认门已关闭:
ssh -o PreferredAuthentications=password deploy@<ipv4>预期结果为 Permission denied (publickey)。
部署时的密钥
面板维护每个账户的密钥列表。勾选所需的密钥,cloud-init 将在首次启动时写入这些密钥,这意味着实例可以在密码认证已关闭的情况下首次存在。将密钥附加到订单即可将上述十分钟缩短为一分钟。
如果丢失了密钥
这里没有基于身份的恢复,因为我们不持有您的身份。带外控制台是返回的途径:它通过一条从不经过 sshd 的路径访问实例,并且从救援 shell 中您可以追加新密钥并继续操作。
在另一台机器上保留第二个密钥,您就永远不需要阅读这篇文章。