使用 SSH 密钥登录服务器

本文简要介绍了如何生成并使用 SSH 密钥登录远程服务器。

SSH (secure shell) 是一种管理本地与服务器之间通信的加密协议。推荐使用 SSH 密钥登录服务器,这比使用传统的密码登录更安全高效。

本地生成密钥对

1
ssh-keygen [-t rsa|ed25519] -C "Your Comment"

根据屏幕提示,按 ENTER 将密钥对存放在默认目录 ~/.ssh/ 下,或输入想存放的路径。若之前生成过密钥对,屏幕提示询问是否覆盖原有密钥对,输入 nENTER 取消操作。

之后屏幕提示输入密钥密码,可直接 ENTER 不设置密钥密码,这样在使用 SSH 密钥登录时就不需要再输入密码。但还是推荐设置密钥密码,多一层防护。

屏幕提示生成的密钥对存放在 ~/.ssh/ 目录下,其中 id_rsa 为私钥需妥善保存,id_rsa.pub 为公钥需上传至服务器。

将公钥上传至服务器

使用 ssh-copy-id 上传

进行下列操作前请确认可以通过密码登录至服务器。

1
ssh-copy-id username@hostname

根据屏幕提示,输入 username 用户登录服务器的密码。本地公钥将会被上传并附加至服务器 ~/.ssh/ 目录下的 authorized_keys 文件中。

请将本文所有命令中的 username 替换为自己服务器上的用户名;将 hostname 替换为自己服务器的 IP 地址或其对应的服务器名称。

使用 SSH 上传

进行下列操作前请确认可以通过密码登录至服务器。

ssh-copy-id 不可用,可通过 SSH 上传密钥。

1
cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

根据屏幕提示,输入 username 用户登录服务器的密码。 下面逐句解释上述命令。

读取公钥内容

1
cat ~/.ssh/id_rsa.pub

复制公钥内容

1
command1 | command2

| 为管道命令操作符,其作用是将 command1 命令的正确输出传递给 command2 命令,作为其标准输入。在这里可以理解为复制上一步 cat 命令的输出结果。

登录服务器

1
ssh username@hostname

之后 "" 中以 && 分割的多条命令,将会通过 SSH 在服务器上依次运行。

在服务器上创建 .ssh 目录

1
mkdir -p ~/.ssh

参数 -p 可在中间目录不存在时,依次创建中间目录。若服务器上已存在相应目录,则不做操作。

在服务器上创建 authorized_keys 文件

1
touch ~/.ssh/authorized_keys

若服务器上已存在相应文件,则不做操作。

设置服务器上 .ssh 目录的权限

1
chmod -R go= ~/.ssh

删除 username 用户所在组中其他用户以及其他组对 .ssh 目录的所有(读、写以及执行)权限。

将公钥附加到 authorized_keys 文件末尾

1
cat >> ~/.ssh/authorized_keys

这里 >> 为追加命令,将 2.2.2 中复制的公钥内容附加到 authorized_keys 文件末尾,不影响其中已存在的其他公钥。

手动上传公钥

当无法使用密码登录服务器时,可手动将公钥内容复制至服务器上 authorized_keys 文件末尾。此时要求:

  • 有一个已(或可以)登录服务器的账号且该账号有在 username 目录下的读写权限,如 root 账号或其他有 root 权限的账号,
  • 已复制公钥内容。

具体操作步骤与 2.2 中通过 SSH 在服务器上运行的命令基本一致。以下命令均在服务器上运行。

进入 username 目录

1
cd /home/username

创建 .ssh 目录

请确保操作账号拥有 username 用户目录的读写权限,如 root 账号。若操作账号为拥有 root 权限的其他普通账号,请在下列命令前加 sudo

1
mkdir .ssh

将公钥附加到 authorized_keys 文件末尾

1
echo public_key_string >> .ssh/authorized_keys

该命令中 public_key_string 即为提前复制好的公钥内容。此步骤也可选用自己熟悉的文本编辑器,如 vi/vim 打开 .ssh/authorized_keys 文件后将复制好的公钥内容追加到文件末尾。

设置 .ssh 目录的权限

1
chmod -R go= .ssh

删除所有其他用户以及其他组对 .ssh 目录的所有(读、写以及执行)权限。

1
chown -R username:username .ssh

.ssh 目录的所有权更改为 username 用户。

使用 SSH 密钥登录服务器

将公钥上传至服务器后,在本地命令行中执行:

1
ssh username@hostname

若在 1. 中生成密钥对时未设置密钥密码,此时可直接登录至服务器,否则需要输入密钥密码。

禁用密码登录服务器

在确保可使用 SSH 密钥登录服务器后,建议禁用密码登录服务器,以避免针对服务器的暴力破解攻击。

在进行下列操作前,请确保 root 用户可通过SSH 密钥登录服务器或可使用 SSH 密钥登录服务器的账号拥有 root 权限。参考在服务器上新建账户并赋予 root 权限为普通用户赋予 root 权限。

修改 SSH 配置文件

通过有 root 权限的账号登录服务器后,执行

1
sudo vim /etc/ssh/sshd_config

打开 SSH 后台驻留进程的配置文件,找到名为 PasswordAuthentication 的指令。若该指令被注释,即前有 # ,则删除该命令前的 # 并将其后的值改为 no ,禁用密码登录服务器。

1
2
3
...
PasswordAuthentication no
...

重启 sshd 服务

1
sudo systemctl restart sshd

此时为保险起见,在本地打开一个新的命令行窗口,使用 SSH 密钥再次尝试登录上述拥有 root 权限的账号,确认可正常登录后可放心将所有账号退出服务器。 此后服务器仅支持 SSH 密钥登录,禁用密码登录。

恢复密码登录服务器

若希望重新启用密码登录服务器,可将服务器上 /etc/ssh/sshd_config 文件中 PasswordAuthentication 指令的值改为 yes,或在该指令前加 # 注释该指令。


参考资料:

0%