蚊章汇 - Konstantin Ryabitsev
type: channel
link: https://linuxcn.bwsl.wang/author/772/
description: Konstantin Ryabitsev
items: 用 PGP 保护代码完整性（七）：保护在线帐户
items: 用 PGP 保护代码完整性（六）：在 Git 上使用 PGP
items: 用 PGP 保护代码完整性（五）：将子密钥移到一个硬件设备中
items: 用 PGP 保护代码完整性（四）：将主密钥移到离线存储中
items: 将你的树莓派打造成一个 Tor 中继节点
items: 用 PGP 保护代码完整性（三）：生成 PGP 子密钥
items: 用 PGP 保护代码完整性（二）：生成你的主密钥
items: 用 PGP 保护代码完整性（一）： 基本概念和工具
items: 哪个 Linux 内核版本是 “稳定的”？
items: 由 KRACK 攻击想到的确保网络安全的小贴士

用 PGP 保护代码完整性（七）：保护在线帐户
type: item
date: 2019-01-11T07:12:00+08:00
description: 在这个系列的最后一篇当中，我们将为你展示如何用双因子认证保护你的在线账户。到目前为止，本系列教程已经提供了 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 加密来保护它。通过将你的主密钥移到一个离线存储中并将子密钥移到一个外置硬件设备中的方式来配置你的环境，让窃取你的身份变得极…

用 PGP 保护代码完整性（六）：在 Git 上使用 PGP
type: item
date: 2019-01-07T08:09:00+08:00
description: 我们继续我们的 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。由于你的提交是经过正确签名的，因此有人可能将包含有恶意…

用 PGP 保护代码完整性（五）：将子密钥移到一个硬件设备中
type: item
date: 2019-01-05T08:15:36+08:00
description: 在这个系列教程中，将为你提供使用 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 -…

用 PGP 保护代码完整性（四）：将主密钥移到离线存储中
type: item
date: 2019-01-01T08:35:38+08:00
description: 如果开发者的 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 AAAA9999888877776666555544443…

将你的树莓派打造成一个 Tor 中继节点
type: item
date: 2018-07-08T17:50:37+08:00
description: 在此教程中学习如何将你的旧树莓派打造成一个完美的 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 这个脚本将做如下的工作：安装最新版本的操作系统更新以确保树莓派打了所有的补丁将…

用 PGP 保护代码完整性（三）：生成 PGP 子密钥
type: item
date: 2018-05-05T04:29:00+08:00
description: 在第三篇文章中，我们将解释如何生成用于日常工作的 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 保护代码完整性（二）：生成你的主密钥
type: item
date: 2018-04-09T16:12:00+08:00
description: 在本系列文章中，我们将深度探讨如何使用 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。运行以下命令，用你密钥的完…

用 PGP 保护代码完整性（一）： 基本概念和工具
type: item
date: 2018-04-08T17:19:00+08:00
description: 在本系列文章中，我们将深度探讨如何使用 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> 当使用多个身份时，其中之一将被标记为“ p…

哪个 Linux 内核版本是 “稳定的”？
type: item
date: 2018-02-15T05:52:00+08:00
description: 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: h…

由 KRACK 攻击想到的确保网络安全的小贴士
type: item
date: 2017-11-12T07:59:00+08:00
description: 最近的 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 名字匹配 —— 并且它必须由一个你的…