Kerberos 基础设施 HOWTO

V. Alex Brennen

2004-05-29

修订历史
修订版 2.0.02004-05-28修订者:VAB
转换为 DocBook XML。 常规内容更新,包括技术和元数据/标记审查的整合。
修订版 1.0.32003-04-01修订者:VAB
小更新,小更正,添加了其他链接。
修订版 1.0.22002-09-13修订者:VAB
小更新,小更正,添加了 8.6,添加了其他链接。
修订版 1.0.12002-07-15修订者:VAB
小更新,修复。
修订版 1.0.02002-06-13修订者:VAB
初始版本。

本文档描述了使用 GNU/Linux 处理身份验证的 Kerberos 基础设施的设计和配置。 它详细介绍了设置服务器、Kerberos 软件、转换旧系统以及回答常见问题的最佳实践方法。


目录
1. 关于本文档
1.1. 一般信息
1.2. 翻译
1.3. 致谢和贡献者
1.4. 反馈
2. Kerberos 基础设施概述
2.1. Kerberos 简介
2.2. Kerberos 的优势
2.3. Kerberos 的工作原理
2.4. Kerberos 基础设施的危害
3. 安装和配置
3.1. 通用机器配置概述
3.2. 硬件
3.3. GNU/Linux 安装
3.4. 选择 Realm
3.5. Kerberos 软件配置
3.6. 主体创建
4. 时间同步
4.1. 时间同步的重要性
4.2. NTP 简介
4.3. NTP 安装和配置
5. Kerberos 服务器复制
5.1. 复制说明
5.2. 实施
5.3. 维护
6. 客户端配置
6.1. 通用 GNU/Linux 客户端配置
6.2. PAM
6.3. Apache Web 服务器
6.4. Microsoft Windows
7. 使用 Kerberos 进行编程
7.1. Kerberos API
A. 更多信息的相关来源
A.1. 相关文档的链接
A.2. 相关网站
A.3. 相关 RFC
A.4. 其他参考
A.5. 其他资源
A.6. 提供专业 Kerberos 咨询的公司
术语表

1. 关于本文档

1.1. 一般信息

版权所有 (c) 2002-2004 V. Alex Brennen (VAB)。

本文档特此置于公共领域。

本文档位于 http://cryptnet.net/fdp/admin/kerby-infra/en/kerby-infra.html


1.2. 翻译

本文档目前仅提供以下语言版本

  • [en] 英语

如果您知道翻译或想将其翻译成另一种语言,请告诉我,以便我可以分发或链接到翻译版本。


1.3. 致谢和贡献者


1.4. 反馈

请将任何补充、评论、更正和批评发送到以下电子邮件地址.


2. Kerberos 基础设施概述

2.1. Kerberos 简介

Kerberos 是 MIT 作为 Athena 项目的一部分开发的身份验证系统。 Kerberos 使用加密技术和可信第三方仲裁者,在开放网络上执行安全身份验证。 具体来说,Kerberos 使用加密票证来避免通过线路传输纯文本密码。 Kerberos 基于 Needham-Schroeder 协议。

目前正在使用两个版本的 Kerberos,版本 4 和版本 5。 Kerberos 版本 1 到 3 是内部开发版本,从未发布。 Kerberos 版本 4 有许多已知的弱点,不应再使用。 本文档仅处理 Kerberos 5。 Kerberos 5 在 RFC1510 中定义。

术语 Kerberos 基础设施是指允许管理员使用 Kerberos 协议在其网络上执行身份验证的软件、服务器和客户端配置。 具体来说,Kerberos 基础设施包括 Kerberos 软件本身、安全冗余身份验证服务器、集中式帐户和密码存储以及配置为通过 Kerberos 协议进行身份验证的系统。 本文档将引导您完成安装、配置和部署此类基础设施的步骤。


2.2. Kerberos 的优势

对于不熟悉 Kerberos 协议的个人来说,在其网络中部署该协议的好处可能并不明显。 但是,所有管理员都熟悉 Kerberos 旨在缓解的问题。 这些问题包括密码嗅探、密码文件名/数据库窃取以及维护大量帐户数据库所需的高度工作量。

正确部署的 Kerberos 基础设施将帮助您解决这些问题。 它将使您的企业更加安全。 使用 Kerberos 可以防止纯文本密码通过网络传输。 Kerberos 系统还将集中您的用户名和密码信息,这将使其更容易维护和管理这些数据。 最后,Kerberos 还可以防止您将密码信息本地存储在机器上,无论是工作站还是服务器,从而降低了单台机器被入侵会导致其他入侵的可能性。

