SSH全称Secure shell是一种加密的网络通讯协议,旨在用于客户端和服务器之间的安全连接。

基于密码的身份验证和基于公钥的身份验证是最流行的SSH身份验证机制。与传统的密码身份验证相比,使用SSH密钥通常更安全,更方便。

本教程说明如何在CentOS 8系统上生成SSH密钥。包括使用ssh-keygen命令生成创建SSH密钥对,使用ssh-copy-id命令将SSH公钥复制到远程服务器,配置SSH无密码登录,禁用SSH密码登录,如何在不输入密码的情况下连接到远程Linux服务器。设置基于SSH公钥的身份验证。

创建SSH密钥

如果您的CentOS客户端计算机上还没有SSH密钥。 您需要生成新的密钥对。如果已经存在SSH的密钥对,则旧的密钥对将被覆盖。

SSH密钥对存储在用户的家目录~/.ssh中,.ssh是一个隐藏目录。如果你计算机已经存在SSH密钥对,你将会看到id_rsaid_rsa.pub文件。

如需确定CentOS计算机是否已经存在SSH密钥对,运行以下ls命令检查密钥文件是否存在:

ls -l ~/.ssh/id_*.pub

如果命令的输出返回类似No such file or directory文件没有找到或no matches found的信息,则表示当前用户还没有SSH密钥,您可以继续下一步为当前用户生成SSH密钥对。

否则,如果您拥有SSH密钥对,则可以使用这些SSH密钥。如果你不再使用这些SSH密钥,则可以使用ssh-keygen命令重新生成并覆盖元原来的SSH密钥。

以下ssh-keygen命令将使用您的电子邮件地址作为注释。并生成4096位的SSH密,你也可以不使用任何参数运行ssh-keygen

ssh-keygen -t rsa -b 4096 -C "[email protected]"

系统将提示您指定id_rsaid_rsa.pub文件存储位置,一般情况我们不想要更改这个,这是SSH默认存储目录。

当你使用个ssh命令时,ssh会在~/.ssh目录中搜索密钥对的私有密钥,并使用该私钥与对等方的公钥进行解密,如果通过即可登录或者执行指定操作。

Enter file in which to save the key (/home/myfreax/.ssh/id_rsa):

Enter接受SSH设置默认位置存储id_rsaid_rsa.pub文件。

接下来,系统会要求您输入安全密码。是否要使用安全密码,由您自己决定。密码短语将增加额外的安全性。

但是当你为SSH的密钥对设置密码后,你将不能配置SSH的无密码登录,SSH会要求你输入安全密码,才可以登录到远程服务器。

在实际使用的情况下很多使用案例都是不需要安全密码,请按Enter跳过安全密码的设置。

Enter passphrase (empty for no passphrase):

