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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!