总而言之,在大型企业中,Kerberos 的好处将通过更简单的帐户和密码管理以及改进的网络安全来转化为降低的管理成本。 在较小的环境中,可扩展的身份验证基础设施和改进的网络安全是显而易见的好处。


2.3. Kerberos 的工作原理

Kerberos 是一种身份验证协议,它使用共享密钥和受信任的第三方仲裁者来验证客户端的身份。 在 Kerberos 中,客户端可以是用户、服务器或软件。 受信任的第三方仲裁者是一个称为密钥分发中心 (KDC) 的服务器,它运行 Kerberos 守护程序。 共享密钥是用户密码转换为加密密钥。 对于服务器或软件系统,会生成一个随机密钥。

在 Kerberos 中,用户被称为主体。 KDC 具有主体及其密钥的数据库,用于执行身份验证。 在 Kerberos 中,了解密钥被认为是身份证明的充分条件。 由于了解密钥可以转化为 Kerberos 中的身份证明,因此可以信任 Kerberos 服务器来向任何其他客户端验证任何客户端。 Kerberos 中的身份验证是在不通过线路发送任何明文密码的情况下完成的。 下面我将解释 Kerberos 协议如何映射到 GNU/Linux Kerberos 软件。

KDC 运行两个重要的 Kerberos 守护程序。 这些守护程序是 kadmindkrb5kdc。 虽然 GNU/Linux 守护程序命名约定表明名称以 "k" 开头的进程与内核相关或内核空间进程,但在 krb5kdckadmind 的情况下并非如此。 这两个守护程序在用户空间中以 root 身份运行。

kadmind 是 Kerberos 服务器的管理守护程序。 kadmind 由名为 kadmin 的程序用于维护主体和策略配置的数据库。 如果您选择通过 ssh 禁止任何远程登录到您的 Kerberos 硬件上,kadmin 将允许您远程管理服务器的 Kerberos 组件。

krb5kdc 是 Kerberos 服务器的核心。 它负责在 Kerberos 身份验证中执行受信任的第三方仲裁者的角色。 当用户想要向系统或服务进行身份验证时,该用户会从 KDC 请求票证。 票证是由客户端身份、会话密钥、时间戳和一些其他信息组成的数据报。 数据报使用服务器的密钥进行加密。

详细地说,该过程的工作方式如下:首先,身份验证请求被发送到 krb5kdc 守护程序。 当守护程序收到此请求时,它会在主体数据库中查找尝试进行身份验证的客户端(主体)。 它从此数据库中读取客户端的密钥,并加密一个名为票证授予票证 (TGT) 的特殊票证,然后将其发送回客户端。 客户端收到此加密的 TGT,其中包含会话密钥。 如果客户端知道密码(存储在主体数据库中的密钥)并且可以成功解密 TGT,则它可以将使用包含的会话密钥加密的票证呈现给票证授予服务 (TGS)。 然后,TGS 将颁发一个后续票证,该票证将为客户端提供使用特定系统或服务所需的身份验证。

通过使用只有在客户端知道密钥的情况下才能解密的加密票证,可以进行安全身份验证。 时间戳信息包含在票证中以防止重放攻击。 重放攻击将是欺诈性地表示先前发行的票证以获得未经授权的访问权限。


2.4. Kerberos 基础设施的危害

攻击者试图入侵 Kerberos 基础设施的主要方式是攻击 Kerberos 服务器。如果攻击者能够获得 KDC 的 root 权限,他们将可以访问包含主体加密密码的数据库。攻击者还可以访问 Kerberos 软件和配置文件,并修改它们,使系统执行本不应成功的身份验证。

攻击 Kerberos 基础设施的其他方法包括重放攻击和密码猜测攻击。重放攻击涉及拦截或以其他方式获取 Kerberos 票据,然后欺诈性地使用该票据来尝试获得身份验证。密码猜测在 Kerberos 系统中可以通过从网络拦截 Kerberos 票据,然后对拦截到的票据进行暴力破解来解密。

攻击者可能会利用基础设施中过时的软件。例如,Kerberos 版本 4 存在许多问题。最重要的是,Kerberos 版本 4 在使用的加密算法中存在基本的协议缺陷。 Kerberos 4 的设计包括使用标准模式的 DES,这允许攻击者以无法检测的方式拦截和修改 Kerberos 票据的密文。为了防止这些攻击,Kerberos 5 已经修改为使用 Cipher Block Chaining (CBC) 模式下的三重 DES。

