Konstantin Ryabitsev 发布的文章

在这个系列的最后一篇当中,我们将为你展示如何用双因子认证保护你的在线账户。

到目前为止,本系列教程已经提供了 PGP 的实用指南,包括基本概念和工具、生成和保护你的密钥的步骤。如果你错过了前面的文章,可以通过下面的链接查看。在本系列的最后一篇文章中,我们将为你保护在线帐户提供一个额外的指南,保护在线帐户是当今非常重要的一件事情。

清单

  • 取得一个具备 U2F 功能的设备(必要)
  • 为你的在线帐户启用双因子认证(必要)

    • GitHub/GitLab
    • Google
    • 社交媒体
  • 使用 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,并且将它用作备份)。

延伸阅读

到目前为止,你已经完成了下列的重要任务:

  1. 创建你的开发者身份并使用 PGP 加密来保护它。
  2. 通过将你的主密钥移到一个离线存储中并将子密钥移到一个外置硬件设备中的方式来配置你的环境,让窃取你的身份变得极为困难。
  3. 配置你的 Git 环境去确保任何使用你项目的人都能够验证仓库的完整性和它的整个历史。
  4. 使用双因子认证强化你的在线帐户。

在安全保护方面,你已经做的很好了,但是你还应该去阅读以下的主题:

  • 如何去强化你的团队沟通。你的项目开发和治理决策的要求应该和保护提交代码那样去保护,如果不这样做,应该确保你的团队沟通是可信任的,并且所有决策的完整性是可验证的。
  • 如何去强化你的工作站的安全。你的目标是尽可能减少导致项目代码被污染的危险或你的开发者身份被窃的行为。
  • 如何写出安全的代码(查看相关编程语言和你项目所使用的库的各种文档)。即便引入它的提交代码上有一个 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、使用签名的标签,然后介绍签名提交,最后添加签名推送的支持。

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 的实用指南。如果你没有看过前面的文章,你可以通过下面的链接去查看。在这篇文章中,我们将继续讨论如何保护你的密钥,谈一谈将你的子密钥移到一个专门的硬件设备中的一些技巧。

清单

  • 取得一个 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,它分别是 12345612345678。如果它们的 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 <[email protected]>
[ultimate] (2)  Alice Engineer <[email protected]>

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 <[email protected]>
[ultimate] (2)  Alice Engineer <[email protected]>

注意与密钥对应的 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 <[email protected]>
uid           [ultimate] Alice Engineer <[email protected]>
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 <[email protected]>'

你也可以通过使用 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 提供了一个实用指南。你可以从下面的链接中查看前面的文章:

这是本系列教程的第四部分,我们继续本教程,我们将谈一谈如何及为什么要将主密钥从你的家目录移到离线存储中。现在开始我们的教程。

清单

  • 准备一个加密的可移除的存储(必要)
  • 备份你的 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 <[email protected]>
uid           [ultimate] Alice Engineer <[email protected]>
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 <[email protected]>
uid [ultimate] Alice Engineer <[email protected]>
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 中继节点。

你是否和我一样,在第一代或者第二代树莓派发布时买了一个,玩了一段时间就把它搁置“吃灰”了。毕竟,除非你是机器人爱好者,否则一般不太可能去长时间使用一个处理器很慢的、并且内存只有 256 MB 的计算机。这并不是说你不能用它去做一件很酷的东西,但是在工作和其它任务之间,我还没有看到用一些旧的物件发挥新作用的机会。

然而,如果你想去好好利用它并且不想花费你太多的时间和资源的话,可以将你的旧树莓派打造成一个完美的 Tor 中继节点。

Tor 中继节点是什么

在此之前你或许听说过 Tor 项目,如果恰好你没有听说过,我简单给你介绍一下,“Tor” 是 “The Onion Router(洋葱路由器)” 的缩写,它是用来对付在线追踪和其它违反隐私行为的技术。

不论你在互联网上做什么事情,都会在你的 IP 包通过的设备上留下一些数字“脚印”:所有的交换机、路由器、负载均衡,以及目标网络记录的来自你的原始会话的 IP 地址,以及你访问的互联网资源(通常是它的主机名,即使是在使用 HTTPS 时)的 IP 地址。如过你是在家中上互联网,那么你的 IP 地址可以直接映射到你的家庭所在地。如果你使用了 VPN 服务(你应该使用),那么你的 IP 地址映射到你的 VPN 提供商那里,而 VPN 提供商是可以映射到你的家庭所在地的。无论如何,有可能在某个地方的某个人正在根据你访问的网络和在网站上呆了多长时间来为你建立一个个人的在线资料。然后将这个资料进行出售,并与从其它服务上收集的资料进行聚合,然后利用广告网络进行赚钱。至少,这是乐观主义者对如何利用这些数据的一些看法 —— 我相信你还可以找到更多的更恶意地使用这些数据的例子。

Tor 项目尝试去提供一个解决这种问题的方案,使它们不可能(或者至少是更加困难)追踪到你的终端 IP 地址。Tor 是通过让你的连接在一个由匿名的入口节点、中继节点和出口节点组成的匿名中继链上反复跳转的方式来实现防止追踪的目的:

  1. 入口节点 只知道你的 IP 地址和中继节点的 IP 地址,但是不知道你最终要访问的目标 IP 地址
  2. 中继节点 只知道入口节点和出口节点的 IP 地址,以及既不是源也不是最终目标的 IP 地址
  3. 出口节点 仅知道中继节点和最终目标地址,它是在到达最终目标地址之前解密流量的节点

中继节点在这个交换过程中扮演一个关键的角色,因为它在源请求和目标地址之间创建了一个加密的障碍。甚至在意图偷窥你数据的对手控制了出口节点的情况下,在他们没有完全控制整个 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

这个脚本将做如下的工作:

  1. 安装最新版本的操作系统更新以确保树莓派打了所有的补丁
  2. 将系统配置为无人值守自动更新,以确保有可用更新时会自动接收并安装
  3. 安装 Tor 软件
  4. 告诉你的 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 [email protected]

保存文件并重引导系统去启动 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 子密钥。

清单

  1. 生成 2048 位加密子密钥(必要)
  2. 生成 2048 位签名子密钥(必要)
  3. 生成一个 2048 位验证子密钥(推荐)
  4. 将你的公钥上传到 PGP 密钥服务器(必要)
  5. 设置一个刷新的定时任务(必要)

注意事项

现在我们已经创建了主密钥,让我们创建用于日常工作的密钥。我们创建 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 <[email protected]>
uid [ultimate] Alice Engineer <[email protected]>
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(谁不是呢?),则应按照他们提供的说明上传密钥:

要生成适合粘贴的公钥输出,只需运行:

$ gpg --export --armor [fpr]

设置一个刷新定时任务

你需要定期刷新你的钥匙环,以获取其他人公钥的最新更改。你可以设置一个定时任务来做到这一点:

$ crontab -e

在新行中添加以下内容:

@daily /usr/bin/gpg2 --refresh >/dev/null 2>&1

注意:检查你的 gpggpg2 命令的完整路径,如果你的 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中国 荣誉推出