介绍
SSH是连接到远程Linux服务器的主要方式。 保护此渠道对于维护安全的基础设施至关重要。 通过SSH对远程服务器进行身份验证的最常见方法是使用公钥/私钥对。 将公钥添加到远程服务器上的授权密钥列表中,并准备就绪。
更困难的问题是如何安全地存储您的私钥。
通常,开发人员将他们的私钥存储在~/.ssh
目录中。 但是,您可以使用简单的cat ~/.ssh/id_rsa
命令读取您的私钥。 您的机器上的任何应用程序都可能会读取您的SSH私钥,即使它是使用密码加密的。
这种安全风险的一个常见解决方案是添加第二个因素(即启用多因素身份验证或MFA )。 这样做的缺点是双重的:设置成本和可用性。 对于您创建的每个服务器,您必须将OpenSSH服务器配置为使用OATH-TOTP PAM模块并将共享密码加载到该模块。 这是一个耗时的过程,有很多地方犯错误。 此外,每次SSH进入您的服务器时,您必须在手机上打开一个应用程序,读取六位数的代码,然后将其输入终端。 这可以大大减慢您的工作流程。
为了避免配置MFA的缺点,开发人员经常使用USB硬件安全模块(HSM),如NitroKey或YubiKey来生成和存储SSH公私钥。 这些是保存您的SSH密钥对的小型USB设备。 每次要SSH进入服务器时,都可以将USB设备插入计算机,然后按设备上的按钮。
但HSM是昂贵的; SSH兼容设备的成本高达50美元。 这是另一种可以随身携带的设备,每次SSH进入服务器时,都必须将USB设备插入计算机并按下物理按钮。 USB HSM通常也没有任何显示屏幕,所以您不知道您实际上正在批准哪个登录,并且没有办法查看已验证的审核日志。
Kryptonite是保护您的SSH私钥的新解决方案。 它是免费的,易于设置,用户友好,并具有额外的内置安全保护。 它不需要服务器端更改,并允许您通过推送通知您的手机(不打开应用程序)来批准登录请求。 无论使用哪个机器或服务器,您都可以在手机上随时随地使用已知的主机。
在本指南中,您将在手机上与Kryptonite生成一个SSH密钥对,将手机与本地计算机配对,并使用Kryptonite将SSH加入到DigitalOcean Droplet中。
先决条件
要遵循本指南,您将需要:
- 一个DigitalOcean Droplet运行任何Linux发行版。
- 智能手机:iPhone(iOS 9.1或更高版本)或Android(6.0或更高版本)。
- 运行macOS(10.10或以上),Ubuntu,Debian,RHEL,CentOS,Fedora或Kali Linux的个人计算机。
第1步 - 生成Kryptonite密钥对
第一步是通过在iOS或Android手机上访问get.krypt.co来下载Kryptonite应用程序。
安装应用程序后,打开它并点击生成密钥对来创建您的Kryptonite SSH密钥对。 如果您想要识别您的公开密钥(或跳过此步骤),请输入电子邮件。
接下来,您需要安装Kryptonite的命令行实用程序。
第2步 - 安装kr
下一步继续在您的本地计算机上。 您需要安装kr
命令行实用程序 ,该实用程序使SSH能够使用存储在Kryptonite中的密钥进行身份验证。 您可以安装kr
与您首选的软件包管理器(如npm
或brew
)或者简单地使用curl
,我们将在这里做。
出于安全考虑,如果要在安装之前检查安装脚本,可以运行curl https://krypt.co/kr > install_kr
并查看。 您可以阅读更多关于它的工作原理以及在kr文档中安装的替代方法。
准备好后,安装kr
。
curl https://krypt.co/kr | sh
系统将要求您启用推送通知。 这是Kryptonite通过推送通知发送登录批准请求所必需的。
现在你有应用程序,密钥对和kr
,下一步是将您的计算机与Kryptonite配对。
第3步 - 将Kryptonite与您的计算机配对
kr
成功安装后,运行:
kr pair
终端中将显示QR码。 如果您的终端窗口很小,您可能需要使其更大,以便整个QR码可见或使字体大小更小。
在Kryptonite应用程序中,点击屏幕底部的允许相机访问 。 相机出现后,请扫描终端中的QR码。 几秒钟后,Kryptonite应用程序将显示成功的配对,终端将打印出您的Kryptonite SSH公钥。
我们来测试一下这个钥匙对的工作原理。
第4步 - 使用Kryptonite测试SSH
要检查一切正常,尝试SSHing进入公众me.krypt.co
服务器:
ssh me.krypt.co
您会注意到Kryptonite应用程序中出现一个请求,要求您通过三个选项批准SSH身份验证:
- 允许一次只允许这一个请求登录
me.krypt.co
。 - 允许1小时批准此请求以及来自配对计算机的下一个小时的其他SSH登录请求。 当这些登录发生时,您仍然会收到通知,但会自动获得批准。
- 拒绝丢弃此请求,SSH登录在计算机上失败(或退回到本地密钥)。
点击允许一次 。 您将看到一个成功的SSH登录到me.krypt.co
,这将很快退出伪shell并显示屏蔽徽标。
如果您锁定设备并再次尝试SSH到me.krypt.co
,它将使用预期命令向您的设备发送推送通知,请求您从锁定屏幕获得批准。
第5步 - 将您的Kryptonite Pubkey添加到DigitalOcean
现在Kryptonite与您的计算机配对,您可以快速将公钥添加到通过SSH使用的所有服务器和工具。
要将您的公钥添加到DigitalOcean,请运行以下命令:
kr digitalocean
您将看到输出与DigitalOcean特定的说明,如下所示:
OutputPublic key copied to clipboard.
Press ENTER to open your web browser to DigitalOcean.
Then click “Add SSH Key” and paste your public key.
这是你下一步需要做的事情
- 从终端按
ENTER
自动导航到DigitalOcean设置页面,如有必要,登录。 - 单击添加SSH密钥 。
- 粘贴在您的Kryptonite公钥。
- 单击保存 。
您可以在DigitalOcean教程的第3步中找到有关在此第3步中添加SSH密钥的详细说明。
将您的密钥上传到DigitalOcean可以轻松将其添加到新的Droplet中。 创建服务器时,只需选择Kryptonite键的框。 接下来,我们将这个键添加到一个现有的Droplet中。
第6步 - 将您的Kryptonite Pubkey添加到现有的Droplet中
kr
命令行工具可用于将您的Kryptonite公钥添加到已使用本地SSH密钥或密码访问的已经运行的Droplet。
运行以下命令将Kryptonite公钥添加到Droplet的授权用户文件中,确保替换您的用户名和您的Droplet的IP地址。
kr add user@your_server_ip
一旦你这样做,通过尝试SSH进行测试,它的工作原理。
ssh user@your_server_ip
您将在手机上获得Kryptonite SSH登录请求。
结论
现在您已经设置了Kryptonite,并将您的Kryptonite公钥成功添加到了DigitalOcean帐户中,您现在可以从任何配对的计算机上SSH到任何一个Droplet。
您的私人密钥安全地存储在您的手机上,永远不会离开您的设备。 当您允许请求时,私钥用于在您的设备上本地加密地签署SSH登录凭证。 然后将此签名发送回您的计算机以完成SSH身份验证。
有关Kryptonite如何工作的更多信息,请查看Kryptonite的系统架构博客文章和Kryptonite和kr
源代码 。