在讨论 Kerberos 4 的强度时,同样重要的是要注意,Kerberos 版本 4 的许多实现都存在缓冲区溢出漏洞。 虽然版本 5 的参考实现修复了版本 4 中的缓冲区溢出缺陷,但 Kerberos 5 的发行版通常会附带软件来提供向后兼容性,以支持旧的 Kerberos 4 应用程序。据信,Kerberos 版本 5 中用于支持版本 4 的一些向后兼容性代码仍然容易受到缓冲区溢出攻击。

因此,由于版本 4 中的协议缺陷以及版本 4 实现和版本 4 向后兼容性代码存在缓冲区溢出攻击的可能性,最好不要支持或使用 Kerberos 版本 4。

总而言之,从对如何入侵 Kerberos 基础设施的描述中,我们意识到必须高度重视 Kerberos 服务器本身的安全性,运行最新的 Kerberos 软件,并在选择好的密码和设置好的密码策略方面保持警惕。


3. 安装和配置

3.1. 常规机器配置概述

本文档的本节描述了将用作 KDC 的机器和软件的安装和配置。 你可能希望对建议的配置进行一些调整,但是这里介绍了一些关键点,在配置 KDC 时记住这些关键点非常重要。 因此,如果您确实决定采用另一种配置策略,请确保您理解此处介绍的材料。

这些机器将运行 Kerberos 守护程序并存储密码和策略数据。 因此,这些服务器保持安全对于网络的安全性非常重要。 我们应该采取一切可能的措施来防止这些服务器受到攻击。 特别注意本节中给出的安全建议。

该安全建议的关键点是,您应该将硬件专门用于提供 Kerberos KDC 服务。 您应该物理地保护该硬件,并且应该尽可能地在该硬件上加强 GNU/Linux。 如果 KDC 受到攻击,您的整个 Kerberos 基础设施都会受到攻击。


3.2. 硬件

Kerberos 服务对硬件的需求不大,并且 Kerberos 服务具有冗余功能,因此服务器硬件可以最小化。 对于我部署的 Kerberos 服务器,我使用了带有两个硬件 RAID 1 驱动器的单处理器 PIII 机器。 这些机器旨在处理每天四万到十万次身份验证。 虽然可以部署带有冗余 NIC 卡的服务器,但应避免同时激活两张卡。 Kerberos 在票据中包含 KDC 的 IP,因此,如果在身份验证会话期间客户端通过多个接口连接到 KDC,则可能会发生身份验证困难。

重要的是要注意,Kerberos 服务应该在专用硬件上运行。 将机器专用于 Kerberos 意味着只有 Kerberos 管理员才需要登录到这些机器上。 这也意味着除了 SSH 之外,不会在机器上运行任何其他服务。 由于所有用户的密码都存储在 Kerberos 服务器上,因此最好尽可能限制对硬件的访问。 除了将服务器专用于 Kerberos 之外,还应尽可能物理地保护服务器。 对于 Kerberos 服务器,这可能包括将服务器锁定在机柜中并连接专用终端。

为了利用 Kerberos 内置的冗余功能,您必须至少有两台机器作为 KDC 运行。 Kerberos 设计为部署一个主主服务器和一个或多个辅助从服务器。 您可以根据需要拥有任意数量的辅助服务器。


3.3. GNU/Linux 安装

我们要在其上安装 GNU/Linux 的服务器将专用于执行 Kerberos 服务任务,因此我们可以采取一些额外的步骤来保护它们。

首先,我们只会安装 Kerberos 服务绝对必需的软件。 这包括基本操作系统和 Kerberos 软件包。 我们不应该安装 X 或任何 GUI 应用程序。 SSH 是可选的。 如果您希望能够远程管理服务器,可以安装 SSH。 但是,如果您只通过连接的终端向它们提供登录访问权限,则服务器会更安全。

在基于 Fedora Core 的 GNU/Linux 中,提供 Kerberos 服务所需的软件包是

krb5-server
krb5-libs

不应在 KDC 上安装文档和开发库,因为我们不想将这台机器用于执行 KDC 服务以外的任何用途。

