蚊章汇 - Jeff Cogswell
type: channel
link: https://linuxcn.bwsl.wang/author/350/
description: Jeff Cogswell
items: 在 Linux 上管理加密密钥的最佳体验

在 Linux 上管理加密密钥的最佳体验
type: item
date: 2016-07-11T18:02:00+08:00
description: 存储 SSH 的加密秘钥和记住密码一直是一个让人头疼的问题。但是不幸的是，在当前这个充满了恶意黑客和攻击的世界中，基本的安全预防是必不可少的。对于许多普通用户来说，大多数人只能是记住密码，也可能寻找到一个好程序去存储密码，正如我们提醒这些用户不要在每个网站采用相同的密码。但是对于在各个 IT 领域的人们，我们需要将这个事情提高一个层面。我们需要使用像 SSH 密钥这样的加密秘钥，而不只是密码。设想一个场景：我有一个运行在云上的服务器，用作我的主 git 库。我有很多台工作电脑，所有这些电脑都需要登录到这个中央服务器去做 push 与 pull 操作。这里我设置 git 使用 SSH。当 git 使用 SSH 时，git 实际上是以 SSH 的方式登录到服务器，就好像你通过 SSH 命令打开一个服务器的命令行一样。为了把这些配置好，我在我的 .ssh 目录下创建一个配置文件，其中包含一个有服务器名字、主机名、登录用户、密钥文件路径等信息的主机项。之后我可以通过输入如下命令来测试这个配置是否正确。ssh gitserver 很快我就可以访问到服务器的 bash shell。现在我可以配置 git 使用相同配置项以及存储的密钥来登录服务器。这很简单，只是有一个问题：对于每一个我要用它登录服务器的电脑，我都需要有一个密钥文件，那意味着需要密钥文件会放在很多地方。我会在当前这台电脑上存储这些密钥文件，我的其他电脑也都需要存储这些。就像那些有特别多的密码的用户一样，我们这些 IT 人员也被这些特别多的密钥文件淹没。怎么办呢？清理在我们开始帮助你管理密钥之前，你需要有一些密钥应该怎么使用的基础知识，以及明白我们下面的提问的意义所在。同时，有个前提，也是最重要的，你应该知道你的公钥和私钥该放在哪里。然后假设你应该知道：公钥和私钥之间的差异；为什么你不可以从公钥生成私钥，但是反之则可以？authorized_keys 文件的目的以及里面包含什么内容；如何使用私钥去登录一个你的对应公钥存储在其上的 authorized_keys 文件中的服务器。这里有一个例子。当你在亚马逊的网络服务上创建一个云服务器，你必须提供一个用于连接你的服务器的 SSH 密钥。每个密钥都有一个公开的部分（公钥）和私密的部分（私钥）。你要想让你的服务器安全，乍看之下你可能应该将你的私钥放到服务器上，同时你自己带着公钥。毕竟，你不想你的服务器被公开访问，对吗？但是实际上的做法正好是相反的。你应该把自己的公钥放到 AWS 服务器，同时你持有用于登录服务器的私钥。你需要保护好私钥，并让它处于你的控制之中，而不是放在一些远程服务器上，正如上图中所示。原因如下：如果公钥被其他人知道了，它们不能用于登录服务器，因为他们没有私钥。进一步说，如果有人成功攻入你的服务器，他们所能找到的只是公钥，他们不可以从公钥生成私钥。同时，如果你在其他的服务器上使用了相同的公钥，他们不可以使用它去登录别的电脑。这就是为什么你要把你自己的公钥放到你的服务器上以便通过 SSH 登录这些服务器。你持有这些私钥，不要让这些私钥脱离你的控制。但是还有一点麻烦。试想一下我 git 服务器的例子。我需要做一些抉择。有时我登录架设在别的地方的开发服务器，而在开发服务器上，我需要连接我的 git 服务器。如何使我的开发服务器连接 git 服务器？显然是通过使用私钥，但这样就会有问题。在该场景中，需要我把私钥放置到一个架设在别的地方的服务器上，这相当危险。一个进一步的场景：如果我要使用一个密钥去登录许多的服务器，怎么办？如果一个入侵者得到这个私钥，这个人就能用这个私钥得到整个服务器网络的权限，这可能带来一些严重的破坏，这非常糟糕。同时，这也带来了另外一个问题，我真的应该在这些其他服务器上使用相同的密钥吗？因为我刚才描述的，那会非常危险的。最后，这听起来有些混乱，但是确实有一些简单的解决方案。让我们有条理地组织一下。（注意，除了登录服务器，还有很多地方需要私钥密钥，但是我提出的这个场景可以向你展示当你使用密钥时你所面对的问题。）常规口令当你创建你的密钥时，你可以选择是否包含一个密钥使用时的口令。有了这个口令，私钥文件本身就会被口令所加密。例如，如果你有一个公钥存储在服务器上，同时你使用私钥去登录服务器的时候，你会被提示输入该口令。没有口令，这个密钥是无法使用的。或者你也可以配置你的密钥不需要口令，然后只需要密钥文件就可以登录服务器了。一般来说，不使用口令对于用户来说是更方便的，但是在很多情况下我强烈建议使用口令，原因是，如果私钥文件被偷了，偷密钥的人仍然不可以使用它，除非他或者她可以找到口令。在理论上，这个将节省你很多时间，因为你可以在攻击者发现口令之前，从服务器上删除公钥文件，从而保护你的系统。当然还有一些使用口令的其它原因…