身份背后的通用概念

本章解释了什么是身份,以及分配、管理和使用身份的基本知识。这些是你需要知道的概念,以便了解 SPIFFE 和 SPIRE 的工作方式。

什么是身份?

对于人类来说,身份是复杂的。人类是独特的个体,不能被克隆,也不能用代码取代他们的思想,而且一生中可能会有多种社会身份。软件服务也同样复杂。

一个单一的程序可能会扩展到成千上万的节点,或者在构建系统推送新的更新时,一天内多次改变其代码。在这样一个快速变化的环境中,一个身份必须代表服务的特定逻辑目的(例如,客户计费数据库)和与已建立的权威或信任根(例如,my-company.example.org 或生产工作负载的发行机构)的关联。

一旦为一个组织中的所有服务发布了身份,它们就可以被用于认证:证明一个服务是它所声称的那样。一旦服务经过相互认证,它们就可以使用身份进行授权,或控制谁可以访问这些服务,以及保密性,或保持它们相互传输的数据的秘密。虽然 SPIFFE 本身并不包括认证、授权或保密性,但它发出的身份可用于所有这些。

为一个组织指定服务身份与设计该组织基础设施的任何其他部分类似:它密切依赖于该组织的需求。当一个服务扩大规模、改变代码或移动位置时,它保持相同的身份可能是合乎逻辑的。

值得信赖的身份

现在我们已经定义了身份,那么我们如何表示这种身份?我们如何知道,当一个软件(或工作负载)声称自己的身份时,这个声称是值得信赖的?为了开始探索这些问题,我们必须首先讨论身份是如何建立的。

人类的身份

请允许我们用大家共同的东西来解释这些概念:现实世界中的身份。

身份证件

如果一个名字是一个人的身份,那么这个身份的证明就是一个身份文件。护照是允许一个人证明其身份的文件,所以它是一个身份文件。像不同国家的护照一样,不同类型的软件身份文件可能看起来不同,而且不总是包含相同的信息。但为了有用,它们通常至少都包含一些共同的信息,如姓名。

护照和写有你名字的餐巾纸之间的区别是什么?

最重要的区别是来源。对于护照,我们相信签发机构已经核实了你的身份,而且我们有能力核实护照是由该受信任的机构签发的(验证)。对于那张餐巾纸,我们不知道它来自哪里,也没有办法验证它是否来自你说的那家餐馆。我们也无法相信餐厅在餐巾纸上写了正确的名字,或者在你传达你的名字时验证了它的准确性。

信任一个发行机构

我们相信护照,因为我们隐含地相信签发护照的机构。我们信任他们签发这些身份文件的过程:他们有记录和控制,以确保他们只向正确的个人签发身份。我们信任这个过程的管理,所以我们知道该机构签发的护照是某人身份的忠实代表。

核实身份文件

鉴于此,我们如何区分真护照和假护照?这就是验证的意义所在。组织需要一种方法来确定身份文件是否是由我们信任的权威机构签发的。这通常是通过难以复制但容易验证的水印来实现的。

对出示身份证件的人进行认证

护照记录了关于身份所代表的人的几项信息。首先,它们包括一个人的照片,可以用来验证出示者是护照上的同一个人。它们还可能包括此人的其他身体特征 —— 例如,他们的身高、体重和眼睛颜色。

所有这些属性都可以用来验证出示护照的人。

简而言之,护照是我们的身份文件,我们用它来确认彼此的身份,因为我们信任签发机构,并且有办法验证该文件来自该机构。最后,我们可以通过交叉参考护照的内容和持有护照的人,来验证出示护照的人。

数字世界中的身份:加密身份

绕回工作负载身份,上述概念如何映射到计算机系统?计算机使用的是数字身份文件,而不是护照。X.509 证书、签名的 JSON 网络令牌(JWT)和 Kerberos 票据,都是数字身份文件的例子。数字身份文件可以使用加密技术进行验证。然后,计算机系统可以被验证,就像一个拥有护照的人一样。

做到这一点的最有用和最普遍的技术之一是公钥基础设施(PKI)。PKI 被定义为一套创建、管理、分发、使用、存储和撤销数字证书以及管理公钥加密所需的角色、策略、硬件、软件和程序。有了 PKI,数字身份文件可以在本地进行验证,即根据一组小的、静态的根信任包进行验证。

X.509 的简要概述

国际电信联盟电信标准化部门(ITU-T)于 1988 年首次发布 X.509 标准的 PKI 时,这在当时是非常雄心勃勃的,现在仍然被认为是如此。该标准最初设想为人类、服务器和其他设备提供证书,形成一个巨大的全球一体化安全通信系统。虽然 X.509 从未达到其最初的预期,但它是几乎所有安全通信协议的基础。

