Placeholder

使用 SSH 公钥登录服务器并禁用密码

😠 太长不读:生成 SSH密钥,上传到服务器,然后禁用密码登录。(好像是废话)

🔒 生成 SSH 密钥

以下使用 $ 符号代表本机执行,> 符号代表服务器执行。

$ ssh-keygen # 旧版本需要添加 `-t ed25519` 参数
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/YOUR_USER_NAME/.ssh/id_ed25519): # 可以自定义位置,也可以直接回车
Enter passphrase for "example" (empty for no passphrase): # 输入密码(不显示),不建议空密码
Enter same passphrase again: # 再输一遍
Your identification has been saved in id_ed25519
Your public key has been saved in id_ed25519.pub # 带有 .pub 的是公钥
The key fingerprint is:
SHA256:SOME_STRANGE_STRING YOUR_USER_NAME@YOUR_HOST_NAME # 你的公钥指纹
The key's randomart image is: # 根据公钥生成的随机图像
+--[ED25519 256]--+
|       SOME      |
|     STRANGE     |
|      IMAGE      |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+

$ ls .ssh
id_ed25519 id_ed25519 # 可能还有其他文件

⬆️ 上传到服务器

首先确保你当前可以使用密码登录一个非 root 的账号。

$ ssh example_user@example_host
example_user@example_host's password:
>

然后,退出 SSH,在本机上执行(注意是本机):

$ ssh-copy-id -i .ssh/id_ed25519.pub example_user@example_host

在上传过程中,会要求你输入当前密码。一般来说很快就会上传完成。

测试一下是否可以登录。

$ ssh -i .ssh/id_ed25519.pub example_user@example_host
.ssh/id_ed25519.pub's password: # 注意这里变成输入密钥的密码了
>

如果可以,继续下一步。

🙅‍♂️ 禁用密码登录

> sudo vim /etc/ssh/sshd_config

在编辑器中,添加或修改以下选项:

PasswordAuthentication no
PermitRootLogin no
AllowPAM no
AllowUsers example_user # 可选,这将禁止除 example_user 之外任何用户 SSH 登录

保存并退出,然后:

> sudo systemctl restart sshd

退出 SSH,再次尝试登录:

$ ssh example_user@example_host
example_user@example_host: Permission denied (publickey).

再次使用密钥登录,如果登录成功,那么说明以上步骤都是正确的!

❓ 如果不行呢?恭喜你 🎉 你被锁在系统之外了!VNC 你的服务器吧……

Security Holes

来源:XKCD,原文解说是 True story: I had to try several times to upload this comic because my ssh key was blacklisted.

所以建议您在修改完成之后,不要着急断开当前连接,等确定可以正常连接了再断开。

🕳️ 更换端口

更安全的做法是更改端口。在上述配置文件中,您可以将 Port 后面的数字修改为您最讨厌的数字(然后您就可以每天看到它了 😝)。

记得开放端口。如果您使用 firewalld,最好的做法是修改服务中定义的端口号。

1
2
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
sudo vim /etc/firewalld/services/ssh.xml # 修改 22 为您刚刚选择的端口号

同上,在您关闭连接之前,必须先进行测试。

Banner