背景
我们平时登录云服务器都是直接输入 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 密钥登录的情况。
这种情况一般都是因为文件的所属用户或文件的权限不对导致的。
-
查看本地的
~/.ssh/id_rsa
文件的权限是否是 600 (即只有当前用户可以读写该文件),通过chmod 600 ~/.ssh/id_rsa
命令赋予权限。 -
查看服务器中的
/root/.ssh/authorized_keys
是不是 600 权限。 -
查看服务器中的 /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 密钥文件就被去除了密码。下次使用该密钥时,无需输入密码即可使用。
转载 https://learnku.com/articles/76375