Linux 服务器使用 ssh 密钥登录

背景#

我们平时登录云服务器都是直接输入 IP、账号、密码进行登录,这种方式当是你自己的服务器的时候就没什么关系。

但是如果在企业中,当员工人数日渐增多时,又需要给后端开放测试服务器、或正式服务器的权限时。

不得不面临的一个问题就是当其中一个员工离职时,需要修改服务器的密码。

这样就会变得有些繁琐和麻烦。

所以这次就来配置使用 ssh 密钥来登录服务器,员工在自己的本机上生成密钥和公钥,然后将公钥发给领导在服务器上配置好。

员工使用本地的密钥登录服务器。

当员工离职时,只需要在服务器上将这个员工的公钥删除就可以了。

SSH 支持各种身份验证机制。最常见的两种是基于密码和基于公钥的身份验证。公钥的身份验证是基于数字的签名,并且比传统的密码身份验证更安全,更方便。

这里我们就是使用基于公钥的身份验证。

操作#

1. 本地生成密钥和公钥#

生成 SSH 密钥的命令是 ssh-keygen。你可以不使用任何参数直接生产 SSH 私钥与公钥。也可以使用您的电子邮件地址作为注释来生成新的 4096 位 SSH 密钥对。

ssh-keygen #在你的本地计算机生成ssh密钥
ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"

系统将提示您指定文件名 Enter file in which to save the key (/home/myfreax/.ssh/id_rsa):。默认位置和文件名应该适合大多数用户。 按 Enter 接受并继续

接下来,系统会要求您输入安全密码或者称为密码短语 Enter passphrase (empty for no passphrase):。密码短语增加了一层额外的安全性。

如果您设置密码短语,则每次使用该密钥登录到远程计算机时,系统都会提示您输入密码短语。如果您不想设置密码短语,请按 Enter

如果你没有什么特别的要求你在运行 ssh-keygen 命令,全部直接回车 Enter 键使用默认值创建 SSH 密钥即可。

要验证是否生成了新的 SSH 密钥对,请运行命令 ls ~/.ssh/id_* 查看 SSH 密钥是否存在。如果存在说明您已经在 CentOS Linux 计算机成功生成了 SSH 密钥。

/home/myfreax/.ssh/id_rsa 
/home/myfreax/.ssh/id_rsa.pub

2. 将公钥复制到远程服务器#

现在您本地 CentOS 计算机有了 SSH 密钥,下一步是将公用密钥复制到要管理的远程服务器。

将公钥复制到服务器的最简单和建议的方法是使用 ssh-copy-id 命令。运行命令 ssh-copy-id server_username@server_ip_address 即可复制远程服务器。

server_username 是远程服务器用户的名称,server_ip_address 是你的服务器 IP 地址。系统将提示您输入远程用户密码。

通过身份验证后,公钥 ~/.ssh/id_rsa.pub 将追加到远程用户 ~/.ssh/authorized_keys 文件中,然后 ssh-copy-id 将会退出。

并且提示你可以运行命令 ssh 'username@server_ip_address' 登录到远程服务器。

ssh-copy-id remote_username@server_ip_address
remote_username@server_ip_address's password:

如果由于某些原因您的本地计算机上没有 ssh-copy-id 实用程序,请使用以下命令复制公钥。

cat ~/.ssh/id_rsa.pub | ssh remote_username@server_ip_address "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'username@server_ip_address'"
and check to make sure that only the key(s) you wanted were added.

3. 修改服务器 sshd_config 配置文件#

要允许使用密钥(公钥 / 私钥)登录,需要修改 /etc/ssh/sshd_config 文件中以下几个配置:

PubkeyAuthentication 设置为 yes,表示启用公钥认证方式。

AuthorizedKeysFile 设置为存储公钥的路径和文件名,例如:AuthorizedKeysFile ~/.ssh/authorized_keys,表示公钥文件存储在当前用户的 .ssh 目录下的 authorized_keys 文件中。

