Skip to main content

如何在12.04版本Ubuntu中设置安全密钥

作者 Etel Sverdlov,Brian Boucheron

导语

安全外壳协议(或SSH)是一种加密网络协议,使用户即使使用不安全的网络也能安全地访问远程计算机。

虽然SSH可以用密码进行身份验证,但改用密钥更好。用密钥登录SSH服务器更安全,也更不容易受到常见的暴力密码型黑客攻击。

生成SSH密钥组会创建两个长字符串:公钥和私钥。公钥可以放在任何服务器上,然后用能访问私钥的SSH客户端可以连接到这个服务器上。

如果公钥与私钥匹配,那么无需密码即可访问SSH服务器。强烈建议使用密码句(passphrase)来进一步提高密钥组的安全性。

第一步:创建密码组

第一步,在客户机上创建密码组,通常可能是在用户的本地电脑上。需在本地命令行中输入以下命令:

$ ssh-keygen -t ed25519

Output

Generating public/private ed25519 key pair.

命令行会输出开始生成密钥的确认信息,而且会需要用户再输入一些信息,下一步会进行介绍。

注:如果用户使用的是较老的系统,不支持创建 ed25519 密钥组,或用户要连接的服务器不支持该密钥组,可以创建复杂的 rsa 密码组作为代替:

$ ssh-keygen -t rsa -b 4096

此行命令中将 -t 表示的“类型”标记后的 ed25519 改为了 rsa,还增加了 -b 4096 “比特”标记表示创建了一个4096比特的密钥。

第二步:指定密钥的保存位置

ssh-keygen 指令会先提示需要用户输入储存密钥的位置:

Output

Enter file in which to save the key (/home/sammy/.ssh/id_ed25519):

可以按 ENTER 键将文件储存在home路径下 .ssh 路径中的默认位置,也可以在提示后输入别的文件名或路径,然后按下 ENTER 键。

第三步:创建密码句

ssh-keygen 命令的第二个,也是最后一个提示会需要用户输入一个密码句:

Output

Enter passphrase (empty for no passphrase):

用户可以自行决定是否使用密码句,但强烈建议使用,因为无论如何加密,只有其他人无法访问,密钥组才是安全的。如果没有密码句的私钥落入未经授权的用户手中,他们就能登录相关公钥配置的任何服务器。

而使用密码句的主要缺点——输入密码句——可以通过使用 ssh-agent 服务解决。ssh代理可以临时储存用户已解锁的密钥,并使SSH客户端可以访问这个密钥。许多这种代理都会与操作系统的本地密码链集成,使解锁过程更加丝滑。

回顾以上,整个密钥生成过程如下所示:

ssh-keygen -t ed25519

Output

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/sammy/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sammy/.ssh/id_ed25519
Your public key has been saved in /home/sammy/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:EGx5HEXz7EqKigIxHHWKpCZItSj1Dy9Dqc5cYae+1zc sammy@hostname
The key's randomart image is:
+--[ED25519 256]--+
| o+o o.o.++ |
|=oo.+.+.o + |
|*+.oB.o. o |
|*. + B . . |
| o. = o S . . |
|.+ o o . o . |
|. + . ... . |
|. . o. . E |
| .. o. . . |
+----[SHA256]-----+

现在,公钥在 /home/sammy/.ssh/id_ed25519.pub 路径下,私钥在 /home/sammy/.ssh/id_ed25519 路径下。

第四步:将公钥复制到服务器

密码组生成后,就可以将公钥复制到需要连接的服务器上了。可以用 ssh-copy-id 命令将公钥复制到服务器的 authorized_keys 文件中。在使用时,注意替换掉以下例子中的用户名与路径:

ssh-copy-id sammy@your_server_address

指令生效后,通过SSH登录服务器将不再需要密码。然而,如果在创建SSH密钥时也设置了密码句,登录时会需要输入密码句。这是本地 ssh 客户端的要求,用来解密私钥,并不是远程服务器还需要密码登录。

第五步:禁用使用密码进行SSH身份验证(可选)

将密码复制到服务器中后,可以通过配置SSH服务,禁用使用密码进行身份验证,从而彻底禁止用密码登录服务器。

警告:在禁用密码身份验证前,必须确认已成功使用SSH密钥登录服务器,且服务器中没有其他用户使用密码登录。

要禁用SSH密码身份验证,需打开SSH配置文件,通常在以下路径中:

$ sudo nano /etc/ssh/sshd_config

此命令会在 nano 编辑器中打开一个文件。在这个文件中找到包含 PasswordAuthentication 的一行(如果没有则需要手动输入),确认它没有被注释掉,即不以 # 开头后,设置它为 no

/etc/ssh/sshd_config
PasswordAuthentication no

完成后,保存并退出文件。在 nano 编辑器中,可以按 CTRL+0 保存,按 ENTER 确认文件名,再按 CTRL+X 退出。然后重启 sshd 服务,让这些改动生效:

$ sudo systemctl reload sshd

退出现有SSH前,可以尝试用另外一个终端连接服务器做为测试,以确保还可以连接到服务器。

结语

本教程主要介绍了如何创建SSH密钥组、复制公钥到服务器中以及如何禁用密码身份验证(可选)。