下一步将是确保没有打开不需要的端口,并且应用任何需要的必要安全补丁。 确定需要应用哪些安全补丁的方法取决于安装的软件包管理软件。 要确定机器当前正在侦听哪些端口,可以使用 netstat 命令。 例如,在仅运行 ssh 的机器上,我们应该看到以下内容

bash$ netstat -an | grep -i listen | less
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

最后,我们将配置服务器以仅限制对需要与它进行身份验证的服务器的访问。 这应该通过编辑/etc/hosts.allow/etc/hosts.deny以及使用iptables.


3.4. 选择 Realm

Realm 名称区分大小写,并且在您的网络上必须是唯一的。 最佳实践标准是使用您所有大写的二级域名作为您的 realm 名称。 如果您仅为子网而不是整个网络设置 Kerberos,则应使用子网的尾部域名。

在确定您的 realm 拓扑时,您应该考虑组织的整体结构。 如果您的组织有一个或多个远程办公室或独立的子组,最好将它们包含在单独的 realm 下。 Kerberos realm 拓扑应反映系统管理拓扑,而不是物理网络拓扑。

最后,还应考虑旧系统。 例如,旧的 Kerberos 部署或您希望保留的现有网络拓扑分组(即 Windows NT 域)。

如果您在已经部署了 Kerberos 的网络或子网上安装 Kerberos,则必须避免 realm 名称冲突。 在包含 IBM SP 集群的网络上工作时,最常发生的情况是在具有预先存在的 Kerberos 安装的网络上部署 Kerberos。 最佳解决方案是在第三或更高域名级别专门为 SP 集群创建一个 realm,然后将二级域名用于您的主 Kerberos realm。

在本文档中,我们将使用一个示例来帮助说明基础设施的设计和配置。 对于我们的示例,我们将使用一所神话般的大学,该大学成立的目的是教育人们并进行自由内容领域的研究 - 爱尔兰都柏林的 Gnu 大学。 都柏林 Gnu 大学示例将包括两个用于验证学生和教职员工身份的 Kerberos 服务器。 该大学的 TLD 是 gnud.ie,因此我们将使用 Kerberos realm GNUD.IE。


3.5. Kerberos 软件配置

现在,您需要配置 Kerberos,创建管理员,确定策略,并初始化 Kerberos 主体数据库。

第一步是编辑/etc/krb5.conf配置文件。 在此文件中,您需要设置您的 realm,通过指定 Kerberos 服务器来扩展 realm 定义,最后设置域 realm。 对于我们的示例,这样做如下

default_realm = GNUD.IE

[realms]
 GNUD.IE = {
  kdc = kerberos1.gnud.ie:88
  kdc = kerberos2.gnud.ie:88
  admin_server = kerberos1.gnud.ie:749
  default_domain = gnud.ie
 }

[domain_realm]
 .gnud.ie = GNUD.IE
 gnud.ie = GNUD.IE

要初始化和创建 Kerberos 数据库,您必须运行以下命令

{Kerberos1}bash# /usr/Kerberos/sbin/kdb5_util create -s

-s 标志告诉 KDC 创建一个隐藏文件来对自己进行身份验证。 您还可以使用 -r 标志来指定 realm。 仅当您的krb5.conf文件中定义了多个 realm 时,才需要为新数据库指定 realm。

Kerberos 将要求您设置 Kerberos 数据库的主密码。 请记住,忘记此密码非常重要。 如果您不记得主密码,将无法管理服务器。

接下来,在 KDC 上,您必须编辑 acl 文件以授予管理访问权限。 通常,此文件位于/var/Kerberos/krb5kdc/kadm5.acl。 如果需要,请在您的kdc.conf文件中指定 acl 文件位置。 您的kdc.conf文件的位置在您的/etc/krb5.conf文件中指定,默认为/var/Kerberos/krb5kdc/kdc.conf。 对于我们的都柏林 Gnu 大学示例,我们将修改 acl 文件以包含以下内容

*/admin@GNUD.IE     *

这些 acl 内容的含义是,任何以 GNUD.IE realm 中的 /admin 结尾的帐户都将被授予完全访问权限。

现在我们已经设置了管理用户的访问权限,我们需要创建该管理用户。 你可以使用KDC上root shell中的 kadmin.local 命令,以及 addprinc 子命令来完成此操作。 标准做法是将管理帐户命名为admin。 对于都柏林格努大学的Kerberos管理员,以下命令可以实现此目的:

{Kerberos1}bash# /usr/Kerberos/sbin/kadmin.local -q "addprinc admin/admin"

