用 PGP 保护代码完整性（七）：保护在线帐户
在这个系列的最后一篇当中，我们将为你展示如何用双因子认证保护你的在线账户。到目前为止，本系列教程已经提供了 PGP 的实用指南，包括基本概念和工具、生成和保护你的密钥的步骤。如果你错过了前面的文章，可以通过下面的链接查看。在本系列的最后一篇文章中，我们将为你保护在线帐户提供一个额外的指南，保护在线帐户是当今非常重要的一件事情。第一部分：基本概念和工具第二部分：生成你的主密钥第三部分：生成 PGP 子密钥第四部分：将主密钥移到离线存储中第五部分：将子密钥移到硬件设备中第六部分：在 Git 中使用 PGP清单取得一个具备 U2F 功能的设备（必要）为你的在线帐户启用双因子认证（必要）GitHub/GitLabGoogle社交媒体使用 U2F 作为主验证机制，使用 TOTP 作为备选（必要）考虑事项你可能注意到，很多在线开发者身份是捆绑了 email 地址的。如果有人能够访问你的邮箱，他们就能够去做一些对你会产生危害的事情，进而会损害你作为自由软件开发者的声誉。应该像保护你的 PGP 密钥那样保护你的 email 地址。使用 Fido U2F 的双因子认证双因子认证 是一种提升帐户安全性的机制，它除了要求用户名和密码之外，还要求一个物理令牌。它的目标是即便在有人窃取了你的密码（通过按键记录器、肩窥攻击或其它方式）的情况下，仍然能确保你的帐户安全，他们在没有得到你的一个专用的物理设备（“必备”的那个因子）的情况下，始终不能获取你的帐户。广为人知的双因子认证机制有：基于 SMS 的验证借助智能手机应用程序的基于时间的一次性令牌（TOTP），比如 Google Authenticator 或类似解决方案支持 Fido U2F 的硬件令牌基于 SMS 的验证很容易配置，但是它有如下的缺点：它在没有手机信号的地方无法使用（比如，建筑物的地下室），并且如果攻击者能够阻断或转向 SMS 信息，这种方式可能就会失败，比如通过克隆你的 SIM 卡。基于 TOTP 的多因子认证提供了比 SMS 更好的安全保护，但它也有一些重要的缺点（你要在智能手机中添加的那么多令牌中找到正确的那个）。此外，还不能避免一个事实，那就是你的密钥最终还是保存在你的智能手机中 —— 它是一个复杂的、全球连接的设备，它有可能还没有及时从制造商那儿收到安全补丁。更重要的是，不论是使用 TOTP 还是 SMS 的方法来保护你免受诱骗攻击 —— 如果诱骗攻击者能够窃取你的帐户密码和双因子令牌，他们就可以在合法的站点上使用它们，访问你的帐户。Fido U2F 是一个按标准开发的专用设备，它能够提供双因子认证机制来对付诱骗攻击。U2F 协议在 USB 令牌中保存每个站点的的唯一密钥，如果你在任何合法站点以外的地方尝试使用它，它将阻止你，以防范偶然让攻击者获得你的密码和一次性令牌。Chrome 和 Firefox 都支持 U2F 双因子认证，希望其它浏览器也能够提供对 U2F 的支持。获得一个支持 Fido U2F 功能的令牌支持 U2F 的硬件令牌的 可选目标很多，但如果你已经订购了一个支持智能卡的物理设备，那么你最好的选择就是 Yubikey 4，它两者都支持。启用你的在线帐户的双因子认证你要确定想启用双因子认证的在线账户，你的 email 提供商已经使用了（特别是 Google，它对 U2F 的支持非常好）。其它的站点这个功能应该是启用了：GitHub：当你上传你的 PGP 公钥时，你应该要想到，如果其他人能够获得访问你的帐户，他们可以用他们自己的 PGP 公钥替换掉你的 PGP 公钥。如果在 GitHub 上发布代码，你应该使用 U2F 认证来保护你的帐户安全。GitLab：理由同上Google：如果你有 google 帐户，你就惊奇地发现，许多帐户都允许以 Google 帐户来代替站点专用的认证来登入它们。Facebook：理由同上，许多在线站点都提供一个选择让你以 Facebook 的帐户来认证。即便你不使用 Facebook 也应该使用双因子认证来保护你的 Facebook 帐户。你认为必要的其它站点。查看 dongleauth.info 去找找灵感。如有可能，配置 TOTP 作为备选许多站点都允许你配置多个双因子认证机制，推荐的设置是：U2F 令牌作为主认证机制TOTP 手机应用作为辅助认证机制通过这种方式，即便你丢失了你的 U2F 令牌，你仍然能够重新获取对你的帐户的访问。或者，你可以注册多个 U2F 令牌（即：你可以用一个便宜的令牌仅用它做 U2F，并且将它用作备份）。延伸阅读到目前为止，你已经完成了下列的重要任务：创建你的开发者身份并使用 PGP 加密来保护它。通过将你的主密钥移到一个离线存储中并将子密钥移到一个外置硬件设备中的方式来配置你的环境，让窃取你的身份变得极为困难。配置你的 Git 环境去确保任何使用你项目的人都能够验证仓库的完整性和它的整个历史。使用双因子认证强化你的在线帐户。在安全保护方面，你已经做的很好了，但是你还应该去阅读以下的主题：如何去强化你的团队沟通。你的项目开发和治理决策的要求应该和保护提交代码那样去保护，如果不这样做，应该确保你的团队沟通是可信任的，并且所有决策的完整性是可验证的。如何去强化你的工作站的安全。你的目标是尽可能减少导致项目代码被污染的危险或你的开发者身份被窃的行为。如何写出安全的代码（查看相关编程语言和你项目所使用的库的各种文档）。即便引入它的提交代码上有一个 PGP 签名，糟糕的、不安全的代码仍然是糟糕的、不安全的代码！via: https://www.linux.com/blog/learn/pgp/2018/3/protecting-code-integrity-pgp-part-7-protecting-online-accounts作者：Konstantin Ryabitsev 选题：lujun9972 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
我们继续我们的 PGP 实践系列，来看看签名标签的标签和提交，这可以帮你确保你的仓库没有被篡改。在本系列教程中，我们提供了一个使用 PGP 的实用指南，包括基本概念和工具、生成和保护你的密钥。如果你错过了前面的文章，你可以查看下面的链接。在这篇文章中，我们谈一谈在 Git 中如何集成 PGP、使用签名的标签，然后介绍签名提交，最后添加签名推送的支持。第一部分：基本概念和工具第二部分：生成你的主密钥第三部分：生成 PGP 子密钥第四部分：将主密钥移到离线存储中第五部分：将子密钥移到硬件设备中Git 的核心特性之一就是它的去中心化本质 —— 一旦仓库克隆到你的本地系统，你就拥有了项目的完整历史，包括所有的标签、提交和分支。然而由于存在着成百上千的克隆仓库，如何才能验证你下载的仓库没有被恶意的第三方做过篡改？你可以从 GitHub 或一些貌似官方的位置来克隆它们，但是如果有些人故意欺骗了你怎么办？或者在你参与的一些项目上发现了后门，而 “Author” 行显示是你干的，然而你很确定 不是你干的，会发生什么情况？为解决上述问题，Git 添加了 PGP 集成。签名的标签通过确认它的内容与创建这个标签的开发者的工作站上的内容完全一致来证明仓库的完整性，而签名的提交几乎是不可能在不访问你的 PGP 密钥的情况下能够假冒你。清单了解签名的标签、提交和推送（必要）配置 git 使用你的密钥（必要）学习标签如何签名和验证（必要）配置 git 总是签名带注释标签（推荐）学习提交如何签名和验证工作（必要）配置 git 总是签名提交（推荐）配置 gpg-agent 选项（必要）考虑事项git 实现了 PGP 的多级集成，首先从签名标签开始，接着介绍签名提交，最后添加签名推送的支持。了解 Git 哈希git 是一个复杂的东西，为了你能够更好地掌握它如何集成 PGP，你需要了解什么是”哈希“。我们将它归纳为两种类型的哈希：树哈希和提交哈希。树哈希每次你向仓库提交一个变更，对于仓库中的每个子目录，git 都会记录它里面所有对象的校验和哈希 —— 内容（blobs）、目录（trees）、文件名和许可等等。它只对每次提交中发生变更的树和内容做此操作，这样在只变更树的一小部分时就不必去重新计算整个树的校验和。然后再计算和存储处于顶级的树的校验和，这样如果仓库的任何一部分发生变化，校验和将不可避免地发生变化。提交哈希一旦创建了树哈希，git 将计算提交哈希，它将包含有关仓库和变更的下列信息：树哈希的校验和变更前树哈希的校验和（父级）有关作者的信息（名字、email、创作时间）有关提交者的信息（名字、email、提交时间）提交信息哈希函数在写这篇文章时，虽然研究一种更强大的、抗碰撞的算法的工作正在进行，但 git 仍然使用的是 SHA1 哈希机制去计算校验和。注意，git 已经包含了碰撞防范程序，因此认为对 git 成功进行碰撞攻击仍然是不可行的。带注释标签和标签签名在每个 Git 仓库中，标签允许开发者标记特定的提交。标签可以是 “轻量级的” —— 几乎只是一个特定提交上的指针，或者它们可以是 “带注释的”，它自己将成为 git 树中的项目。一个带注释标签对象包含所有下列的信息：成为标签的提交的哈希的校验和标签名字关于打标签的人的信息（名字、email、打标签时间）标签信息一个 PGP 签名的标签是一个带有将所有这些条目封装进一个 PGP 签名的带注释标签。当开发者签名他们的 git 标签时，他们实际上是向你保证了如下的信息：他们是谁（以及他们为什么应该被信任）他们在签名时的仓库状态是什么样：标签包含的提交的哈希提交的哈希包含了顶级树的哈希顶级树哈希包含了所有文件、内容和子树的哈希它也包含有关作者的所有信息包含变更发生时的精确时间当你克隆一个仓库并验证一个签名的标签时，就是向你以密码方式保证：仓库中的所有内容、包括所有它的历史，与开发者签名时在它的计算机上的仓库完全一致。签名的提交签名的提交与签名的标签非常类似 —— PGP 签名的是提交对象的内容，而不是标签对象的内容。一个提交签名也给你提供了开发者签名时开发者树上的全部可验证信息。标签签名和提交的 PGP 签名提供了有关仓库和它的完整历史的完全一致的安全保证。签名的推送为了完整起见，在这里包含了签名的推送这一功能，因为在你使用这个功能之前，需要在接收推送的服务器上先启用它。正如我们在上面所说过的，PGP 签名一个 git 对象就是提供了开发者的 git 树当时的可验证信息，但不提供开发者对那个树意图相关的信息。比如，你可以在你自己复刻的 git 仓库的一个实验分支上尝试一个很酷的特性，为了评估它，你提交了你的工作，但是有人在你的代码中发现了一个恶意的 bug。由于你的提交是经过正确签名的，因此有人可能将包含有恶意 bug 的分支推入到 master 分支中，从而在生产系统中引入一个漏洞。由于提交是经过你的密钥正确签名的，所以一切看起来都是合理合法的，而当 bug 被发现时，你的声誉就会因此而受到影响。在 git push 时，为了验证提交的意图而不仅仅是验证它的内容，添加了要求 PGP 推送签名的功能。配置 git 使用你的 PGP 密钥如果在你的钥匙环上只有一个密钥，那么你就不需要再做额外的事了，因为它是你的默认密钥。然而，如果你有多个密钥，那么你必须要告诉 git 去使用哪一个密钥。（[fpr] 是你的密钥的指纹）：$ git config --global user.signingKey [fpr]注意：如果你有一个不同的 gpg2 命令，那么你应该告诉 git 总是去使用它，而不是传统的版本 1 的 gpg：$ git config --global gpg.program gpg2如何使用签名标签创建一个签名的标签，只要传递一个简单地 -s 开关给 tag 命令即可：$ git tag -s [tagname]我们建议始终对 git 标签签名，这样让其它的开发者确信他们使用的 git 仓库没有被恶意地修改过（比如，引入后门）：如何验证签名的标签验证一个签名的标签，只需要简单地使用 verify-tag 命令即可：$ git verify-tag [tagname]如果你要验证其他人的 git 标签，那么就需要你导入他的 PGP 公钥。请参考 “可信任的团队沟通” 一文中关于此主题的指导。在拉取时验证如果你从项目仓库的其它复刻中拉取一个标签，git 将自动验证签名，并在合并操作时显示结果：$ git pull [url] tags/sometag合并信息将包含类似下面的内容：Merge tag 'sometag' of [url] [Tag message] # gpg: Signature made [...] # gpg: Good signature from [...]配置 git 始终签名带注释标签很可能的是，你正在创建一个带注释标签，你应该去签名它。强制 git 始终签名带注释的标签，你可以设置一个全局配置选项：$ git config --global tag.forceSignAnnotated true或者，你始终记得每次都传递一个 -s 开关：$ git tag -asm "Tag message" tagname如何使用签名的提交创建一个签名的提交很容易，但是将它纳入到你的工作流中却很困难。许多项目使用签名的提交作为一种 “Committed-by:” 的等价行，它记录了代码来源 —— 除了跟踪项目历史外，签名很少有人去验证。在某种意义上，签名的提交用于 “篡改证据”，而不是 git 工作流的 “篡改证明”。为创建一个签名的提交，你只需要 git commit 命令传递一个 -S 标志即可（由于它与另一个标志冲突，所以改为大写的 -S）：$ git commit -S我们建议始终使用签名提交，并要求项目所有成员都这样做，这样其它人就可以验证它们（下面就讲到如何验证）。如何去验证签名的提交验证签名的提交需要使用 verify-commit 命令：$ git verify-commit [hash]你也可以查看仓库日志，要求所有提交签名是被验证和显示的：$ git log --pretty=short --show-signature在 git 合并时验证提交如果项目的所有成员都签名了他们的提交，你可以在合并时强制进行签名检查（然后使用 -S 标志对合并操作本身进行签名）：$ git merge --verify-signatures -S merged-branch注意，如果有一个提交没有签名或验证失败，将导致合并操作失败。通常情况下，技术是最容易的部分 —— 而人的因素使得项目中很难采用严格的提交验证。如果你的项目在补丁管理上采用邮件列表如果你的项目在提交和处理补丁时使用一个邮件列表，那么一般很少使用签名提交，因为通过那种方式发送时，签名信息将会丢失。对提交进行签名仍然是非常有用的，这样其他人就能引用你托管在公开 git 树作为参考，但是上游项目接收你的补丁时，仍然不能直接使用 git 去验证它们。尽管，你仍然可以签名包含补丁的电子邮件。配置 git 始终签名提交你可以告诉 git 总是签名提交：git config --global commit.gpgSign true或者你每次都记得给 git commit 操作传递一个 -S 标志（包括 —amend）。配置 gpg-agent 选项GnuPG agent 是一个守护工具，它能在你使用 gpg 命令时随时自动启动，并运行在后台来缓存私钥的密码。这种方式让你只需要解锁一次密钥就可以重复地使用它（如果你需要在一个自动脚本中签署一组 git 操作，而不想重复输入密钥，这种方式就很方便）。为了调整缓存中的密钥过期时间，你应该知道这两个选项：default-cache-ttl（秒）：如果在 TTL 过期之前再次使用同一个密钥，这个倒计时将重置成另一个倒计时周期。缺省值是 600（10 分钟）。max-cache-ttl（秒）：自首次密钥输入以后，不论最近一次使用密钥是什么时间，只要最大值的 TTL 倒计时过期，你将被要求再次输入密码。它的缺省值是 30 分钟。如果你认为这些缺省值过短（或过长），你可以编辑 ~/.gnupg/gpg-agent.conf 文件去设置你自己的值：# set to 30 minutes for regular ttl, and 2 hours for max ttl default-cache-ttl 1800 max-cache-ttl 7200补充：与 ssh 一起使用 gpg-agent如果你创建了一个 A（验证）密钥，并将它移到了智能卡，你可以将它用到 ssh 上，为你的 ssh 会话添加一个双因子验证。为了与 agent 沟通你只需要告诉你的环境去使用正确的套接字文件即可。首先，添加下列行到你的 ~/.gnupg/gpg-agent.conf 文件中：enable-ssh-support接着，添加下列行到你的 .bashrc 文件中：export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)为了让改变生效，你需要杀掉正在运行的 gpg-agent 进程，并重新启动一个新的登入会话：$ killall gpg-agent $ bash $ ssh-add -L最后的命令将列出代表你的 PGP Auth 密钥的 SSH（注释应该会在结束的位置显示： cardno:XXXXXXXX，表示它来自智能卡）。为了启用 ssh 的基于密钥的登入，只需要在你要登入的远程系统上添加 ssh-add -L 的输出到 ~/.ssh/authorized_keys 中。祝贺你，这将使你的 SSH 登入凭据更难以窃取。此外，你可以从公共密钥服务器上下载其它人的基于 PGP 的 ssh 公钥，这样就可以赋予他登入 ssh 的权利：$ gpg --export-ssh-key [keyid]如果你有让开发人员通过 ssh 来访问 git 仓库的需要，这将让你非常方便。下一篇文章，我们将提供像保护你的密钥那样保护电子邮件帐户的小技巧。via: https://www.linux.com/blog/learn/pgp/2018/3/protecting-code-integrity-pgp-part-6-using-pgp-git作者：KONSTANTIN RYABITSEV 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
用 PGP 保护代码完整性（五）：将子密钥移到一个硬件设备中
在这个系列教程中，将为你提供使用 PGP 和保护你的私钥的最佳体验。在本系列教程中，我们将提供一个使用 PGP 的实用指南。如果你没有看过前面的文章，你可以通过下面的链接去查看。在这篇文章中，我们将继续讨论如何保护你的密钥，谈一谈将你的子密钥移到一个专门的硬件设备中的一些技巧。第一部分：基本概念和工具第二部分：生成你的主密钥第三部分：生成 PGP 子密钥第四部分：将主密钥移到离线存储中清单取得一个 GnuPG 兼容的硬件设备（必要）配置 GnuPG 在设备上工作（必要）设置用户和管理员的 PIN（必要）移动子密钥到设备中（必要）考虑事项虽然现在主密钥已经不用担心泄露或失窃了，但子密钥仍然在你的家目录中。任何得到它的人都能够解密你的通讯或假冒你的签名（如果他们知道密钥的密码）。并且，每次执行一个 GnuPG 操作都要将密钥加载到操作系统内存中，这将使一些更高级的恶意软件有机会得到你的密钥（想想 Meltdown 和 Spectre）。完全保护密钥的最好方式就是，将它移到一个专门的硬件设备中，这种硬件设备是一个可操作的智能卡。智能卡的好处一个智能卡包含一个加密芯片，它能够存储私钥，并且直接在智能卡内部执行秘密操作。因为密钥内容从来没有离开过智能卡，计算机操作系统并不能检索你插入的智能卡上的私钥。这与前面用于备份目的的加密 USB 存储是不同的 —— 虽然 USB 设备也是插入并解密的，但操作系统是能够去访问私钥内容的。使用外置的加密 USB 介质并不能代替智能卡设备的功能。智能卡的一些其它好处：它们很便宜且易于获得它们小巧且易于携带它们可以用于多种设备上它们中的很多都具有防篡改功能（取决于制造商）可用的智能卡设备智能卡最初是嵌入到真实钱包大小的卡中，故而得名智能卡。你肯定可以买到并使用 GnuPG 功能的智能卡，并且它们是你能得到的最便宜的可用设备之一。但是，事实上智能卡有一个很重要的缺点：它们需要一个智能卡读卡器，只有极小数的笔记本电脑上有这种读卡器。由于这个原因，制造商开始推出小型 USB 设备，它的大小和 U 盘类似，内置有微型智能卡，并且在芯片上简单地实现了智能卡协议特性。下面推荐几个这样的设备：Nitrokey Start：开源硬件和自由软件，可用于 GnuPG 的最便宜的选择之一，但是额外的安全特性很少。Nitrokey Pro：类似于 Nitrokey Start，它提供防篡改及更多的安全特性（但没有 U2F，具体查看指南的 U2F 节）。Yubikey 4：专利硬件和软件，但比 Nitrokey Pro 便宜，并且可以用在最新的笔记本电脑上的 USB-C 接口；也提供像 U2F 这样的额外的安全特性。我们推荐选一个同时具备智能卡功能和 U2F 的设备，在写这篇文章时，只能选择 Yubikey 4。配置智能卡设备你的智能卡设备插入任何一台现代的 Linux 或 Mac 工作站上都应该能正常工作。你可以通过运行如下的命令去验证它：$ gpg --card-status如果你没有收到错误，有一个完整的卡列表，就表示一切正常。不幸的是，排除为什么设备不能正常工作的所有可能原因，已经超出了本指南的范围。如果你的智能卡使用 GnuPG 时有问题，请通过你的操作系统的常见支持通道寻求支持。PIN 不一定是数字注意，尽管名为 “PIN”（暗示你它必须是一个“数字”），不论是用户 PIN 还是管理员 PIN 都不必非要是数字。当你收到一个新设备时，它可能设置有一个默认的用户和管理员 PIN，对于 Yubikey，它分别是 123456 和 12345678。如果它们的 PIN 不是默认的，请查看设备附带的说明书。快速设置为配置你的智能卡，你需要使用 GnuPG 菜单系统，因此这里并没有更方便的命令行开关：$ gpg --card-edit [...omitted...] gpg/card> admin Admin commands are allowed gpg/card> passwd你应该去设置用户 PIN (1)、管理员 PIN (3)、和重置码 (4)。请确保把它们记录并保存到一个安全的地方 —— 尤其是管理员 PIN 和重置码（它允许你去擦除整个智能卡内容）。你很少使用到管理员 PIN，因此如果你不记录下来，很可能会忘掉它。返回到智能卡主菜单，你也可以设置其它值（比如名字、性别、登入日期、等等），但是这些都不是必需的，一旦你的智能卡丢失了，将导致额外的信息泄露。将子密钥移到你的智能卡中退出卡菜单（使用 q 命令）保存所有更改。接下来，我们将你的子密钥移到智能卡中。将需要用到你的 PGP 密钥的密码，在大多数的智能卡操作中都将用到管理员 PIN。记住，那个 [fpr] 表示你的密钥的完整的 40 个字符的指纹。$ gpg --edit-key [fpr] Secret subkeys are available. pub rsa4096/AAAABBBBCCCCDDDD created: 2017-12-07 expires: 2019-12-07 usage: C trust: ultimate validity: ultimate ssb rsa2048/1111222233334444 created: 2017-12-07 expires: never usage: E ssb rsa2048/5555666677778888 created: 2017-12-07 expires: never usage: S [ultimate] (1). Alice Engineer <alice@example.org> [ultimate] (2) Alice Engineer <allie@example.net> gpg>使用 --edit-key 再次进入到菜单模式，你将注意到那个密钥清单有一点小差别。从现在开始，所有的命令都是在这个菜单模式下运行，它用 gpg> 提示符来表示。首先，我们来选择移到智能卡中的密钥 —— 你可以通过键入 key 1（它表示选择清单中的第一个密钥）来实现：gpg> key 1这个输出会有一点细微的差别：pub rsa4096/AAAABBBBCCCCDDDD created: 2017-12-07 expires: 2019-12-07 usage: C trust: ultimate validity: ultimate ssb* rsa2048/1111222233334444 created: 2017-12-07 expires: never usage: E ssb rsa2048/5555666677778888 created: 2017-12-07 expires: never usage: S [ultimate] (1). Alice Engineer <alice@example.org> [ultimate] (2) Alice Engineer <allie@example.net>注意与密钥对应的 ssb 行旁边的 * —— 它表示这是当前选定的密钥。它是可切换的，意味着如果你再次输入 key 1，这个 * 将消失，这个密钥将不再被选中。现在，我们来将密钥移到智能卡中：gpg> keytocard Please select where to store the key: (2) Encryption key Your selection? 2由于它是我们的 [E] 密钥，把它移到加密区中是有很有意义的。当你提交了你的选择之后，将会被提示输入你的 PGP 密钥的保护密码，接下来输入智能卡的管理员 PIN。如果命令没有返回错误，表示你的密钥已经被移到智能卡中了。重要： 现在再次输入 key 1 去取消选中第一个密钥，并输入 key 2 去选择 [S] 密钥：gpg> key 1 gpg> key 2 gpg> keytocard Please select where to store the key: (1) Signature key (3) Authentication key Your selection? 1你可以使用 [S] 密钥同时做签名和验证，但是我们希望确保它在签名区，因此，我们选择 (1)。完成后，如果你的命令没有返回错误，表示操作已成功。最后，如果你创建了一个 A 密钥，你也可以将它移到智能卡中，但是你需要先取消选中 key 2。完成后，选择 q：gpg> q Save changes? (y/N) y保存变更将把你的子密钥移到智能卡后，把你的家目录中的相应子密钥删除（没有关系，因为我们的备份中还有，如果更换了智能卡，你需要再做一遍）。验证移动后的密钥现在，如果你执行一个--list-secret-keys 操作，你将看到一个稍有不同的输出：$ gpg --list-secret-keys sec# rsa4096 2017-12-06 [C] [expires: 2019-12-06] 111122223333444455556666AAAABBBBCCCCDDDD uid [ultimate] Alice Engineer <alice@example.org> uid [ultimate] Alice Engineer <allie@example.net> ssb> rsa2048 2017-12-06 [E] ssb> rsa2048 2017-12-06 [S]在 ssb> 的输出中的 > 表示子密钥仅在智能卡上有效。如果你进入到你的密钥目录中，查看目录的内容，你将会看到那个 .key 文件已经被存根替换：$ cd ~/.gnupg/private-keys-v1.d $ strings *.key这个输出将包含一个影子私钥，它表示那个文件仅是个存根，真正的内容在智能卡中。验证智能卡的功能验证智能卡能否如期正常运行，你可以通过创建一个签名来验证：$ echo "Hello world" | gpg --clearsign > /tmp/test.asc $ gpg --verify /tmp/test.asc首次运行这个命令时将询问你智能卡的 PIN，在你运行 gpg —verify 之后，它将显示 “Good signature”。祝贺你，你已经成功将窃取你的开发者数字身份变得更加困难了！其它常见 GnuPG 操作下面是使用你的 PGP 密钥需要做的一些常见操作的快速指南。在下面的所有命令中，[fpr] 表示你的密钥指纹。挂载主密钥离线存储下面的一些操作将需要你的主密钥，因此首先需要去挂载你的主密钥离线存储，并告诉 GnuPG 去使用它。首先，找出介质挂载路径，可以通过查看 mount 命令的输出找到它。接着，设置你的 GnuPG 目录为你的介质上备份的目录，并告诉 GnuPG 将那个目录做为它的家目录：$ export GNUPGHOME=/media/disk/name/gnupg-backup $ gpg --list-secret-keys确保你在输出中看到的是 sec 而不是 sec#（这个 # 表示密钥不可用，仍然使用的是惯常的那个 Home 目录）。更新你惯常使用的那个 GnuPG 工作目录在你的离线存储上做了任何更改之后，你应该将这些更改同步应用到你惯常使用的工作目录中：$ gpg --export | gpg --homedir ~/.gnupg --import $ unset GNUPGHOME延长密钥过期日期我们创建的主密钥的默认过期日期是自创建之日起两年后。这样做都是为安全考虑，这样将使淘汰密钥最终从密钥服务器上消失。延长你的密钥过期日期，从当前日期延长一年，只需要运行如下命令：$ gpg --quick-set-expire [fpr] 1y如果为了好记住，你也可以使用一个特定日期（比如，你的生日、1 月 1 日、或加拿大国庆日）：$ gpg --quick-set-expire [fpr] 2020-07-01记得将更新后的密钥发送到密钥服务器：$ gpg --send-key [fpr]吊销身份如果你需要吊销一个身份（比如，你换了雇主并且旧的邮件地址不再有效了），你可以使用一行命令搞定：$ gpg --quick-revoke-uid [fpr] 'Alice Engineer <aengineer@example.net>'你也可以通过使用 gpg --edit-key [fpr] 在菜单模式下完成同样的事情。完成后，记得将更新后的密钥发送到密钥服务器上：$ gpg --send-key [fpr]下一篇文章中，我们将谈谈 Git 如何支持 PGP 的多级别集成。通过来自 Linux 基金会和 edX 的免费课程 “Linux 入门”学习更多 Linux 知识。via: https://www.linux.com/blog/learn/pgp/2018/3/protecting-code-integrity-pgp-part-5-moving-subkeys-hardware-device作者：KONSTANTIN RYABITSEV 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
用 PGP 保护代码完整性（四）：将主密钥移到离线存储中
如果开发者的 PGP 密钥被偷了，危害非常大。了解一下如何更安全。在本系列教程中，我们为使用 PGP 提供了一个实用指南。你可以从下面的链接中查看前面的文章：第一部分：基本概念和工具第二部分：生成你的主密钥第三部分：生成 PGP 子密钥这是本系列教程的第四部分，我们继续本教程，我们将谈一谈如何及为什么要将主密钥从你的家目录移到离线存储中。现在开始我们的教程。清单准备一个加密的可移除的存储（必要）备份你的 GnuPG 目录（必要）从你的家目录中删除主密钥（推荐）从你的家目录中删除吊销证书（推荐）考虑事项为什么要从你的家目录中删除你的主 [C] 密钥 ？这样做的主要原因是防止你的主密钥失窃或意外泄露。对于心怀不轨的人来说，私钥对他们具有很大的诱惑力 —— 我们知道有几个恶意软件成功地实现了扫描用户的家目录并将发现的私钥内容上传。对于开发者来说，私钥失窃是非常危险的事情 —— 在自由软件的世界中，这无疑是身份证明失窃。从你的家目录中删除私钥将帮你防范这类事件的发生。备份你的 GnuPG 目录!!!绝对不要跳过这一步!!!备份你的 PGP 密钥将让你在需要的时候很容易地恢复它们，这很重要！（这与我们做的使用 paperkey 的灾难级备份是不一样的）。准备可移除的加密存储我们从取得一个（最好是两个）小型的 USB “拇指“ 驱动器（可加密 U 盘）开始，我们将用它来做备份。你首先需要去加密它们：加密密码可以使用与主密钥相同的密码。备份你的 GnuPG 目录加密过程结束之后，重新插入 USB 驱动器并确保它能够正常挂载。你可以通过运行 mount 命令去找到设备挂载点的完全路径。（在 Linux 下，外置介质一般挂载在 /media/disk 下，Mac 一般在它的 /Volumes 下）你知道了挂载点的全路径后，将你的整个 GnuPG 的目录复制进去：$ cp -rp ~/.gnupg [/media/disk/name]/gnupg-backup（注意：如果出现任何套接字不支持的错误，没有关系，直接忽略它们。）现在，用如下的命令去测试一下，确保它们能够正常地工作：$ gpg --homedir=[/media/disk/name]/gnupg-backup --list-key [fpr]如果没有出现任何错误，说明一切正常。弹出这个 USB 驱动器并给它粘上一个明确的标签，以便于你下次需要它时能够很快找到它。接着，将它放到一个安全的 —— 但不要太远 —— 的地方，因为从现在起，你需要偶尔使用它来做一些像编辑身份信息、添加或吊销子证书、或签署其它人的密钥这样的事情。删除主密钥我们家目录中的文件并没有像我们所想像的那样受到保护。它们可能会通过许多不同的方式被泄露或失窃：通过快速复制来配置一个新工作站时的偶尔事故通过系统管理员的疏忽或恶意操作通过安全性欠佳的备份通过桌面应用中的恶意软件（浏览器、pdf 查看器等等）通过跨境胁迫使用一个很好的密码来保护你的密钥是降低上述风险的一个很好方法，但是密码能够通过键盘记录器、背后窥视、或其它方式被发现。基于以上原因，我们建议去配置一个从你的家目录上可移除的主密钥，将它保存在一个离线存储中。删除你的主密钥请查看前面的节，确保你有完整的你的 GnuPG 目录的一个备份。如果你没有一个可用的备份，下面所做的操作将会使你的主密钥失效！！！首先，识别你的主密钥的 keygrip：$ gpg --with-keygrip --list-key [fpr]它的输出应该像下面这样：pub rsa4096 2017-12-06 [C] [expires: 2019-12-06] 111122223333444455556666AAAABBBBCCCCDDDD Keygrip = AAAA999988887777666655554444333322221111 uid [ultimate] Alice Engineer <alice@example.org> uid [ultimate] Alice Engineer <allie@example.net> sub rsa2048 2017-12-06 [E] Keygrip = BBBB999988887777666655554444333322221111 sub rsa2048 2017-12-06 [S] Keygrip = CCCC999988887777666655554444333322221111找到 pub 行下方的 Keygrip 条目（就在主密钥指纹的下方）。它与你的家目录下 .gnupg 目录下的一个文件是一致的：$ cd ~/.gnupg/private-keys-v1.d $ ls AAAA999988887777666655554444333322221111.key BBBB999988887777666655554444333322221111.key CCCC999988887777666655554444333322221111.key现在你做的全部操作就是简单地删除与主密钥 keygrip 一致的 .key 文件：$ cd ~/.gnupg/private-keys-v1.d $ rm AAAA999988887777666655554444333322221111.key现在，如果运行 --list-secret-keys 命令将出现问题，它将显示主密钥丢失（# 表示不可用）：$ gpg --list-secret-keys sec# rsa4096 2017-12-06 [C] [expires: 2019-12-06] 111122223333444455556666AAAABBBBCCCCDDDD uid [ultimate] Alice Engineer <alice@example.org> uid [ultimate] Alice Engineer <allie@example.net> ssb rsa2048 2017-12-06 [E] ssb rsa2048 2017-12-06 [S]删除吊销证书你应该去删除的另一个文件是吊销证书（删除之前，确保你的备份中有它），它是使用你的主密钥自动创建的。吊销证书允许一些人去永久标记你的证书为吊销状态，这意味着它无论在任何用途中将不再被使用或信任。一般是使用它来吊销由于某些原因不再受控的一个密钥 —— 比如，你丢失了密钥密码。与使用主密钥一样，如果一个吊销证书泄露到恶意者手中，他们能够使用它去破坏你的开发者数字身份，因此，最好是从你的家目录中删除它。cd ~/.gnupg/openpgp-revocs.d rm [fpr].rev在下一篇文章中，你将学习如何保护你的子密钥。敬请期待。从来自 Linux 基金会和 edX 的免费课程 “Linux 入门” 中学习更多 Linux 知识。via: https://www.linux.com/blog/learn/pgp/2018/3/protecting-code-integrity-pgp-part-4-moving-your-master-key-offline-storage作者：Konstantin Ryabitsev 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
将你的树莓派打造成一个 Tor 中继节点
在此教程中学习如何将你的旧树莓派打造成一个完美的 Tor 中继节点。你是否和我一样，在第一代或者第二代树莓派发布时买了一个，玩了一段时间就把它搁置“吃灰”了。毕竟，除非你是机器人爱好者，否则一般不太可能去长时间使用一个处理器很慢的、并且内存只有 256 MB 的计算机。这并不是说你不能用它去做一件很酷的东西，但是在工作和其它任务之间，我还没有看到用一些旧的物件发挥新作用的机会。然而，如果你想去好好利用它并且不想花费你太多的时间和资源的话，可以将你的旧树莓派打造成一个完美的 Tor 中继节点。Tor 中继节点是什么在此之前你或许听说过 Tor 项目，如果恰好你没有听说过，我简单给你介绍一下，“Tor” 是 “The Onion Router（洋葱路由器）” 的缩写，它是用来对付在线追踪和其它违反隐私行为的技术。不论你在互联网上做什么事情，都会在你的 IP 包通过的设备上留下一些数字“脚印”：所有的交换机、路由器、负载均衡，以及目标网络记录的来自你的原始会话的 IP 地址，以及你访问的互联网资源（通常是它的主机名，即使是在使用 HTTPS 时）的 IP 地址。如过你是在家中上互联网，那么你的 IP 地址可以直接映射到你的家庭所在地。如果你使用了 VPN 服务（你应该使用），那么你的 IP 地址映射到你的 VPN 提供商那里，而 VPN 提供商是可以映射到你的家庭所在地的。无论如何，有可能在某个地方的某个人正在根据你访问的网络和在网站上呆了多长时间来为你建立一个个人的在线资料。然后将这个资料进行出售，并与从其它服务上收集的资料进行聚合，然后利用广告网络进行赚钱。至少，这是乐观主义者对如何利用这些数据的一些看法 —— 我相信你还可以找到更多的更恶意地使用这些数据的例子。Tor 项目尝试去提供一个解决这种问题的方案，使它们不可能（或者至少是更加困难）追踪到你的终端 IP 地址。Tor 是通过让你的连接在一个由匿名的入口节点、中继节点和出口节点组成的匿名中继链上反复跳转的方式来实现防止追踪的目的：入口节点 只知道你的 IP 地址和中继节点的 IP 地址，但是不知道你最终要访问的目标 IP 地址中继节点 只知道入口节点和出口节点的 IP 地址，以及既不是源也不是最终目标的 IP 地址出口节点 仅知道中继节点和最终目标地址，它是在到达最终目标地址之前解密流量的节点中继节点在这个交换过程中扮演一个关键的角色，因为它在源请求和目标地址之间创建了一个加密的障碍。甚至在意图偷窥你数据的对手控制了出口节点的情况下，在他们没有完全控制整个 Tor 中继链的情况下仍然无法知道请求源在哪里。只要存在大量的中继节点，你的隐私被会得到保护 —— 这就是我为什么真诚地建议你，如果你的家庭宽带有空闲的时候去配置和运行一个中继节点。考虑去做 Tor 中继时要记住的一些事情一个 Tor 中继节点仅发送和接收加密流量 —— 它从不访问任何其它站点或者在线资源，因此你不用担心有人会利用你的家庭 IP 地址去直接浏览一些令人担心的站点。话虽如此，但是如果你居住在一个提供 匿名增强服务 anonymity-enhancing services 是违法行为的司法管辖区的话，那么你还是不要运营你的 Tor 中继节点了。你还需要去查看你的互联网服务提供商的服务条款是否允许你去运营一个 Tor 中继。需要哪些东西一个带完整外围附件的树莓派（任何型号/代次都行）一张有 Raspbian Stretch Lite 的 SD 卡一根以太网线缆一根用于供电的 micro-USB 线缆一个键盘和带 HDMI 接口的显示器（在配置期间使用）本指南假设你已经配置好了你的家庭网络连接的线缆或者 ADSL 路由器，它用于运行 NAT 转换（它几乎是必需的）。大多数型号的树莓派都有一个可用于为树莓派供电的 USB 端口，如果你只是使用路由器的 WiFi 功能，那么路由器应该有空闲的以太网口。但是在我们将树莓派设置为一个“配置完不管”的 Tor 中继之前，我们还需要一个键盘和显示器。引导脚本我改编了一个很流行的 Tor 中继节点引导脚本以适配树莓派上使用 —— 你可以在我的 GitHub 仓库 https://github.com/mricon/tor-relay-bootstrap-rpi 上找到它。你用它引导树莓派并使用缺省的用户 pi 登入之后，做如下的工作：sudo apt-get install -y git git clone https://github.com/mricon/tor-relay-bootstrap-rpi cd tor-relay-bootstrap-rpi sudo ./bootstrap.sh 这个脚本将做如下的工作：安装最新版本的操作系统更新以确保树莓派打了所有的补丁将系统配置为无人值守自动更新，以确保有可用更新时会自动接收并安装安装 Tor 软件告诉你的 NAT 路由器去转发所需要的端口（端口一般是 443 和 8080，因为这两个端口最不可能被互联网提供商过滤掉）上的数据包到你的中继节点脚本运行完成后，你需要去配置 torrc 文件 —— 但是首先，你需要决定打算贡献给 Tor 流量多大带宽。首先，在 Google 中输入 “Speed Test”，然后点击 “Run Speed Test” 按钮。你可以不用管 “Download speed” 的结果，因为你的 Tor 中继能处理的速度不会超过最大的上行带宽。所以，将 “Mbps upload” 的数字除以 8，然后再乘以 1024，结果就是每秒多少 KB 的宽带速度。比如，如果你得到的上行带宽是 21.5 Mbps，那么这个数字应该是：21.5 Mbps / 8 * 1024 = 2752 KBytes per second 你可以限制你的中继带宽为那个数字的一半，并允许突发带宽为那个数字的四分之三。确定好之后，使用喜欢的文本编辑器打开 /etc/tor/torrc 文件，调整好带宽设置。RelayBandwidthRate 1300 KBytes RelayBandwidthBurst 2400 KBytes 当然，如果你想更慷慨，你可以将那几个设置的数字调的更大，但是尽量不要设置为最大的出口带宽 —— 如果设置的太高，它会影响你的日常使用。你打开那个文件之后，你应该去设置更多的东西。首先是昵称 —— 只是为了你自己保存记录，第二个是联系信息，只需要一个电子邮件地址。由于你的中继是运行在无人值守模式下的，你应该使用一个定期检查的电子邮件地址 —— 如果你的中继节点离线超过 48 个小时，你将收到 “Tor Weather” 服务的告警信息。Nickname myrpirelay ContactInfo you@example.com 保存文件并重引导系统去启动 Tor 中继。测试它确认有 Tor 流量通过如果你想去确认中继节点的功能，你可以运行 arm 工具：sudo -u debian-tor arm 它需要一点时间才显示，尤其是在老板子上。它通常会给你显示一个表示入站和出站流量（或者是错误信息，它将有助于你去排错）的柱状图。一旦你确信它运行正常，就可以将键盘和显示器拔掉了，然后将树莓派放到地下室，它就可以在那里悄悄地呆着并到处转发加密的比特了。恭喜你，你已经帮助去改善隐私和防范在线的恶意跟踪了！通过来自 Linux 基金会和 edX 的免费课程 "Linux 入门" 来学习更多的 Linux 知识。via: https://www.linux.com/blog/intro-to-linux/2018/6/turn-your-raspberry-pi-tor-relay-node作者：Konstantin Ryabitsev 选题：lujun9972 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在第三篇文章中，我们将解释如何生成用于日常工作的 PGP 子密钥。在本系列教程中，我们提供了使用 PGP 的实用指南。在此之前，我们介绍了基本工具和概念，并介绍了如何生成并保护您的主 PGP 密钥。在第三篇文章中，我们将解释如何生成用于日常工作的 PGP 子密钥。清单生成 2048 位加密子密钥（必要）生成 2048 位签名子密钥（必要）生成一个 2048 位验证子密钥（推荐）将你的公钥上传到 PGP 密钥服务器（必要）设置一个刷新的定时任务（必要）注意事项现在我们已经创建了主密钥，让我们创建用于日常工作的密钥。我们创建 2048 位的密钥是因为很多专用硬件（我们稍后会讨论这个）不能处理更长的密钥，但同样也是出于实用的原因。如果我们发现自己处于一个 2048 位 RSA 密钥也不够好的世界，那将是由于计算或数学有了基本突破，因此更长的 4096 位密钥不会产生太大的差别。创建子密钥要创建子密钥，请运行：$ gpg --quick-add-key [fpr] rsa2048 encr $ gpg --quick-add-key [fpr] rsa2048 sign 用你密钥的完整指纹替换 [fpr]。你也可以创建验证密钥，这能让你将你的 PGP 密钥用于 ssh：$ gpg --quick-add-key [fpr] rsa2048 auth 你可以使用 gpg --list-key [fpr] 来查看你的密钥信息：pub rsa4096 2017-12-06 [C] [expires: 2019-12-06] 111122223333444455556666AAAABBBBCCCCDDDD uid [ultimate] Alice Engineer <alice@example.org> uid [ultimate] Alice Engineer <allie@example.net> sub rsa2048 2017-12-06 [E] sub rsa2048 2017-12-06 [S] 上传你的公钥到密钥服务器你的密钥创建已完成，因此现在需要你将其上传到一个公共密钥服务器，使其他人能更容易找到密钥。 （如果你不打算实际使用你创建的密钥，请跳过这一步，因为这只会在密钥服务器上留下垃圾数据。）$ gpg --send-key [fpr] 如果此命令不成功，你可以尝试指定一台密钥服务器以及端口，这很有可能成功：$ gpg --keyserver hkp://pgp.mit.edu:80 --send-key [fpr] 大多数密钥服务器彼此进行通信，因此你的密钥信息最终将与所有其他密钥信息同步。关于隐私的注意事项：密钥服务器是完全公开的，因此在设计上会泄露有关你的潜在敏感信息，例如你的全名、昵称以及个人或工作邮箱地址。如果你签名了其他人的钥匙或某人签名了你的钥匙，那么密钥服务器还会成为你的社交网络的泄密者。一旦这些个人信息发送给密钥服务器，就不可能被编辑或删除。即使你撤销签名或身份，它也不会将你的密钥记录删除，它只会将其标记为已撤消 —— 这甚至会显得更显眼。也就是说，如果你参与公共项目的软件开发，以上所有信息都是公开记录，因此通过密钥服务器另外让这些信息可见，不会导致隐私的净损失。上传你的公钥到 GitHub如果你在开发中使用 GitHub（谁不是呢？），则应按照他们提供的说明上传密钥：添加 PGP 密钥到你的 GitHub 账户要生成适合粘贴的公钥输出，只需运行：$ gpg --export --armor [fpr] 设置一个刷新定时任务你需要定期刷新你的钥匙环，以获取其他人公钥的最新更改。你可以设置一个定时任务来做到这一点：$ crontab -e 在新行中添加以下内容：@daily /usr/bin/gpg2 --refresh >/dev/null 2>&1 注意：检查你的 gpg 或 gpg2 命令的完整路径，如果你的 gpg 是旧式的 GnuPG v.1，请使用 gpg2。通过 Linux 基金会和 edX 的免费“Introduction to Linux” 课程了解关于 Linux 的更多信息。via: https://www.linux.com/blog/learn/pgp/2018/2/protecting-code-integrity-pgp-part-3-generating-pgp-subkeys作者：Konstantin Ryabitsev 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
用 PGP 保护代码完整性（二）：生成你的主密钥
在本系列文章中，我们将深度探讨如何使用 PGP 以及为工作于自由软件项目的开发者提供实用指南。在前一篇文章中，我们介绍了基本工具和概念。在本文中，我们将展示如何生成和保护你的 PGP 主密钥。清单生成一个 4096 位的 RSA 主密钥 （必要）使用 paperkey 备份你的 RSA 主密钥 （必要）添加所有相关的身份 （必要）考虑事项理解“主”（认证）密钥在本节和下一节中，我们将讨论“主密钥”和“子密钥”。理解以下内容很重要：在“主密钥”和“子密钥”之间没有技术上的区别。在创建时，我们赋予每个密钥特定的能力来分配功能限制。一个 PGP 密钥有四项能力[S] 密钥可以用于签名[E] 密钥可以用于加密[A] 密钥可以用于身份认证[C] 密钥可以用于认证其他密钥一个密钥可能有多种能力带有 [C] （认证）能力的密钥被认为是“主”密钥，因为它是唯一可以用来表明与其他密钥关系的密钥。只有 [C] 密钥可以被用于：添加或撤销其他密钥（子密钥）的 S/E/A 能力添加、更改或撤销密钥关联的身份（uid）添加或更改本身或其他子密钥的到期时间为了网络信任目的为其它密钥签名在自由软件的世界里，[C] 密钥就是你的数字身份。一旦你创建该密钥，你应该格外小心地保护它并且防止它落入坏人的手中。在你创建主密钥前在你创建的你的主密钥前，你需要选择你的主要身份和主密码。主要身份身份使用邮件中发件人一栏相同格式的字符串：Alice Engineer <alice.engineer@example.org> 你可以在任何时候创建新的身份，取消旧的，并且更改你的“主要”身份。由于主要身份在所有 GnuPG 操作中都展示，你应该选择正式的和最有可能用于 PGP 保护通信的名字和邮件地址，比如你的工作地址或者用于在项目 提交 commit 时签名的地址。密码 密码 passphrase 专用于私钥存储在磁盘上时使用对称加密算法对其进行加密。如果你的 .gnupg 目录的内容被泄露，那么一个好的密码就是小偷能够在线假冒你的最后一道防线，这就是为什么设置一个好的密码很重要的原因。一个强密码最好使用丰富或混合的词典的 3-4 个词，而不引用自流行来源（歌曲、书籍、口号）。由于你将相当频繁地使用该密码，所以它应当易于输入和记忆。算法和密钥强度尽管现在 GnuPG 已经支持椭圆曲线加密一段时间了，但我们仍坚持使用 RSA 密钥，至少较长一段时间会这样。虽然现在就可以开始使用 ED25519 密钥，但你可能会碰到无法正确处理它们的工具和硬件设备。在后续的指南中我们说 2048 位的密钥对 RSA 公钥加密的生命周期已经足够，你可能也会好奇主密钥为什么是 4096 位。 原因很大程度是由于社会因素而非技术上的：主密钥在密钥链上是最显眼的，如果你的主密钥位数比一些和你交互的开发者的少，他们肯定会鄙视你。生成主密钥为了生成你的主密钥，请使用以下命令，并且将 “Alice Engineer” 替换为正确值。$ gpg --quick-generate-key 'Alice Engineer <alice@example.org>' rsa4096 cert 这将弹出一个要求输入密码的对话框。然后，你可能需要移动鼠标或随便按一些键才能生成足够的熵，直到该命令完成。查看命令输出，它就像这样：pub rsa4096 2017-12-06 [C] [expires: 2019-12-06] 111122223333444455556666AAAABBBBCCCCDDDD uid Alice Engineer <alice@example.org> 注意第二行的长字符串 —— 它是你新生成的密钥的完整指纹。密钥 ID（Key ID）可以用以下三种不同形式表达： 指纹 Fingerprint ，一个完整的 40 个字符的密钥标识符 长密钥 ID Long ，指纹的最后 16 个字符（AAAABBBBCCCCDDDD） 短密钥 ID Short ，指纹的最后 8 个字符（CCCCDDDD）你应该避免使用 8 个字符的短密钥 ID，因为它们不足够唯一。这里，我建议你打开一个文本编辑器，复制你新密钥的指纹并粘贴。你需要在接下来几步中用到它，所以将它放在旁边会很方便。备份你的主密钥出于灾后恢复的目的 —— 同时特别的如果你试图使用 Web of Trust 并且收集来自其他项目开发者的密钥签名 —— 你应该创建你的私钥的硬拷贝备份。万一所有其它的备份机制都失败了，这应当是最后的补救措施。创建一个你的私钥的可打印的硬拷贝的最好方法是使用为此而写的软件 paperkey。paperkey 在所有 Linux 发行版上可用，在 Mac 上也可以通过 brew 安装 paperkey。运行以下命令，用你密钥的完整指纹替换 [fpr]：$ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt 输出将采用易于 OCR 或手动输入的格式，以防如果你需要恢复它的话。打印出该文件，然后拿支笔，并在纸的边缘写下密钥的密码。这是必要的一步，因为密钥输出仍然使用密码加密，并且如果你更改了密钥的密码，你不会记得第一次创建的密钥是什么 —— 我保证。将打印结果和手写密码放入信封中，并存放在一个安全且保护好的地方，最好远离你家，例如银行保险库。打印机注意事项 打印机连接到计算机的并行端口的时代已经过去了。现在他们拥有完整的操作系统，硬盘驱动器和云集成。由于我们发送给打印机的关键内容将使用密码进行加密，因此这是一项相当安全的操作，但请使用您最好的偏执判断。添加相关身份如果你有多个相关的邮件地址（个人、工作、开源项目等），你应该将其添加到主密钥中。你不需要为任何你不希望用于 PGP 的地址（例如，可能不是你的校友地址）这样做。该命令是（用你完整的密钥指纹替换 [fpr]）：$ gpg --quick-add-uid [fpr] 'Alice Engineer <allie@example.net>' 你可以查看你已经使用的 UID：$ gpg --list-key [fpr] | grep ^uid 选择主 UIDGnuPG 将会把你最近添加的 UID 作为你的主 UID，如果这与你想的不同，你应该改回来：$ gpg --quick-set-primary-uid [fpr] 'Alice Engineer <alice@example.org>' 下次，我们将介绍如何生成 PGP 子密钥，它是你实际用于日常工作的密钥。通过 Linux 基金会和 edX 的免费“Introduction to Linux” 课程了解关于 Linux 的更多信息。via: https://www.linux.com/blog/learn/PGP/2018/2/protecting-code-integrity-pgp-part-2-generating-and-protecting-your-master-pgp-key作者：KONSTANTIN RYABITSEV 译者：kimii 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
用 PGP 保护代码完整性（一）： 基本概念和工具
在本系列文章中，我们将深度探讨如何使用 PGP 确保软件完整性。这些文章将为工作于自由软件项目的开发者提供实用指南，并且将包含以下主题：PGP 基础和最佳实践如何用 Git 使用 PGP如何保护你的开发者账户我们使用与“Freedom”含义相同的词项 “Free”，但这个系列中列出的指南也可以被任何其它类型的依赖于分布式团队开发者贡献的软件中。如果你编写进入公共源仓库的代码，你可以从了解和遵循这篇指南中受益。结构每节分为两个部分：适用于你项目需求的清单形式自由的考虑事项的列表，解释这些决定取决于什么，并伴随着配置指令清单优先级每个清单中各项包含着优先级，用来帮助指导你的决定：（必要）该项一定要排在考虑事项列表的前面。如果没有这样做，它们将给提交到开源项目中的代码带来高风险。（推荐）包含该项将提升整体安全性，但会影响你与工作环境的交互方式，并且可能需要学习新的习惯或者放弃旧的习惯。记住，这些只是指导。如果你感到这些优先级不能反映你项目提交的安全，你应该根据自己的需要调整它们。PGP 基本概念和工具清单理解 PGP 在自由软件开发中的作用 （必要）理解 公钥密码学 Public Key Cryptography 的基础知识 （必要）理解 PGP 加密和签名的不同 （必要）理解 PGP 密钥身份 key identities （必要）理解 PGP 密钥有效性 key validity （必要）安装 GnuPG 工具（版本 2.x） （必要）考虑事项自由软件社区长期依赖于 PGP 确保它生产的软件产品的真实性和完整性。你可能没有注意到，但无论你是一个 Linux 、Mac 和 Windowas 用户，你都曾依赖 PGP 来确保你电脑环境的完整性：Linux 发行版依赖 PGP 来确保当二进制或者原代码包从被生产出来到被终端用户安装之间没被更改过自由软件项目通常会伴随发行软件的存档提供分离的 PGP 签名，使得下游的项目可以在把下载的版本集成到自己的分布式下载之前，验证下载版本的完整性。自由软件项目通常依赖代码本身的 PGP 签名来跟踪起源，并验证项目开发者提交的代码的完整性这与工作于专有平台的程序员使用的开发者证书或代码签名机制非常相似。实际上，这两种技术背后的核心概念非常相似 —— 尽管它们在实现的技术层面和它们委托信任方式的大多不同。PGP 不依赖于集中式认证机构，而是让每个用户为每个证书赋予自己的信任。我们的目标是使你的项目通过使用 PGP 来进行代码起源和完整性追踪，遵循最佳实践并遵守基本的安全预防措施。极其基本的 PGP 操作概括你不需要知道 PGP 如何工作的具体细节 —— 理解核心概念足以成功地达到我们的目的。PGP 依赖于公钥密码学来将明文转换为密文。这个过程需要两种不同的密钥：公钥，被所有人知道私钥，只被拥有者知道加密对加密来说，PGP 使用拥有者的公钥创造一条只能通过拥有者私钥解密的消息：发送者生成一个随机的加密密钥（“会话密钥”）发送者使用该会话密钥（使用对称算法）加密内容发送者使用接收者的 PGP 公钥加密会话密钥发送者向接收者发送加密后的内容和加密后的会话密钥要解密：接收者使用他们的 PGP 私钥解密会话密钥接收者使用会话密钥解密消息的内容签名为了创建签名，PGP 私钥或公钥会以相反的方式使用：签名者生成内容的校检和哈希签名者使用自己的 PGP 私钥来加密该校检和签名者伴随内容提供加密后的校检和要验证签名：验证者生成自己的内容校检和哈希验证者使用签名者的 PGP 公钥来解密提供的校检和如果校检和匹配，就验证了内容的完整性结合使用通常，加密消息也被发送者自己的 PGP 密钥签名。无论何时使用加密消息，这应当是默认的，因为没有认证的加密没有很大意义（除非你是一个告密者或秘密代理并且需要可行的可否认性）理解密钥身份每个 PGP 密钥必须有一个或多个与之关联的身份。通常，“ 身份 Identity ”指的是以下格式中的人物全名和邮件地址：Alice Engineer <alice.engineer@example.com> 有时也会在括号中包含说明，来告诉终端用户关于该特定密钥的更多信息：Bob Designer (obsolete 1024-bit key) <bob.designer@example.com> 由于人们可以和多个职业和个人实体相关联，因此在同一密钥上可以有多个身份：Alice Engineer <alice.engineer@example.com> Alice Engineer <aengineer@personalmail.example.org> Alice Engineer <webmaster@girlswhocode.example.net> 当使用多个身份时，其中之一将被标记为“ primary identity 主要身份 ”来让检索更简单。理解密钥有效性为了能使用其他人的公钥来加密或验证，你需要确保它确实属于正确的人（Alice）而不属于冒牌的（Eve）。在 PGP 中，这被称为“密钥有效性”：有效性： 完全 full -- 意味着非常确认该密钥属于 Alice有效性： 临界 marginal -- 意味着大致确认该密钥属于 Alice有效性： 未知 unknown -- 意味着不确认该密钥是否属于 AliceWeb of Trust （WOT） 与 Trust on First Use (TOFU)PGP 使用了一种信任委托机制叫“Web of Trust”。它的核心是尝试替代 HTTPS/TLS 世界中对集中式认证机构的需求。PGP 把这个责任交给了每个用户，而不是各种软件开发商来决定谁应该是你的可信认证实体。不幸的是，很少有人理解 Web of Trust 的是如何工作的，能使用它的人更少。它仍然是 OpenPGP 规范的一个重要方面，但 GnuPG 的近期版本（2.2 及以上）已经实现了一种替代机制叫“Trust on First Use”(TOFU)。你可以把 TOFU 当作类似 SSH 的信任方式。使用 SSH，当你第一次连接到远程系统，它的密钥指纹会被记录和保存。如果将来密钥改变，SSH 客户端将会提醒你并拒绝连接，迫使你决定是否信任已改变的的密钥。同样，当你第一次导入某人的 PGP 密钥，它被假定可信。如果在将来的任何时候，GnuPG 碰巧发现另一同样身份的密钥，过去导入的密钥和新密钥都将被标记为无效，并且你需要手动指出保留哪个。安装 OpenPGP 软件首先，理解 PGP、OpenPGP、GnuPG 和 gpg 之间的不同很重要：PGP （“Pretty Good Privacy”） 是最初商业软件的名字OpenPGP 是与最初 PGP 工具兼容的 IETF 标准GnuPG （“Gnu Privacy Guard”）是实现了 OpenPGP 标准的自由软件GnuPG 的命令行工具称为 “gpg”今天，“PGP”这个词几乎被普遍用来表示开放的 OpenPGP 标准，而不是最初的商业软件，因此“PGP”和“OpenPGP”是可以互换的。“GnuPG”和“pgp”这两个词应该仅在提及工具时使用，而不用于它们产生的输出或它们实现的 OpenPGP 功能。举例：PGP（而非 GnuPG 或 GPG）密钥PGP（而非 GnuPG 或 GPG）签名PGP（而非 GnuPG 或 GPG）密钥服务器理解这一点应该可以保护你免受来自你遇到的其他 PGP 用户“实际上”不可避免的迂腐。安装 GnuPG如果你正在使用 Linux，你应该已经安装过了 GnuPG。在 Mac 上，你应该安装 GPG-Suite，或者使用 brew 安装 gnupg2。在 Windows 上，你应该安装 GPG4Win，并且为了可以工作，你可能需要调整指南中的部分命令，除非你设置了类似 Unix 的环境。对其他平台来说，你需要自行查找正确的地址来下载和安装 GnuPG。GnuPG 1 vs. 2GnuPG v.1 和 GnuPG v.2 都实现了同样的标准，但它们提供不兼容的库和命令行工具，所以许多发行版都带有了旧的版本 1 和最新的版本 2。你需要确保你总是使用 GnuPG v.2。首先，运行：$ gpg --version | head -n1 如果你看到 gpg (GnuPG) 1.4.x，说明你正使用 GnuPG v.1。尝试下 gpg2 命令：$ gpg2 --version | head -n1 如果你看到 gpg (GnuPG) 2.x.x，说明你可以继续了。这篇指南将假设你使用 GnuPG 2.2 版本（或更新）。如果你正使用 GnuPG 的 2.0 版本，本指南中某些命令可能无效，你应该考虑安装 GnuPG 最新的 2.2 版本确保你总是使用 GnuPG v.2如果你 gpg 和 gpg2 命令都有，你应该确保总是使用 GnuPG v.2，而不是旧的版本。你可以通过设置别名来确保这一点：$ alias gpg=gpg2 你可以把它放在你的 .bashrc 中，以确保它在你使用 gpg 命令时总是被加载。在本系列的第 2 部分中，我们将介绍生成和保护你的 PGP 主密钥的基本步骤。通过 Linux 基金会和 edX 的免费“Introduction to Linux” 课程了解关于 Linux 的更多信息。via: https://www.linux.com/blog/learn/2018/2/protecting-code-integrity-pgp-part-1-basic-pgp-concepts-and-tools作者：Konstantin Ryabitsev 译者：kimii 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Konstantin Ryabitsev 为你讲解哪个 Linux 内核版本可以被视作“稳定版”，以及你应该如何选择一个适用你的内核版本。每次 Linus Torvalds 发布 一个新 Linux 内核的主线版本，几乎都会引起这种困惑，那就是到底哪个内核版本才是最新的“稳定版”？是新的那个 X.Y，还是前面的那个 X.Y-1.Z ？最新的内核版本是不是太“新”了？你是不是应该坚持使用以前的版本？kernel.org 网页上的信息并不会帮你解开这个困惑。目前，在该页面的最顶部，我们看到是最新稳定版内核是 4.15 — 但是在这个表格的下面，4.14.16 也被列为“ 稳定版 stable ”，而 4.15 被列为“ 主线版本 mainline ”，很困惑，是吧？不幸的是，这个问题并不好回答。我们在这里使用“稳定”这个词有两个不同的意思：一是，作为最初发布的 Git 树的名字，二是，表示这个内核可以被视作“稳定版”，用在“生产系统”。由于 Git 的分布式特性，Linux 的开发工作在许多 不同的分叉仓库中 进行。所有的 bug 修复和新特性也是首先由各个子系统维护者收集和准备的，然后提交给 Linus Torvalds，由 Linus Torvalds 包含进 他自己的 Linux 树 中，他的 Git 树被认为是 Git 仓库的 “master”。我们称这个树为 “主线” Linux 树。候选发布版（RC）在每个新的内核版本发布之前，它都要经过几轮的“候选发布”，它由开发者进行测试并“打磨”所有的这些很酷的新特性。基于他们这几轮测试的反馈，Linus 决定最终版本是否已经准备就绪。通常有 7 个每周预发布版本，但是，这个数字经常走到 -rc8，并且有时候甚至达到 -rc9 及以上。当 Linus 确信那个新内核已经没有问题了，他就制作最终发行版，我们称这个版本为“稳定版”，表示它不再是一个“候选发布版”。Bug 修复就像任何一个由不是十全十美的人所写的复杂软件一样，任何一个 Linux 内核的新版本都包含 bug，并且这些 bug 必须被修复。Linux 内核的 bug 修复规则非常简单：所有修复必须首先进入到 Linus 的树。一旦主线仓库中的 bug 被修复后，它接着会被应用到内核开发社区仍在维护的已发布内核中。在它们被考虑回迁到已发布的稳定版本之前，所有的 bug 修复必须满足 一套重要的标准 — 标准的其中之一是，它们 “必须已经存在于 Linus 的树中”。这是一个 独立的 Git 仓库，维护它的用途是回迁 bug 修复，而它也被称为“稳定”树 —— 因为它用于跟踪以前发布的稳定内核。这个树由 Greg Kroah-Hartman 策划和维护。最新的稳定内核因此，无论在什么时候，为了查看最新的稳定内核而访问 kernel.org 网站时，你应该去使用那个在大黄色按钮所说的“最新的稳定内核”。但是，你可能会惊奇地发现 —— 4.15 和 4.14.16 都是稳定版本，那么到底哪一个更“稳定”呢？有些人不愿意使用 “.0” 的内核发行版，因为他们认为这个版本并不足够“稳定”，直到最新的是 ".1" 的为止。很难证明或者反驳这种观点的对与错，并且这两种观点都有赞成或者反对的理由，因此，具体选择哪一个取决于你的喜好。一方面，任何一个进入到稳定树的发行版都必须首先被接受进入主线内核版本中，并且随后会被回迁到已发行版本中。这意味着内核的主线版本相比稳定树中的发行版本来说，总包含有最新的 bug 修复，因此，如果你想使用的发行版包含的“已知 bug”最少，那么使用 “.0” 的主线发行版是最佳选择。另一方面，主线版本增加了所有很酷的新特性 —— 而新特性也给它们带来了数量未知的“新 bug”，而这些“新 bug”在老的稳定版中是不会存在的。而新的、未知的 bug 是否比旧的、已知的但尚未修复的 bug 更加令人担心呢？ —— 这取决于你的选择。不过需要说明的一点是，许多 bug 修复只对内核的主线版本进行了彻底的测试。当补丁回迁到旧内核时，它们可能会工作的很好，但是它们很少做与旧内核的集成测试工作。通常都假定，“以前的稳定版本”足够接近当前的确信可用于生产系统的主线版本。而实际上也确实是这样的，当然，这也更加说明了为什么选择“哪个内核版本更稳定”是件非常困难的事情了。因此，从根本上说，我们并没有定量的或者定性的手段去明确的告诉你哪个内核版本更加稳定 —— 4.15 还是 4.14.16？我们能够做到的只是告诉你，它们具有“不同的稳定性”，（这个答案可能没有帮到你，但是，至少你明白了这些版本的差别是什么？）。学习更多的 Linux 的知识，可以通过来自 Linux 基金会和 edX 的免费课程 "认识 Linux" 。via: https://www.linux.com/blog/learn/2018/2/which-linux-kernel-version-stable作者：KONSTANTIN RYABITSEV 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
由 KRACK 攻击想到的确保网络安全的小贴士
最近的 KRACK （密钥重装攻击，这是一个安全漏洞名称或该漏洞利用攻击行为的名称）漏洞攻击的目标是位于你的设备和 Wi-Fi 访问点之间的链路，这个访问点或许是在你家里、办公室中、或你喜欢的咖啡吧中的任何一台路由器。这些提示能帮你提升你的连接的安全性。KRACK 漏洞攻击 出现已经一段时间了，并且已经在 相关技术网站 上有很多详细的讨论，因此，我将不在这里重复攻击的技术细节。攻击方式的总结如下：在 WPA2 无线握手协议中的一个缺陷允许攻击者在你的设备和 wi-fi 访问点之间嗅探或操纵通讯。这个问题在 Linux 和 Android 设备上尤其严重，由于在 WPA2 标准中的措辞含糊不清，也或许是在实现它时的错误理解，事实上，在底层的操作系统打完补丁以前，该漏洞一直可以强制无线流量以无加密方式通讯。还好这个漏洞可以在客户端上修补，因此，天并没有塌下来，而且，WPA2 加密标准并没有像 WEP 标准那样被淘汰（不要通过切换到 WEP 加密的方式去“修复”这个问题）。大多数流行的 Linux 发行版都已经通过升级修复了这个客户端上的漏洞，因此，老老实实地去更新它吧。Android 也很快修复了这个漏洞。如果你的设备在接收 Android 安全补丁，你会很快修复这个漏洞。如果你的设备不再接收这些更新，那么，这个特别的漏洞将是你停止使用你的旧设备的一个理由。即使如此，从我的观点来看， Wi-Fi 是不可信任的基础设施链中的另一个环节，并且，我们应该完全避免将其视为可信任的通信通道。Wi-Fi 是不受信任的基础设备如果从你的笔记本电脑或移动设备中读到这篇文章，那么，你的通信链路看起来应该是这样：KRACK 攻击目标是在你的设备和 Wi-Fi 访问点之间的链接，访问点或许是在你家里、办公室中、或你喜欢的咖啡吧中的任何一台路由器。实际上，这个图示应该看起来像这样：Wi-Fi 仅仅是在我们所不应该信任的信道上的长长的通信链的第一个链路。让我来猜猜，你使用的 Wi-Fi 路由器或许从开始使用的第一天气就没有得到过一个安全更新，并且，更糟糕的是，它或许使用了一个从未被更改过的、缺省的、易猜出的管理凭据（用户名和密码）。除非你自己安装并配置你的路由器，并且你能记得你上次更新的它的固件的时间，否则，你应该假设现在它已经被一些人控制并不能信任的。在 Wi-Fi 路由器之后，我们的通讯进入一般意义上的常见不信任区域 —— 这要根据你的猜疑水平。这里有上游的 ISP 和接入提供商，其中的很多已经被指认监视、更改、分析和销售我们的流量数据，试图从我们的浏览习惯中挣更多的钱。通常他们的安全补丁计划辜负了我们的期望，最终让我们的流量暴露在一些恶意者眼中。一般来说，在互联网上，我们还必须担心强大的国家级的参与者能够操纵核心网络协议，以执行大规模的网络监视和状态级的流量过滤。HTTPS 协议值的庆幸的是，我们有一个基于不信任的介质进行安全通讯的解决方案，并且，我们可以每天都能使用它 —— 这就是 HTTPS 协议，它加密你的点对点的互联网通讯，并且确保我们可以信任站点与我们之间的通讯。Linux 基金会的一些措施，比如像 Let’s Encrypt 使世界各地的网站所有者都可以很容易地提供端到端的加密，这有助于确保我们的个人设备与我们试图访问的网站之间的任何有安全隐患的设备不再是个问题。是的... 基本没关系。DNS —— 剩下的一个问题虽然，我们可以尽量使用 HTTPS 去创建一个可信的通信信道，但是，这里仍然有一个攻击者可以访问我们的路由器或修改我们的 Wi-Fi 流量的机会 —— 在使用 KRACK 的这个案例中 —— 可以欺骗我们的通讯进入一个错误的网站。他们可以利用我们仍然非常依赖 DNS 的这一事实 —— 这是一个未加密的、易受欺骗的 诞生自上世纪 80 年代的协议。DNS 是一个将像 “linux.com” 这样人类友好的域名，转换成计算机可以用于和其它计算机通讯的 IP 地址的一个系统。要转换一个域名到一个 IP 地址，计算机将会查询解析器软件 —— 它通常运行在 Wi-Fi 路由器或一个系统上。解析器软件将查询一个分布式的“根”域名服务器网络，去找到在互联网上哪个系统有 “linux.com” 域名所对应的 IP 地址的“权威”信息。麻烦就在于，所有发生的这些通讯都是未经认证的、易于欺骗的、明文协议、并且响应可以很容易地被攻击者修改，去返回一个不正确的数据。如果有人去欺骗一个 DNS 查询并且返回错误的 IP 地址，他们可以操纵我们的系统最终发送 HTTP 请求到那里。幸运的是，HTTPS 有一些内置的保护措施去确保它不会很容易地被其它人诱导至其它假冒站点。恶意服务器上的 TLS 凭据必须与你请求的 DNS 名字匹配 —— 并且它必须由一个你的浏览器认可的信誉良好的 认证机构（CA） 所签发。如果不是这种情况，你的浏览器将在你试图去与他们告诉你的地址进行通讯时出现一个很大的警告。如果你看到这样的警告，在选择不理会警告之前，请你格外小心，因为，它有可能会把你的秘密泄露给那些可能会对付你的人。如果攻击者完全控制了路由器，他们可以在一开始时，通过拦截来自服务器指示你建立一个安全连接的响应，以阻止你使用 HTTPS 连接（这被称为 “SSL 脱衣攻击”）。 为了帮助你防护这种类型的攻击，网站可以增加一个 特殊响应头（HSTS） 去告诉你的浏览器以后与它通讯时总是使用 HTTPS 协议，但是，这仅仅是在你首次访问之后的事。对于一些非常流行的站点，浏览器现在包含一个 硬编码的域名列表，即使是首次连接，它也将总是使用 HTTPS 协议访问。现在已经有了 DNS 欺骗的解决方案，它被称为 DNSSEC，由于有重大的障碍 —— 真实和可感知的（LCTT 译注，指的是要求实名认证），它看起来接受程度很慢。在 DNSSEC 被普遍使用之前，我们必须假设，我们接收到的 DNS 信息是不能完全信任的。使用 VPN 去解决“最后一公里”的安全问题因此，如果你不能信任固件太旧的 Wi-Fi 和/或无线路由器，我们能做些什么来确保发生在你的设备与常说的互联网之间的“最后一公里”通讯的完整性呢？一个可接受的解决方案是去使用信誉好的 VPN 供应商的服务，它将在你的系统和他们的基础设施之间建立一条安全的通讯链路。这里有一个期望，就是它比你的路由器提供者和你的当前互联网供应商更注重安全，因为，他们处于一个更好的位置去确保你的流量不会受到恶意的攻击或欺骗。在你的工作站和移动设备之间使用 VPN，可以确保免受像 KRACK 这样的漏洞攻击，不安全的路由器不会影响你与外界通讯的完整性。这有一个很重要的警告是，当你选择一个 VPN 供应商时，你必须确信他们的信用；否则，你将被一拨恶意的人出卖给其它人。远离任何人提供的所谓“免费 VPN”，因为，它们可以通过监视你和向市场营销公司销售你的流量来赚钱。 这个网站 是一个很好的资源，你可以去比较他们提供的各种 VPN，去看他们是怎么互相竞争的。注意，你所有的设备都应该在它上面安装 VPN，那些你每天使用的网站，你的私人信息，尤其是任何与你的钱和你的身份（政府、银行网站、社交网络、等等）有关的东西都必须得到保护。VPN 并不是对付所有网络级漏洞的万能药，但是，当你在机场使用无法保证的 Wi-Fi 时，或者下次发现类似 KRACK 的漏洞时，它肯定会保护你。via: https://www.linux.com/blog/2017/10/tips-secure-your-network-wake-krack作者：KONSTANTIN RYABITSEV 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出