下面是生成SSH密钥ssh-keygen命令的整个互动过程,输出将如下所示:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/myfreax/.ssh/id_rsa): 
Created directory '/home/myfreax/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/myfreax/.ssh/id_rsa
Your public key has been saved in /home/myfreax/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:sJexZ03nSundZOBoPH5NtNBu34m4yZNvrPLND0wlK7U [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|              .  |
|      . .   .+oo.|
|       o + +.*Bo.|
|      . S o.OEo++|
|       . o ==+o*+|
|           .*+o.=|
|         ..o=+.  |
|          o*=+.. |
+----[SHA256]-----+

至此,SSH密钥已经生成,你可以使用cat命令查看SSH密钥对id_rsaid_rsa.pub文件内容,已确定SSH密钥是否已经生成。注意,为了你的服务器或者计算机的安全,请不要随意公开你的SSH私钥。

以下cat命令将会打印SSH密钥对的公钥字符串:

cat ~/.ssh/id_rsa.pub

SSH密钥对的公钥内容输出将如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHbT9iN4sRIX9dheyis21kol68osdso/rDdHDszHMQnH5xmjRBjHoAS7bRyYc5nA8oKdxqcPse9vRcm4WuWahuJzxSdrxnQWkk8kyp8WjaKKPRocN8e0k6D29FfeunNH/vUP2HQgw0h6hgsGgFEnAYxujb2syrY8214IKL7gQiQj8qaYV82+OwFzDIHzodWWSRaB/vqas50YvFgZNa8F8TW+HQtO3tXc3ClZDfnDr3cZn4s3Kdfl2/YWtKSgpW8mRvIKsV0hsFUICuuOjKwFfPuZ2oKzLzdoIEF9idHQ7d0agRRvH1w6g8rjy7r4QRG9lEkndgkqVNCVRg15izmbRuhxr+V8KWBGFyPGRkGQjxni377OIbrZWWuGTuILdZALwagushBSvBk0PYQLmgRSchzWdoSSPJzVvvJ4Rcoz+EX7ZFV7Sjaxo8zIJfGpJgb0RAhOB4YrxundzQtFVic1rbUX6ufUHeoSIwMMIaasxrYJfI3ogshSI52ipmlXdogaM= [email protected]

现在您已在CentOS客户端计算机上成功生成SSH密钥对。

配置SSH无密码登录

现在你已生成SSH密钥对,下一步是将公钥复制到要管理的服务器。将公钥复制到远程服务器的最简单和建议的方法是使用ssh-copy-id命令。

如果你更改了SSH密钥对的存储位置,在运行ssh-copy-id命令时,你需要指定SSH密钥对的公钥的绝对路径。ssh-copy-id命令默认u复制~/.ssh/id_rsa.pub公钥到远程服务器

在本地计算机终端中运行以下ssh-copy-id将SSH公钥复制到远程服务器:

ssh-copy-id [email protected]_ip_address

ssh-copy-id命令将要求您输入远程服务器的用户的密码:

[email protected]_ip_address's password:

如输入的密码正确,用户将会通过身份验证,公钥文件~/.ssh/id_rsa.pub的内容将追加到远程用户~/.ssh/authorized_keys文件中。

ssh-copy-id命令将会退出并提示使用ssh '[email protected]_ip_address'命令登录到远程服务器。

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]_ip_address'"
and check to make sure that only the key(s) you wanted were added.

如果本地计算机上没有ssh-copy-id命令,请使用以下命令复制公钥到远程服务器。这是一个简单脚本它组合了管道和重定向等操作符实现复制公钥到服务器:

cat ~/.ssh/id_rsa.pub | ssh [email protected]_ip_address "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

SSH密钥登录

完成上述步骤后,您应该能够在不输入密码登录到远程服务器。要进行验证,请尝试通过SSH登录到服务器。

如果您尚未设置SSH私钥的安全密码,则会立即登录。否则,将要求您输入SSH密钥的安全密码。注意不是你的远程服务器用户的密码。

ssh [email protected]_ip_address

禁用SSH密码登录

要为远程服务器添加额外的安全层,您可以禁用SSH使用密码的身份验证方式。即在运行ssh命令时不能使用输出密码登录。

继续之前,请确保您在使用无密码登录时的用户具有的sudo权限。这一点非常重要,否则你无法切换到root用户执行高权限的命令。

如需禁用SSH密码的身份验证,请执行以下步骤,首先使用ssh命令客户端登录到远程服务器:

ssh [email protected]_ip_address

然后请使用你喜欢的文本编辑器修改文件/etc/ssh/sshd_config,在本教程中我们将使用vim编辑器打开文件/etc/ssh/sshd_config

请以root或具有sudo权限的用户运行以下vim命令修改文件/etc/ssh/sshd_config

sudo vim /etc/ssh/sshd_config

分别将PasswordAuthentication/ChallengeResponseAuthentication/UsePAM配置选改为no,这将禁用三种SSH身份验证方式,分别是密码,有挑战性的验证,PAM。

你可以使用vim的搜索命令找到这些配置项并改为no

PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
/etc/ssh/sshd_config

完成文件的编辑后,保存文件并退出vim编辑器,然后使用以下systemctl命令重新启动SSH服务:

sudo systemctl restart ssh

此时,基于密码的SSH身份验证已禁用,你将不能再以使用密码的方式登录到服务器。

结论

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

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

如果您有任何问题或反馈,请随时发表评论。