X.509 是如何在单一机构中工作的

  1. Bob 的计算机需要一个证书。他生成了一个随机的私钥,还有一个证书签名请求(CSR),其中包括他的计算机的基本信息,比如它的名字;我们称之为 bobsbox。CSR 有点像护照申请。
  2. Bob 将他的 CSR 发送给一个证书颁发机构(CA)。CA 验证 Bob 是否真的是 Bob。这种验证的具体方式可能有所不同 —— 它可能涉及一个人检查 Bob 的文件,或自动检查。
  3. 然后,CA 通过对 CSR 中提出的信息进行编码来创建证书,并添加数字签名,以断言 CA 已经验证了其中包含的信息是真实和正确的。它把证书送回给 Bob。
  4. 当 Bob 想与 Alice 建立安全通信时,他的计算机可以出示他的证书,并以密码学方式证明它拥有 Bob 的私钥(而不需要实际与任何人分享该私钥的内容)。
  5. Alice 的计算机可以通过检查证书颁发机构是否签署了 Bob 的证书来检查 Bob 的证书是否真的是 Bob 的证书。她相信证书颁发机构在签署证书之前正确检查了 Bob 的身份。

图 3.1:Bob 向证书颁发机构申请证书,并用它来向 Alice 证明他的身份。
图 3.1:Bob 向证书颁发机构申请证书,并用它来向 Alice 证明他的身份。

图 3.2:PKI 简况。
图 3.2:PKI 简况。

图 3.3:中间证书颁发机构的说明。
图 3.3:中间证书颁发机构的说明。

带有中间证书机构的 X.509

在许多情况下,签署了某一特定证书的 CA 并不广为人知。相反,该 CA 有自己的密钥和证书,而该证书是由另一个 CA 签署的。通过签署该 CA 证书,上级 CA 证明了下级 CA 被授权签发数字身份。这种由高阶 CA 对低阶 CA 的授权被称为委托(delegation)

委托可以重复发生,低阶 CA 进一步委托他们的权力,形成一个任意高的证书授权树。最高等级的 CA 被称为根 CA,必须有一个知名的证书。链中的每一个其他 CA 都被称为 中间 CA。这种方法的好处是,需要知名的密钥较少,允许列表的变化不那么频繁。

这导致了 X.509 的一个关键弱点:任何 CA 可以签署任何证书,没有任何限制。如果一个黑客决定建立自己的中间 CA,并能得到任何一个现有中间 CA 的批准,那么他就可以有效地签发他想要的任何身份。至关重要的是,每个知名的 CA 都是完全值得信赖的,而且他们委托的每个中间 CA 也是完全值得信赖的。

证书和身份的生命周期

在 PKI 中有几个额外的功能,使数字身份的管理和认证更容易和更安全。权限委托、身份撤销和有限的身份文件寿命是其中的几个例子。

身份发放

首先,必须能够发布一个新的身份。人类的诞生,新软件服务的编写,在每一种情况下,我们都必须在以前没有身份的地方颁发一个身份。

首先,一项服务需要申请一个新的身份。对于人来说,这可能是一个纸质表格。对于软件来说,它是一个 X.509 文件,称为证书签名请求(CSR),它是用一个相应的私钥创建的。CSR 类似于证书,但由于它没有被任何证书颁发机构签署,没有人会承认它是有效的。然后,该服务将 CSR 安全地发送给证书颁发机构。

接下来,证书颁发机构根据申请证书的服务检查 CSR 的每个细节。最初,这本来是一个手工过程:人类检查文书工作,并在个人基础上作出决定。今天,检查和签署过程通常是完全自动化的。如果你使用过流行的 LetsEncrypt 证书颁发机构,那么你就会熟悉完全自动化的证书颁发机构签署过程。

一旦满意,证书颁发机构将其数字签名附加到 CSR 上,将其变成一个完全成熟的证书。它把证书返回给服务。与它先前生成的私钥一起,该服务可以让他人安全地识别自己。

证书撤销

那么,如果一项服务被破坏了,会发生什么?如果 Bob 的笔记本电脑被黑了,或者 Bob 离开了公司,不应该再有访问权,怎么办?

这种取消信任的过程被称为证书撤销(Certificate Revocation)。证书颁发机构维护一个名为 **“证书撤销列表”(CRL)**的文件,其中包含被撤销的证书的唯一 ID,并将该文件的签名副本分发给任何要求的人。

撤销是很棘手的,有几个原因。首先,CRL 必须由某个端点托管和提供,这就给确保端点的正常运行和可达带来了挑战。当该端点不可用时,PKI 是否停止工作?在实践中,大多数软件将无法打开,在 CRL 不可用时继续信任证书,使它们实际上没有用处。

第二,CRL 可能会变得庞大而不方便。被撤销的证书必须保留在 CRL 中,直到它过期为止,而证书的寿命一般都很长(在几年的时间内)。这可能导致服务、下载和处理清单本身的性能问题。

已经开发了几种不同的技术,试图使证书撤销更简单、更可靠,如在线证书状态协议(OCSP)。各种各样的方法使证书撤销成为一个持续的挑战。

证书过期

每个证书都有一个内置的过期日期。过期日期是 X.509 安全的一个重要部分,有几个不同的原因:管理过时,限制证书显示的身份变化的可能性,限制 CRL 的大小,以及减少秘钥被盗的可能性。

