公钥和私钥 SSH 密钥的好处
如果您的无头或远程 VPS 可以通过互联网访问,您应该尽可能使用公钥身份验证而不是密码。这是因为与仅使用密码相比,SSH 密钥提供了一种更安全的登录方式。虽然密码最终可以通过暴力破解攻击破解,但 SSH 密钥几乎不可能仅通过暴力破解来解密。使用公钥身份验证,每台计算机都有 (i) 公钥 和 (ii) 私钥 “密钥”(两个数学上相关的算法,几乎不可能被破解)。
如今,OpenSSH 是类 Unix 系统(如 Linux 和 OS X)上的默认 SSH 实现。基于密钥的身份验证是 OpenSSH 可用的几种身份验证模式中最安全的,其他身份验证方法仅在非常特定的情况下使用。SSH 可以使用 “RSA”(Rivest-Shamir-Adleman)或 “DSA”(“数字签名算法”)密钥。当 SSH 被发明时,这两种算法都被认为是最先进的算法,但近年来 DSA 已被视为不太安全。RSA 是新密钥的唯一推荐选择,因此本教程将 “RSA 密钥” 和 “SSH 密钥” 互换使用。
当您登录到您的 DigitalOcean VPS 时,SSH 服务器使用公钥以一种只能由您的私钥 “解锁” 消息的方式来 “锁定” 消息。这意味着即使是最有资源的攻击者也无法窥视或干扰您的会话。作为额外的安全措施,一些用户和大多数 SSH 程序以受密码保护的格式存储私钥,以提供一段时间,在此期间您可以禁用已被入侵的公钥,如果您的计算机被盗或被入侵。因此,对于大多数人来说,公钥身份验证是比密码更好的解决方案。事实上,通过不在私钥上使用密码短语,您将能够自动化配置管理的部分内容,例如增量离线备份、通过 DigitalOcean API 管理您的 DigitalOcean 资产等。
基于密钥的 SSH 登录
您可以在尽可能多的云服务器上保存相同的公钥,而您的私钥保存在您登录到服务器的客户端上。然后,您可以禁用正常的用户名/密码登录过程,这意味着只有拥有有效的私钥/公钥对的人才能登录;这样可以使您的系统更安全,因为它将不受暴力破解攻击的影响。
自动创建新的 Droplets
SSH 密钥可以发挥的另一个有用作用是在创建 DigitalOcean droplets 时。正如您所知,当您启动 droplet 时,您必须等待一封带有密码的电子邮件。虽然这封电子邮件非常方便,但有一种更安全(和更快)的方法可以访问您的新云服务器,而无需电子邮件。这可以通过在 DigitalOcean 控制面板 中保存您的公钥来实现。要实现这一点:
- 首先完成本教程中标题为 Generating OpenSSH-compatible Keys for Use with PuTTY 的部分。
- 然后,跳到 How to Use SSH Keys with DigitalOcean Droplets 的 Step Three 部分。
先决条件
本教程假设您熟悉 DigitalOcean 的 How to Log Into Your Droplet with PuTTY (for windows users) 指南。
PuTTY 密钥生成器(又名 PuTTYgen)
虽然 PuTTY 是 SSH(以及 Telnet 和 Rlogin)的客户端程序,但它不是基于 OpenSSH 的端口或其他形式。因此,PuTTY 不支持原生读取 OpenSSH 的 SSH-2 私钥文件。然而,PuTTY 有一个名为 PuTTYgen 的伴侣(一个 RSA 和 DSA 密钥生成实用程序),它可以将 OpenSSH 私钥文件转换为 PuTTY 的格式;从而允许您使用 SSH 密钥从 Windows 计算机连接到您的云服务器,同时提供 SSH 密钥提供的额外安全性。
PuTTYgen 是一个(免费)开源实用程序,可以从 维护者的网站 下载。PuTTYgen 是您将用于生成用于 PuTTY 的 SSH 密钥的工具。首先,您只需要下载可执行文件(.exe)并将其保存在您将用于连接到 VPS 的计算机上,例如桌面。您 不需要 “安装” PuTTYgen,因为它是一个独立的应用程序。
生成用于 PuTTY 的 OpenSSH 兼容密钥
要使用 PuTTYgen 生成一组 RSA 密钥:
- 双击其 .exe 文件启动 PuTTYgen 实用程序;
- 对于 要生成的密钥类型,选择 RSA;
- 在 生成的密钥中的位数字段中,指定 2048 或 4096(增加位数会使通过暴力破解方法破解密钥变得更加困难);
- 单击 Generate 按钮;
- 在 密钥 部分的空白区域中移动鼠标指针(以生成一些随机性),直到进度条填满;
- 现在已生成了一对私钥/公钥;
- 在 密钥注释字段中,输入 任何 您喜欢的注释,以帮助您稍后识别此密钥对(例如您的电子邮件地址;家庭;办公室等)-- 在您最终创建多个密钥对的情况下,密钥注释特别有用;
- 可选:在 密钥密码短语字段中输入密码短语,并在 确认密码短语字段中重新输入相同的密码短语(如果您希望将密钥用于自动化流程,则不应创建密码短语);
- 单击 保存公钥 按钮,并选择任何您喜欢的文件名(一些用户在计算机上创建一个名为 my_keys 的文件夹);
- 单击 保存私钥 按钮,并选择任何您喜欢的文件名(您可以将其保存在与公钥相同的位置,但它应该是只有您可以访问且您不会丢失的位置!如果您丢失了密钥并且已禁用了用户名/密码登录,您将无法再登录!);
- 在标有 用于粘贴到 OpenSSH authorized_keys 文件的公钥 的文本字段中右键单击,并选择 全选;
- 再次在相同的文本字段中右键单击,并选择 复制。
注意: PuTTY 和 OpenSSH 使用不同的格式来存储公共 SSH 密钥。如果您复制的 SSH 密钥 以 “---- BEGIN SSH2 PUBLIC KEY …” 开头,则它的格式是错误的。请务必仔细遵循说明。您的密钥应该以 “ssh-rsa AAAA …” 开头。
在服务器上保存公钥
现在,您需要将复制的公钥粘贴到服务器上的文件 ~/.ssh/authorized_keys 中。
- 登录到您的目标服务器;参见 How to Log Into Your Droplet with PuTTY (for windows users)
- 如果您的 SSH 文件夹尚不存在,请手动创建它:
mkdir ~/.ssh chmod 0700 ~/.ssh touch ~/.ssh/authorized_keys chmod 0644 ~/.ssh/authorized_keys
- 将 SSH 公钥粘贴到您的 ~/.ssh/authorized_keys 文件(参见 Installing and Using the Vim Text Editor on an Cloud Server):
sudo vim ~/.ssh/authorized_keys
- 按键盘上的
i
键,然后右键单击鼠标以粘贴。 - 要保存,请按键盘上的以下键(按此顺序):
Esc
、:
、w
、q
、Enter
。
创建 PuTTY 配置文件以保存服务器设置
在 PuTTY 中,您可以创建(并保存)用于连接到各种 SSH 服务器的配置文件,这样您就不必记住并不断重新输入冗余信息。
- 双击其可执行文件启动 PuTTY;
- PuTTY 的初始窗口是 会话 类别(在窗口的左侧导航到 PuTTY 的各种类别);
- 在 主机名字段中,输入您的 VPS 的 IP 地址或其完全限定域名(FQDN);参见 How to Set Up a Host Name with DigitalOcean
- 在 端口字段中输入端口号(为了增加安全性,考虑将服务器的 SSH 端口更改为非标准端口。 参见 Initial Server Setup with Ubuntu 12.04)
- 在 协议下选择 SSH;
- 在窗口的左侧选择 连接 下的 数据 子类别;
- 在 自动登录用户名字段中指定您打算在登录到 SSH 服务器时使用的用户名,并保存您正在保存的配置文件;
- 展开 连接 下的 SSH 子类别;
- 高亮显示 Auth 子类别,然后单击 PuTTY 窗口右侧的 浏览 按钮;
- 浏览您的文件系统并选择先前创建的私钥;
- 返回到 会话 类别,并在 保存的会话字段中输入此配置文件的名称,例如 user@123.456.78.9 或 user@host.yourdomain.tld;
- 单击 保存 按钮以保存 加载、保存或删除存储的会话 区域中的配置文件。
现在,您可以继续登录到 user@1.2.3.4,您将 不会 被提示输入密码。但是,如果您在公钥上设置了密码短语,那么您将被要求在那时(以及将来每次登录时)输入密码短语。
禁用用户名/密码登录
一旦您验证了基于密钥的登录是否正常工作,您可以选择禁用用户名/密码登录以获得更好的安全性。要做到这一点,您需要编辑您的 SSH 服务器配置文件。在 Debian/Ubuntu 系统上,此文件位于 /etc/ssh/sshd_config。
sudo vim /etc/ssh/sshd_config
按键盘上的 i
键,编辑下面引用的行:
[...] PasswordAuthentication no [...] UsePAM no [...]
要保存,请按键盘上的以下键(按此顺序):Esc
、:
、w
、q
、Enter
。现在,重新加载 SSH 服务器的配置:
sudo reload ssh