服务器上必须运行的守护程序是 krb5kdckadmin。 如果必要,也可以运行 krb524,以便为Kerberos 4客户端提供向后兼容性。 但是,在启动 krb524 之前,请记住我们关于Kerberos V4的安全警告,并确保您确实需要提供该功能。 在KDC上,应配置 krb5kdckadmin 以自动启动,方法是使用 chkconfig 命令启用它们。

{Kerberos1}bash# /sbin/chkconfig krb5kdc on
{Kerberos1}bash# /sbin/chkconfig kadmin on

最后,我们可以使用以下命令手动启动它们:

{Kerberos1}bash# /etc/rc.d/init.d/krb5kdc start
{Kerberos1}bash# /etc/rc.d/init.d/kadmin start

我们现在有了一个可以工作的KDC。


3.6. Principal 创建

您可以使用以下命令在Kerberos中创建第一个用户 principal:

{Kerberos1}bash# kadmin.local
{Kerberos1}kadmin.local: addprinc <username>

如果您有大量需要使用Kerberos支持的帐户,则可以编写脚本来批量创建 principals。


4. 时间同步

4.1. 时间同步的重要性

由于Kerberos身份验证的安全性部分基于票证的时间戳,因此在Kerberos服务器上准确设置时钟至关重要。 正如我们在Kerberos简介中提到的那样,票证的较短生命周期用于防止攻击者执行成功的暴力破解攻击或重放攻击。

如果您允许服务器的时钟漂移,您将使您的网络容易受到此类攻击。 由于时钟同步在Kerberos协议的安全性中非常重要,因此如果时钟未在合理的窗口内同步,Kerberos将报告致命错误并拒绝运行。 由于与KDC时钟的时间差异,从时钟不准确的计算机尝试身份验证的客户端在身份验证尝试中将被KDC拒绝。


4.2. NTP 简介

网络时间协议 (NTP) 可用于服务器的时间同步。 许多公共 NTP 服务器可用于同步。 NTP 能够在 LAN 上将客户端时钟同步到毫秒级,在 WAN 上同步到几十毫秒。 NTP 服务器按层划分。 主 NTP 服务器被分类为第 1 层。 由于数量相对较少,这些公共主服务器不应用于客户端计算机的同步。 公共第 2 层服务器可用于客户端计算机同步,并使用公共第 1 层服务器同步自己的时钟。 对于我们的 Kerberos 服务器,我们将设置 NTP 以针对三个第 2 层服务器进行查询。 维护的公共第 2 层服务器列表可以在此处找到


4.3. NTP 安装和配置

要在 GNU/Linux 上启用 NTP,您必须安装 NTP 软件包并编辑配置文件名。 默认情况下,NTP 配置文件名是/etc/ntp.conf。 配置文件中的默认值是可以接受的。 需要做的就是添加我们希望用于同步时钟的服务器。 身份验证不是必需的,但可以启用身份验证以提高安全性。 如果您在 LAN 上使用 NTP 服务器,您可能希望使用身份验证。 这是一个示例ntp.conf来自都柏林格努大学的文件名。

最后,我们放置一个 cron 作业来执行实际同步

30 * * * * /usr/sbin/ntpdate -s

如果我们的系统位于防火墙后面,我们可能需要提供使用-su而不是仅使用-s-u 参数将指示 ntpdate 对其与第 2 层时间服务器的传出连接使用非特权端口。


5. Kerberos 服务器复制

5.1. 复制描述

Kerberos 旨在允许主/从复制集群。 虽然 Kerberos 集群可以包含任意数量的主机,但建议您至少有两个。 一个充当主服务器的主服务器,以及至少一个可用作主服务器备份的从服务器。 主服务器和从服务器可以分别被认为是主服务器和辅助服务器。

Kerberos 将所有信息(包括帐户和策略数据)存储在应用程序数据库中。 Kerberos 软件发行版包括用于将此数据复制或复制到其他服务器的软件。

Kerberos 客户端应用程序旨在在主服务器发生故障时尝试针对辅助服务器进行身份验证。 因此,在系统发生故障时,您无需执行任何额外的工作即可将 Kerberos 身份验证服务故障转移到备份服务器。 但是,Kerberos 的管理功能不提供自动故障转移。

如果您的主服务器发生故障,kadmind 将不可用。 因此,管理功能将不可用,直到主服务器恢复或更换。 具体来说,在主服务器发生故障期间,无法进行 principal 管理、密钥创建和密钥更改。