证书已经存在了很长时间了。当它们刚被开发出来时,许多 CA 使用 1989 年的 MD2 散列算法,这种算法很快被发现是不安全的。如果这些证书仍然有效,攻击者可以伪造它们。

有限的证书寿命的另一个重要方面是,CA 只有一次机会来验证申请者的身份,但这些信息不能保证长期保持正确。例如,域名经常改变所有权,是证书中一般包括的比较关键的信息之一。

如果使用了证书撤销列表,那么每个仍然有效的证书都有可能被撤销。如果证书永远持续下去,那么证书撤销列表就会无止境地增长。为了保持证书撤销列表的小规模,证书需要过期。

最后,证书的有效期越长,其证书的私钥或任何通往根的证书被盗的风险就越大。

频繁的证书更新

解决撤销所带来的挑战的一个折中办法是更多地依靠证书过期。如果证书的有效期很短(也许只有几个小时),那么 CA 就可以经常重新执行它最初做的所有检查。如果证书的更新足够频繁,那么 CRL 可能甚至没有必要,因为等待证书过期可能会更快。

身份寿命的权衡

更短的寿命 更长的寿命
如果文件被盗,它的有效期会缩短 减少了证书颁发机构的负担(人和程序)
CRL 比较短,也许没有必要 降低网络的负荷
一次性减少未结清的身份文件(更容易跟踪) 在一个节点因网络中断而无法更新其证书时,具有更好的弹性

另一种加密身份:JSON 网络令牌(JWT)

另一个公钥身份文件,JSON 网络令牌(RFC7519),也表现为一个类似 PKI 的系统。它不使用证书,而是使用 JSON 令牌,并有一个称为 JSON Web Key Set 的结构,作为 CA 绑定来验证 JSON 令牌。证书和 JWT 之间有一些重要的区别,超出了本书的范围,但就像 X.509 证书一样,JWT 的真实性可以通过 PKI 来验证。

外部身份的可信度

无论你使用哪种身份,都必须由一些受信任的机构来签发。在许多情况下,并不是每个人都信任相同的当局或其颁发的过程。Alice 的纽约州驾照在纽约是有效的身份证明,但它在伦敦是无效的,因为伦敦当局不信任纽约州的政府。然而,Bob 的美国护照在伦敦是有效的,因为英国当局信任美国政府,而伦敦当局信任英国当局。

在数字身份文件领域,情况是相同的。Alice 和 Bob 可能拥有由完全不相关的 CA 签署的证书,但只要他们都信任这些 CA,他们就可以相互认证。这并不意味着 Alice 必须信任 Bob,只是她可以安全地识别他。

如何使用软件身份

一旦一个软件有了数字身份文件,它就可以被用于许多不同的目的。我们已经讨论了使用身份文件进行认证。它们还可以用于相互 TLS、授权、可观测性和计量。

认证

身份文件最常见的用途是作为认证的基础。对于软件身份,存在几种不同的认证协议,使用 X.509 证书或 JWT 来证明一个服务对另一个服务的身份。

保密性和完整性

保密性意味着攻击者不能看到信息的内容,而完整性意味着他们不能在传输过程中改变信息。传输层安全(TLS)是一个广泛使用的协议,用于建立安全连接,在使用 X.509 证书的不受信任的网络连接之上提供认证、保密性和消息完整性。

TLS 的一个特点是,连接的任何一方都可以使用证书进行认证。例如,当你连接到你的银行网站时,你的网络浏览器使用银行提供的 X.509 证书来验证你的银行,但你的浏览器并没有向银行提供证书。(你用用户名和密码登录,而不是用证书)。

当两个软件进行通信时,连接的双方通常都有 X.509 证书并相互认证。这被称为相互认证的 TLS。

授权

一旦数字身份得到认证,它就可以被用来授权访问服务。通常情况下,每个服务都有一个允许其他服务对其提出请求的列表。授权只有在认证之后才能发生。

可观测性

身份识别对于提高你的组织的基础设施内的可观测性也很有用。在大型组织中,旧的或未维护的服务以神秘的、未记录的方式进行通信是非常普遍的。每个服务的独特身份可以与可观测性工具一起解决这个问题。对于日志记录来说,如果以后出了问题,请求者的可反驳身份是很有用的。

计量

在微服务架构中,一个常见的需求是对请求进行节流,以便快速的微服务不至于压倒慢的微服务。如果每个微服务都有一个独特的身份,就可以用来管理每秒的请求配额来解决这个问题,或者完全拒绝访问。

总结

人类和软件都有身份,而且都可以使用身份文件来证明自己的身份。对人类来说,护照是身份文件的一种典型形式。对于软件来说,最常见的数字身份文件形式是 X.509 证书。

证书是由证书颁发机构颁发的。证书颁发机构需要注意正确验证他们为之创建证书的人或事,并管理证书的寿命。证书颁发后,无论谁使用它,都需要信任颁发它的证书机构。

一旦有了可信的数字身份文件,它们有许多不同的用途。其中最常见的是创建一个相互认证的 TLS 连接,其中包括认证、保密性和完整性。另一个常见的用途是用于授权。有了认证、保密性、完整性和授权,服务之间的连接是安全的。