大数据系列之:Kerberos
- 基本概念
- 工作流程
- 安全特性
- 应用场景
- 总结
- 加密原理
- Kerberos认证流程
- 更改您的密码
- 授予账户访问权限
- 票证管理
- Kerberos 票据属性
- 使用 kinit 获取票据
- 使用 `klist` 查看票据
- 使用 `kdestroy` 销毁票据
- .k5identity 文件描述
Kerberos 是一种网络认证协议,广泛用于在不安全的网络环境中提供强大的身份验证服务。它基于对称密钥加密技术,旨在确保客户端和服务端之间的通信安全,防止未经授权的访问。
基本概念
KDC (Key Distribution Center): KDC 是 Kerberos 系统的核心组件,负责生成和分发票据(tickets)。
KDC 通常分为两个部分:
- AS (Authentication Server): 负责验证用户的身份,并发放 TGT (Ticket-Granting Ticket)。
- TGS (Ticket-Granting Service): 使用 TGT 验证用户身份,并发放服务票据(Service Tickets)。
- TGT (Ticket-Granting Ticket): TGT 是 AS 发放的一种特殊票据,用于证明用户已经通过了身份验证。用户可以使用 TGT 向 TGS 请求服务票据。
- Service Ticket: 服务票据是 TGS 发放的一种票据,用户可以使用它来访问特定的服务。
工作流程
用户请求 TGT:
- 用户向 AS 发送请求,包含用户名和时间戳。
- AS 验证用户身份(通常通过密码),如果验证成功,AS 生成一个 TGT 并加密后返回给用户。
用户请求服务票据:
- 用户使用 TGT 向 TGS 发送请求,请求中包含所需服务的名称。
- TGS 验证 TGT,如果验证成功,TGS 生成一个服务票据并加密后返回给用户。
用户访问服务:
- 用户将服务票据发送给目标服务。
- 服务验证服务票据,如果验证成功,允许用户访问服务。
安全特性
- 对称密钥加密: Kerberos 使用对称密钥加密技术,确保数据在传输过程中不被窃取或篡改。
- 时间同步: Kerberos 要求客户端和服务器之间的时间同步,以防止重放攻击。
- 票据有效期: 票据有有限的有效期,过期后需要重新获取,这增加了系统的安全性。
应用场景
Kerberos 广泛应用于企业级网络环境,特别是在需要高度安全的身份验证和授权的情况下。
常见的应用场景包括:
- Windows 域环境: Windows 域控制器使用 Kerberos 进行身份验证。
- Linux 和 Unix 环境: 许多 Linux 和 Unix 系统支持 Kerberos 身份验证。
- Web 服务: 一些 Web 服务使用 Kerberos 进行单点登录(SSO)。
总结
- Kerberos 是一种强大而复杂的认证协议,能够有效保护网络资源不受未授权访问。
- 通过使用对称密钥加密和时间同步机制,Kerberos 提供了高效且安全的身份验证服务。
加密原理
Kerberos认证流程
klist -ket zeppelin1.bigdata.net.keytab
Keytab name: FILE:zeppelin1.bigdata.net.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
1 2021-03-03T03:48:45 zeppelin/zeppelin1.bigdata.net@OPTICS.bigdata.COM
kinit -kt zeppelin1.bigdata.net.keytab zeppelin/zeppelin1.bigdata.net@OPTICS.bigdata.COM
更改您的密码
要更改您的 Kerberos 密码,请使用 kpasswd 命令。它会要求您输入旧密码(以防止其他人趁您不在时走到您的电脑前并更改您的密码),然后两次提示您输入新密码。(要求您输入两次的原因是为了确保您正确输入了密码。)例如,用户 david 会执行以下操作:
kpasswd
Password for david@EXAMPLE.COM:
Enter new password:
Enter new password again:
授予账户访问权限
如果您需要授予某人登录您的账户的权限,可以通过Kerberos来实现,而无需告诉他们您的密码。只需在您的主目录下创建一个名为.k5login
的文件。该文件应包含您希望授予访问权限的每个人的Kerberos主体名称,每个主体名称必须单独占一行。以下是一个示例 .k5login
文件:
jennifer@ATHENA
david@EXAMPLE.COM
此文件将允许用户jennifer和david使用您的用户ID,前提是他们各自领域中的Kerberos票据有效。如果您将在网络上的其他主机上登录,您可能希望在这些主机上的每个.k5login
文件中包含您自己的Kerberos主体名称。
使用.k5login
文件比直接给出密码要安全得多,因为:
您可以随时通过从.k5login
文件中移除相应的主体名称来撤销访问权限。
虽然用户对特定主机(或如果您的.k5login
文件被共享,例如通过NFS,则是一组主机)上的您的账户有完全访问权限,但他们不会继承您的网络特权。
Kerberos记录了谁获取了票据,因此系统管理员可以在必要时查明特定时间哪些用户能够使用您的用户ID。
一个常见的应用场景是在root用户的主目录中放置一个.k5login
文件,列出的Kerberos主体将获得对该机器的root访问权限。这使得系统管理员可以在不透露root密码的情况下,允许用户本地提升为root,或者远程以root身份登录,同时避免了在网络上传输root密码的风险。
票证管理
在许多系统中,Kerberos 被集成到登录程序中,您在登录时会自动获得票证。其他程序(如 ssh)可以将您的票证副本转发到远程主机。这些程序中的大多数在退出时也会自动销毁您的票证。然而,MIT 建议您在不再需要票证时明确地销毁它们,以确保安全。一种确保这一点的方法是将 kdestroy 命令添加到您的 .logout 文件中。此外,如果您要离开计算机并且担心入侵者利用您的权限,最安全的做法是销毁所有票证副本,或者使用锁定屏幕的屏保程序。
Kerberos 票据属性
Kerberos 票据可以具有多种属性:
- 可转发的票据:如果一个票据是可转发的,那么 KDC 可以基于该可转发票据签发一个新的票据(必要时具有不同的网络地址)。这允许在不重新输入密码的情况下进行身份验证转发。例如,如果拥有可转发 TGT 的用户登录到远程系统,KDC 可以为该用户签发新的 TGT,使用远程系统的网络地址,从而使得在该主机上的身份验证像本地登录一样工作。
- 当 KDC 基于可转发票据创建新票据时,它会在新票据上设置转发标志。任何基于设置了转发标志的票据创建的票据也将具有其转发标志。
- 可代理的票据:类似于可转发票据,可代理票据允许服务接管客户端的身份。然而,与可转发票据不同的是,可代理票据仅针对特定服务签发。换句话说,不能基于可代理但不可转发的票据签发票证授予票据。
- 代理票据:基于可代理票据签发的票据。
- 预设日期的票据:带有无效标志签发的票据。在票据上列出的开始时间之后,它可以提交给 KDC 以获取有效的票据。
- 带有预设日期标志的票证授予票据可用于获取预设日期的服务票据。
- 可续期的票据:可以在用户不重新输入密码的情况下用于获取新的会话密钥。可续期票据有两个过期时间。第一个是此特定票据过期的时间。第二个是基于此可续期票据签发的任何票据可能的最晚过期时间。
- 初始标志票据:基于身份验证协议签发的票据,而不是基于票证授予票据。希望确保用户的密钥最近已提供验证的应用服务器可以指定此标志必须设置才能接受票据。
- 无效票据:必须被应用服务器拒绝。预设日期的票据通常带有此标志发出,并且在能够使用之前必须由 KDC 验证。
- 预先认证的票据:只有在请求票据的客户端向 KDC 自身进行了认证后才会签发的票据。
- 硬件认证标志:设置在需要使用硬件进行认证的票据上。预计该硬件仅由请求票据的客户端持有。
- 传输策略检查标志:如果票据设置了此标志,则表明签发该票据的 KDC 实施了跨域检查策略并检查了票据上的跨域列表。跨域列表包含从首次签发票据的 KDC 所属领域到签发当前票据的 KDC 所属领域的所有中间域。如果没有设置此标志,则应用服务器必须自己检查跨域或拒绝票据。
- 可作为委托方的标志:表示票据中指定的服务器根据该域的策略适合作为委托方。一些客户端应用程序可能会使用此标志来决定是否将票据转发到远程主机,尽管许多应用程序并不遵守此标志。
- 匿名票据:其中的命名主体是该域的通用主体;实际上并没有指定将使用票据的具体个人。这种票据的目的仅仅是安全地分发会话密钥。
使用 kinit 获取票据
如果您的站点已经将 Kerberos V5 与登录系统集成,您在登录时会自动获得 Kerberos 票据。否则,您可能需要显式地获取 Kerberos 票据,使用 kinit 程序。同样,如果您的 Kerberos 票据过期,也请使用 kinit 程序获取新的票据。
要使用 kinit 程序,只需键入 kinit,然后在提示符下输入您的密码。例如,Jennifer(用户名为 jennifer)在 Bleep, Inc.(一个虚构的公司,域名是 mit.edu,Kerberos 领域是 ATHENA.MIT.EDU)工作。她会键入:
shell% kinit
jennifer@ATHENA.MIT.EDU 的密码: <-- [在这里键入 Jennifer 的密码。]
shell%
如果您键入了错误的密码,kinit 会给出以下错误消息:
shell% kinit
jennifer@ATHENA.MIT.EDU 的密码: <-- [在这里键入错误的密码。]
kinit: 密码不正确
shell%
这样您就不会获得 Kerberos 票据。
默认情况下,kinit 假设您希望获取默认领域中自己的用户名的票据。假设 Jennifer 的朋友 David 来访,并希望借用她的窗口检查邮件。David 需要在自己的领域 EXAMPLE.COM 中获取自己的票据。他会键入:
shell% kinit david@EXAMPLE.COM
david@EXAMPLE.COM 的密码: <-- [在这里键入 David 的密码。]
shell%
David 就可以使用这些票据登录到他自己的机器。请注意,他在 Jennifer 的机器上本地输入了自己的密码,但从未通过网络传输。本地主机上的 Kerberos 完成了对另一个领域中的 KDC 的身份验证。
如果您希望将票据转发到另一台主机,需要请求可转发的票据。您可以通过指定 -f 选项来实现这一点:
shell% kinit -f
jennifer@ATHENA.MIT.EDU 的密码: <-- [在这里键入您的密码。]
shell%
请注意,kinit 不会告诉您它已获取了可转发的票据;您可以使用 klist 命令进行验证(参见 使用 klist 查看票据)。
通常,您的票据有效期为您系统默认的票据生命周期,许多系统默认为十小时。您可以使用 -l 选项指定不同的票据生命周期。在值后添加字母 s 表示秒,m 表示分钟,h 表示小时,d 表示天。例如,要获取有效期为三小时的可转发票据给 david@EXAMPLE.COM,您会键入:
shell% kinit -f -l 3h david@EXAMPLE.COM
david@EXAMPLE.COM 的密码: <-- [在这里键入 David 的密码。]
shell%
注意
您不能混合单位;指定 3h30m 的生命周期会导致错误。另外,请注意大多数系统指定了最大票据生命周期。如果您请求的票据生命周期超过最大值,它将自动缩短为最大生命周期。
使用 klist
查看票据
klist 命令用于显示您的票据。当您首次获取票据时,通常只会有一个票据授予票据。列表看起来会是这样的:
shell% klist
Ticket cache: /tmp/krb5cc_ttypa
Default principal: jennifer@ATHENA.MIT.EDUValid starting Expires Service principal
06/07/04 19:49:21 06/08/04 05:49:19 krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
shell%
票据缓存是指您的票据文件的位置。在上面的例子中,此文件名为 /tmp/krb5cc_ttypa
。默认主体是您的 Kerberos 主体。
“有效开始时间”和“到期时间”字段描述了票据的有效期间。“服务主体”描述了每个票据。票据授予票据的第一部分为 krbtgt
,第二部分为领域名称。
现在,假设 jennifer 连接到主机 daffodil.mit.edu
,然后再次输入 klist
,她将看到以下结果:
shell% klist
Ticket cache: /tmp/krb5cc_ttypa
Default principal: jennifer@ATHENA.MIT.EDUValid starting Expires Service principal
06/07/04 19:49:21 06/08/04 05:49:19 krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
06/07/04 20:22:30 06/08/04 05:49:19 host/daffodil.mit.edu@ATHENA.MIT.EDU
shell%
这里发生了什么:当 jennifer 使用 ssh 连接到主机 daffodil.mit.edu
时,ssh 程序向 KDC 展示了她的票据授予票据,并请求了一个针对主机 daffodil.mit.edu
的主机票据。KDC 发送了主机票据,ssh 随后将该票据展示给主机 daffodil.mit.edu
,因此她无需输入密码即可登录。
假设您的 Kerberos 票据允许您登录到另一个域中的主机,例如 trillium.example.com
,该主机也位于另一个 Kerberos 领域 EXAMPLE.COM
。如果您 ssh 到这个主机,您将收到一个针对 EXAMPLE.COM
领域的票据授予票据,以及一个新的针对 trillium.example.com
的主机票据。klist
将显示如下内容:
% klist
shell% klist
Ticket cache: /tmp/krb5cc_ttypa
Default principal: jennifer@ATHENA.MIT.EDUValid starting Expires Service principal
06/07/04 19:49:21 06/08/04 05:49:19 krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDU
06/07/04 20:22:30 06/08/04 05:49:19 host/daffodil.mit.edu@ATHENA.MIT.EDU
06/07/04 20:24:18 06/08/04 05:49:19 krbtgt/EXAMPLE.COM@ATHENA.MIT.EDU
06/07/04 20:24:18 06/08/04 05:49:19 host/trillium.example.com@EXAMPLE.COM
shell%
根据您的主机和领域的配置,您还可能看到一个服务主体为 host/trillium.example.com@
的票据。如果是这样,这意味着您的主机不知道 trillium.example.com
所属的领域,因此它向 ATHENA.MIT.EDU
KDC 请求了引荐。下次您连接到 trillium.example.com
时,这条奇怪的记录将用于避免再次请求引荐。
根据您的主机和域的配置,您可能会看到一个带有服务主体 host/trillium.example.com@
的票据。如果出现这种情况,这意味着您的主机不知道 trillium.example.com
属于哪个域,因此它向 ATHENA.MIT.EDU
的 KDC 请求了引荐。下次您连接到 trillium.example.com
时,这个看起来奇怪的条目将被用于避免再次请求引荐。
您可以使用 -f
选项查看适用于您的票据的标志。这些标志包括:
F: 可转发(Forwardable)
f: 已转发(forwarded)
P: 可代理(Proxiable)
p: 代理(proxy)
D: 可预设日期(postDateable)
d: 预设日期(postdated)
R: 可续期(Renewable)
I: 初始(Initial)
i: 无效(invalid)
H: 硬件认证(Hardware authenticated)
A: 预认证(preAuthenticated)
T: 转发策略已检查(Transit policy checked)
O: 可委托(Okay as delegate)
a: 匿名(anonymous)
以下是一个示例列表。在这个例子中,用户 Jennifer 获取了初始票据(I),这些票据是可转发的(F)和预设日期的(d),但尚未验证(i):
shell% klist -f
Ticket cache: /tmp/krb5cc_320
Default principal: jennifer@ATHENA.MIT.EDUValid starting Expires Service principal
31/07/05 19:06:25 31/07/05 19:16:25 krbtgt/ATHENA.MIT.EDU@ATHENA.MIT.EDUFlags: FdiI
shell%
在以下示例中,用户 david 的票据从另一台主机转发(f)到此主机。这些票据是可以再次转发的(F)
shell% klist -f
Ticket cache: /tmp/krb5cc_p11795
Default principal: david@EXAMPLE.COMValid starting Expires Service principal
07/31/05 11:52:29 07/31/05 21:11:23 krbtgt/EXAMPLE.COM@EXAMPLE.COMFlags: Ff
07/31/05 12:03:48 07/31/05 21:11:23 host/trillium.example.com@EXAMPLE.COMFlags: Ff
shell%
使用 kdestroy
销毁票据
您的 Kerberos 票据是证明您确实是您自己的凭证,如果有人获得了存储这些票据的计算机的访问权限,票据可能会被窃取。一旦发生这种情况,拥有这些票据的人可以在票据过期之前冒充您。因此,当您离开计算机时,应该销毁您的 Kerberos 票据。
销毁票据非常简单。只需输入 kdestroy
:
shell% kdestroy
shell%
如果 kdestroy
未能销毁您的票据,它会发出提示音并显示错误消息。例如,如果 kdestroy
找不到任何可销毁的票据,它会显示以下消息:
shell% kdestroy
kdestroy: 在销毁缓存时未找到凭据缓存文件
shell%
.k5identity 文件描述
.k5identity
文件位于用户的家目录中,包含了一组规则,用于根据访问的服务器选择客户端主体。这些规则用于在可能的情况下从缓存集合中选择一个凭证缓存。
空白行和以 #
开头的行将被忽略。每一行的格式如下:
principal_field=value ...
如果服务器主体满足所有字段约束条件,则选择该主体作为客户端主体。以下字段被识别:
- realm
- 如果已知服务器主体的域(realm),则将其与值进行匹配,该值可以使用 shell 通配符。对于基于主机的服务器主体,通常只有在
krb5.conf
中有主机名映射时,域才会被知道。 - service
- 如果服务器主体是基于主机的主体,则将其服务组件与值进行匹配,该值可以使用 shell 通配符。
- host
- 如果服务器主体是基于主机的主体,则将其主机名组件转换为小写,并与值进行匹配,该值可以使用 shell 通配符。
- 如果服务器主体符合
.k5identity
文件中的多个行的约束条件,则使用第一个匹配行的主体。如果没有行匹配,则将通过其他方式选择凭证,例如域启发式或当前主要缓存。
示例
以下示例 .k5identity 文件在服务器主体属于该领域时选择客户端主体 alice@KRBTEST.COM,在服务器主机位于子域内时选择主体 alice/root@EXAMPLE.COM,以及在访问 mail.example.com 上的 IMAP 服务时选择主体 alice/mail@EXAMPLE.COM:
alice@KRBTEST.COM realm=KRBTEST.COM
alice/root@EXAMPLE.COM host=*.servers.example.com
alice/mail@EXAMPLE.COM host=mail.example.com service=imap