PasswordAuthentication 设置为 no,表示禁用密码认证方式,只允许使用公钥认证方式登录。这样可以增加系统的安全性。

修改完以上配置后,需要重启 sshd 服务,以使配置生效。可以使用以下命令重启 sshd 服务:

sudo systemctl restart sshd

完成上述步骤后,您应该能够免密码登录到远程服务器。要测试它,请尝试通过 SSH 登录到服务器。

如果您尚未设置私钥的密码短语,则会立即登录。 否则,将提示您输入密码。

ssh remote_username@server_ip_address

禁用 SSH 密码身份验证#

禁用密码身份验证会为服务器增加一层安全保护。在禁用 SSH 密码身份验证之前,请确保您可以免密码登录服务器,并且你登录用户具 sudo 权限。

首先登录到您的远程服务器,然后使用你喜欢的文本编辑器打开 SSH 配置文件 /etc/ssh/sshd_config。在本教程中,我们将使用 vim 打开文件

使用 vim 搜索 PasswordAuthentication,ChallengeResponseAuthentication,UsePAM 指令并改为 no。

完成后,保存文件并运行命令 sudo systemctl restart sshd 重新启动 SSH 服务。此时,基于密码的身份验证已被禁用,你将不能使用密码登录。

注意:禁用密码登录后,请保管好你的 SSH 密钥文件,如果 VPS 提供商提供 VNC 远程控制可以很容易恢复,如果没有就……..。

ssh sudo_user@server_ip_address

sudo vim /etc/ssh/sshd_config #在你的服务器上

sudo systemctl restart sshd #在你的服务器上
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

结论#

我们向您展示了如何生成 SSH 密钥对以及如何设置基于 SSH 密钥的身份验证。您可以使用同一密钥来管理多个远程服务器。您还了解了如何禁用 SSH 密码身份验证。

默认情况下,SSH 监听端口 22。更改默认的 SSH 端口可降低自动攻击的风险。为了简化您的工作流程,请使用 SSH 配置文件定义您的所有 SSH 连接。

问题#

在实际操作中可能会有把以上所有的步骤都走完后,发现还是无法通过 ssh 密钥登录的情况。

这种情况一般都是因为文件的所属用户或文件的权限不对导致的。

  1. 查看本地的 ~/.ssh/id_rsa 文件的权限是否是 600 (即只有当前用户可以读写该文件),通过 chmod 600 ~/.ssh/id_rsa 命令赋予权限。

  2. 查看服务器中的 /root/.ssh/authorized_keys 是不是 600 权限。

  3. 查看服务器中的 /root 目录的所属用户是不是 root,使用 chown root:root /root 对该目录更改所属用户。

番外#

如何对本地已有的 id_rsa 密钥设置密码?#

您可以使用以下命令对本地已有的 id_rsa 密钥设置密码:

ssh-keygen -p -f ~/.ssh/id_rsa

命令中的 -p 参数表示修改密码,-f 参数指定要修改密码的密钥文件。执行命令后,系统会提示您输入旧密码(如果有的话),然后要求您输入新密码两次以确认。完成后,您的 id_rsa 密钥文件就被加密了。下次使用该密钥时,需要输入密码才能使用。

如何去除密码?#

如果您想要去除本地已有的 id_rsa 密钥的密码,可以使用以下命令:

ssh-keygen -p -f ~/.ssh/id_rsa -P <old_password> -N ""

命令中的 -p 参数表示修改密码,-f 参数指定要修改密码的密钥文件,-P 参数指定原来的密码,-N 参数指定新的密码。在这个命令中,我们将新密码设置为空字符串,这样就相当于去除了原来的密码。

执行命令后,系统会提示您输入旧密码(如果有的话),然后将新密码设置为空字符串。完成后,您的 id_rsa 密钥文件就被去除了密码。下次使用该密钥时,无需输入密码即可使用。

参考文章#

ssh authentication doesnt allow public key
如何在 CentOS 7 配置 SSH 密钥免密码登录
centos7 使用密钥登录

本作品采用《CC 协议》,转载必须注明作者和本文链接