5.2. 实施

服务器复制由 kprop 命令处理。 kprop 必须在主 KDC 上运行。 它应在计划的 cron 作业中运行,以使所有服务器上的 principal 数据库保持同步。

设置复制的第一步是为 kpropd 设置 ACL。 默认情况下,kpropd acl 文件名位于/var/Kerberos/krb5kdc/kpropd.acl。 在我们的示例中,它将具有以下内容:

host/kerberos1.gnud.ie@GNUD.IE
host/kerberos2.gnud.ie@GNUD.IE

kpropd.acl文件应仅存在于从 Kerberos 服务器上。 在 Fedora 派生的 GNU/Linux 中,kadmin 不会在 Kerberos 服务器上运行,其中/var/Kerberos/krb5kdc/kpropd.acl存在。

接下来,您需要为您的主服务器和从 Kerberos 服务器创建主机密钥

{Kerberos1}bash# kadmin.local
{Kerberos1}kadmin.local:  addprinc -randkey host/kerberos1.gnud.ie
{Kerberos1}kadmin.local:  addprinc -randkey host/kerberos2.gnud.ie

下一步是将这些密钥提取到密钥表文件中。 密钥表文件是一个密钥环,其中包含使用 KDC 进行身份验证所需的加密密钥。 使用 ktadd 子命令完成将密钥提取到密钥表的操作

{Kerberos1}kadmin.local:  ktadd host/kerberos1.gnud.ie
{Kerberos1}kadmin.local:  ktadd host/kerberos2.gnud.ie

最后,我们希望将密钥表复制到从服务器,以便它具有可用于身份验证所需的密钥。

{Kerberos2}bash# scp root@kerberos1.gnud.ie:/etc/krb5.keytab /etc

这是来自主 Kerberos 服务器的 crontab 条目,用于每 15 分钟同步一次 principal 数据库

15 * * * * /usr/local/bin/krb5prop.sh

以下是krb5prop.sh脚本的内容

#!/bin/sh

/usr/Kerberos/sbin/kdb5_util dump /var/Kerberos/krb5kdc/slave_datatrans

/usr/Kerberos/sbin/kprop -f /var/Kerberos/krb5kdc/slave_datatrans kerberos2.gnud.ie > /dev/null

最初手动运行此命令时,您应该看到类似于以下内容:

{Kerberos1}bash# /usr/Kerberos/sbin/kdb5_util dump /var/Kerberos/krb5kdc/slave_datatrans
{Kerberos1}bash# /usr/Kerberos/sbin/kprop -d -f /var/Kerberos/krb5kdc/slave_datatrans kerberos2.gnud.ie
3234 bytes sent.
Database propagation to kerberos2.gnud.ie: SUCCEEDED
{Kerberos1}bash#

从服务器现在将其 principal 数据库与主服务器同步。


5.3. 维护

有了这些 cron 作业,principal 传播应该足够自动化,无需维护。 在主 KDC 发生故障时,除非故障持续较长时间,否则无需人工干预。


6. 客户端配置

6.1. 常规 GNU/Linux 客户端配置

Kerberos 的 GNU/Linux 发行版包括一个客户端软件包,其中包含设置 GNU/Linux 机器以能够针对 KDC 执行 Kerberos 身份验证所需的所有软件和配置文件。 在 Fedora 派生的 GNU/Linux 中,此软件包是 krb5-workstation。 为了使您的系统能够进行 Kerberos 身份验证(包括通过 Kerberized 应用程序进行身份验证),您必须在系统上配置 Kerberos。

配置涉及编辑/etc/krb5.conf文件。 在此文件中,您必须指定您的域、KDC、管理服务器、日志记录、默认域和 KDC 信息。 您还必须修改kdc.conf文件,您可以在krb5.conf文件中指定一个位置。 默认位置是/var/Kerberos/krb5kdc/kdc.conf。 该kdc.conf文件包含有关域的加密算法策略的信息。

您希望在其上执行 Kerberos 身份验证的系统的配置信息与放置在/etc/krb5.confKDC 上的文件名中的信息相同。 这是来自都柏林格努大学示例的客户端的示例krb5.confkdc.conf配置文件。

现在,您可以使用 kinit 命令测试 Kerberos 身份验证

bash$ kinit <username>

如果您的身份验证失败,查找原因的最佳位置是客户端上的系统日志文件和执行身份验证的 KDC 上的 KDC 日志文件。 在排除身份验证问题时,打开一个终端窗口到 KDC 并在 KDC 日志上运行 tail -f 可能会非常有帮助。 在我们的示例中krb5.conf,KDC 日志的位置是/var/log/Kerberos/krb5kdc.log.


6.2. PAM

PAM 或可插入身份验证模块,是一种与 GNU/Linux 的许多发行版一起提供的技术,能够通过 pam_krb5 模块与 Kerberos 集成。 为了将 Kerberos 身份验证与 PAM 一起使用,您必须安装 pam_krb5 模块并修改 pam 配置文件。

pam_krb5 模块附带示例配置文件名,这些文件名位于/usr/share/doc/pam_krb5-1.55/pam.d。 这些配置文件所做的基本更改是允许 PAM 控制的服务针对 Kerberos 进行身份验证,类似于以下内容

auth       required     /lib/security/pam_krb5.so use_first_pass


6.3. Apache Web 服务器

Kerberos 可以用作 Apache Web 服务器的身份验证机制。mod_auth_kerb 应用程序是一个 apache 模块,提供该功能。 使用该模块,您可以在httpd.conf文件中将 Kerberos 设置为访问控制节的身份验证类型。 请注意,虽然正在使用 Kerberos,但这不是理想的身份验证机制,因为票证存储在 Web 服务器上,而不是在客户端计算机上。 但是,如果您的目标是实施单一登录解决方案或合并帐户,那么这里就有价值。 mod_auth_kerb 能够支持 Kerberos 4,但本操作指南中未涵盖该协议,因为该协议第 4 版存在已知缺陷。

mod_auth_kerb 网站可以在 http://modauthkerb.sourceforge.net/ 找到。 访问使用 mod_auth_kerb 的站点时,务必使用 HTTPS 协议,因为 mod_auth_kerb 使用基本身份验证机制。 基本身份验证使用 base64 编码,可以很容易地转换回纯文本。 因此,重要的是对身份验证交换进行 SSL 加密,以确保在将用户名和密码传输到 Web 服务器时受到保护。

要使用 mod_auth_krb 模块编译 apache,您必须执行以下步骤

bash$ export 'LIBS=-L/usr/Kerberos/lib -lkrb5 -lcrypto -lcom_err'
bash$ export 'CFLAGS=-DKRB5 -DKRB_DEF_REALM=\\\"GNUD.IE\\\"'
bash$ export 'INCLUDES=-I/usr/Kerberos/include'
bash$ mkdir apache_x.x.x/src/modules/kerberos
bash$ cp mod_auth_kerb-x.x.x.c apache_x.x.x/src/modules/kerberos
bash$ ./configure --prefix=/home/httpd --add-module=src/modules/Kerberos/mod_auth_kerb.c
bash$ make
bash$ make install

您应该测试 apache 以确保它有效。 一旦您在机器上拥有 SSL 启用的 apache 的已知工作副本,您就可以修改httpd.conf文件名以提供目录的 Kerberos 身份验证

这是来自 mod_auth_kerb apache 模块的示例节,它为目录启用 Kerberos 5 身份验证

<Directory "/home/httpd/htdocs/content">
   AllowOverride None
   AuthType KerberosV5
   AuthName "Kerberos Login"
   KrbAuthRealm GNUD.IE
   require valid-user
</Directory>


6.4. Microsoft Windows

由于 Microsoft 对 Kerberos 标准的实施存在缺陷,因此标准 MIT Kerberos 与 Microsoft 版本之间的兼容性有限。 Microsoft 发布了一份文档,其中描述了 Microsoft 损坏版本的 Kerberos 能够与标准 Kerberos 互操作的有限方式。 该文档可在此处获得


7. 使用 Kerberos 编程

7.1. Kerberos API

Kerberos开发库将允许您启用Kerberos功能,或者对任何应用程序进行Kerberos化。 有两个主要的库:一个用于基本身份验证的通用Kerberos库和一个用于执行管理功能(如主体操作)的Kerberos管理库。 在Fedora衍生的GNU/Linux中,rpmkrb5-devel包含开发库和文档。 这些库的API规范可以在大多数Kerberos发行版中包含的Kerberos文档中找到。 在Fedora衍生的GNU/Linux中,它安装在/usr/share/doc/krb5-devel-1.2.2/api

该文档是LaTeX格式。 为了查看它,您必须从中生成dvi文件名,然后可以使用xdiv查看这些文件名。 这可以通过以下命令完成

bash$ cd /usr/share/doc/krb5-devel-x.x.x/api/
bash$ su
bash# make
bash# (^d)
bash$ xdvi library.dvi


A. 更多信息的有用资源


A.2. 相关网站


A.4. 其他参考


A.6. 提供专业 Kerberos 咨询的公司

术语表

ASN.1

抽象语法表示法一。 ASN.1 是一种用于描述消息的符号。 它将它们描述为组件的序列。 描述的组件也可能是序列。 ASN.1 用于描述 Kerberos 数据报的内部结构。 除非您是软件开发人员,否则您无需了解 ASN.1。

验证器

包含信息的记录,这些信息可以证明是最近使用只有客户端和服务器知道的会话密钥生成的。(定义取自 RFC1510

凭证

服务器的票据和一个用于验证主体的会话密钥。

跨域身份验证

Kerberos 允许一个域中的 KDC 验证另一个域中的主体,如果在两个域的 KDC 之间共享一个密钥。 此域间身份验证称为跨域身份验证。

数据加密标准 [DES]

一种用于加密的算法,它是美国政府的官方算法。 它由 IBM 在 NSA 的协助下开发。 该算法是一种十六轮分组密码,使用 64 位块和 56 位密钥。

可转发票据

KDC 授予的票据,允许用户请求具有不同 IP 地址的其他票据。 实际上,TGT 允许经过身份验证的主体请求在其他附加机器上有效的票据。

通用安全服务应用程序编程接口 [GSS-API]

一组 C 语言绑定,为其调用者提供安全服务。 该 API 可以在各种加密系统之上实现。 Kerberos 就是这样一个系统的示例。

密钥分发中心 [KDC]

在 Kerberos 协议中执行可信仲裁者角色的机器和软件。

Kerberos

一种身份验证协议,其中依赖受信任的第三方(仲裁者)来执行 TCP/IP 网络上客户端的身份验证。 该协议的设计方式是,加密的票证通过网络传输,而不是传统的纯文本密码,从而提供安全的网络身份验证。

Kerberos 化

(动词) 修改系统、服务或软件以使用 Kerberos 协议执行身份验证的行为。 (形容词 kerberized) 一种通过 Kerberos 支持身份验证的系统、服务或软件。

网络时间协议 [NTP]

一种用于同步 Internet 上主机和路由器的时钟的协议。

可延期票据

在 Kerberos 5 中,一种最初无效,但在将来某个时间点变为有效的票据。 普通 Kerberos 票据仅从请求时起有效,直到它们过期为止。

预身份验证

在 KDC 向主体授予 TGT 之前发生的附加身份验证。 此类身份验证的一个示例可能是满足生物识别系统。

主体

在 KDC 数据库中存储了密钥的用户或服务器。

可代理票据

在 Kerberos 5 中,允许您请求替代 IP 地址的 TGT 的票据。

Kerberos 部署的范围。 具体来说,KDC 受信任以验证主体的组织域。

可更新票据

在 Kerberos 5 中,一种允许主体除了标准票据生存期之外的最大可更新生存期的票据。 只要票据有效,可更新票据可用于从 KDC 获取其他票据。 请求续订票据可以一直到原始可更新票据的最大可更新生存期。

盐值

一种种子值,用于加密纯文本密码,以扩展给定纯文本产生的可能密文的数量。 盐值的使用是一种防御措施,用于保护加密的密码免受字典攻击。

秘密文件

秘密密钥的磁盘存储。

票据

一种数据消息,由客户端的身份、会话密钥、时间戳和其他信息组成,所有这些信息都使用服务器的密钥加密。 它用于执行身份验证。

票据授予服务 [TGS]

一种有能力且被授权在客户端获得票据授予票据 (TGT) 后向其颁发票据的服务。

票据授予票据 [TGT]

一种包含用于客户端和 KDC 之间通信的会话密钥的票据。

传递跨域身份验证

在 Kerberos 5 中,在域之间建立信任链的能力,实际上构建了一条信任路径,以便域 X 中希望验证域 Z 中的主体的用户不需要域 X 的 KDC 与域 Z 共享密钥,如果域 X 和域 Z 都与域 Y 共享密钥。域 Y 可以用作信任路径中的“跳”。

三重 DES

DES 的一个变体,其中数据使用两个不同的密钥通过标准 DES 加密三次。