我读过 Kerberos 用于对希望访问企业网络中各种服务器上的服务的用户进行身份验证,但我仍然不明白 Kerberos 的用途。为什么系统管理员不只是为每个服务器上的每个用户创建一个用户帐户,以便用户可以使用他们的用户名和密码访问他们希望访问的任何资源?为什么需要如此复杂的身份验证协议?
当我可以使用用户名和密码访问服务时,为什么还需要 Kerberos?
为什么系统管理员不只是为每个服务器上的每个用户创建一个用户帐户,以便用户可以使用他们的用户名和密码访问他们希望访问的任何资源?
假设您有 50 个用户和 50 个服务器。为简单起见,假设所有 50 个用户都可以访问所有 50 台服务器,他们在所有服务器上都拥有相同的权限,我们永远不必更改这些权限。总共需要创建 2,500 个密码条目。
添加新用户
添加新用户时,管理员必须访问所有 50 台服务器并将该用户添加到所有服务器。这需要管理员在所有 50 台服务器上运行 create user 命令。该位可以自动化,但不能安全自动化的部分是用户需要输入密码 50 次,每台服务器一次。
为什么会出现后一个问题? 因为密码认证系统被设计成不保留密码副本,甚至不保留加密副本。因此,当用户在服务器 #1 上输入新密码时,该服务器会立即忘记密码,因此他们必须再次为服务器 #2 和 #3 输入密码,等等。
添加新服务器
也许现在您正在考虑可以编写一个脚本:
- 在服务器 X 上运行;
- 要求新用户输入新密码;
- 要求管理员输入密码;
- 登录到服务器 #1 到 #50,并使用相同的密码在每个服务器上创建用户帐户。
这有点狡猾,但即使你去做,你仍然会遇到另一个更大的问题。假设您的公司购买了一台新服务器,我们现在需要 50 个用户来访问该服务器。好吧,由于没有一个服务器包含用户密码的副本,因此管理员必须找到每个用户并让他们在新服务器中输入其帐户的密码。除非您保留用户密码的副本,否则无法解决这个问题——这又是一种不安全的做法。
集中式密码数据库
要解决这些问题,您确实需要将您的用户/密码数据库集中在一个地方,并让所有服务器查询该数据库以验证用户名和密码。这实际上是可管理的多用户/多服务器环境所需的最低要求。现在:
- 当您添加一个新用户时,所有服务器都会自动从中央数据库中获取它。
- 添加新服务器时,它会自动从中央数据库中获取所有用户。
有多种机制可以做到这一点,尽管它们仍然缺乏 Kerberos 提供的功能。
Kerberos
一旦你有了这样一个集中的数据库,就可以用更多的特性来增强它,这既是为了便于管理,也是为了方便。Kerberos 增加了当用户成功登录到一个服务时,该服务“记住”该事实并能够向其他服务“证明”该用户成功登录的能力。因此,提供此类证明的其他服务将允许用户进入,而无需询问他们的密码。
这提供了便利和安全的结合:
- 当用户当天已经成功输入一次密码时,他们不会一遍又一遍地被要求输入密码。
- 当您的程序员编写访问多个服务器的程序并且这些服务器需要身份验证时,这些程序现在可以通过重用它们运行的服务器帐户的凭据来向这些服务器进行身份验证而无需提供密码。
后者很重要,因为它最大限度地减少或扼杀了不安全但非常常见的做法:要求您将用户名和密码副本放入配置文件的自动化程序。同样,安全密码管理的一个关键思想是不存储密码副本,甚至不存储加密副本。
简而言之,这将是一场行政噩梦。
Kerberos 允许管理员让任意数量的员工使用相同的凭据登录其域中的资源。
假设这在简单的网络中不存在。
- 用户输入密码以解锁他们的计算机。
- 用户想要映射网络驱动器。他们现在必须重新输入密码
- 然后用户想要收到电子邮件。他们打开 Outlook,然后需要输入另一个密码。
- 然后,用户需要登录公司内部网。那是另一个密码。
你明白了。不使用 Kerberos 意味着用户需要维护所有托管他们需要访问的服务的服务器的密码。这对于用户和管理员来说都是一件令人头疼的事情。大多数公司政策规定用户需要每 X 天更改一次密码。您能想象作为最终用户并且每次需要更改 5 台服务器上的密码时都需要更改密码吗?
从安全角度来看,管理员可以在一个地方获得所有登录尝试(成功和失败),而不是登录 5 个不同的服务器。这有助于解决登录问题(即锁定)并使审核日志更加容易。
Kerberos 不是为了方便,它是一种增强的安全措施。方便是次要的好处。
一个很好的解释是Designing an Authentication System: A Dialog in Four Scenes
基本上,您获得的不仅仅是传递一个魔法令牌(即您的密码),而是一个“票”,它由可信的事实来源(即 Kerberos KDC、Microsoft AD 等)签名。您的票会告诉服务您是谁以及您属于哪些权利组。可以把它想象成买一张游乐园的门票,而不是每次在公园里给服务员钱。
防止横向升级。
通过使用集中式密码数据库(例如 LDAP)可以降低密码管理的管理复杂性。但是,这样做会产生横向升级的风险。如果攻击者控制了一台服务器,他们可以保持静默状态,嗅探密码。然后可以使用这些密码来危害其他服务器 - 横向升级。
Kerberos 试图解决这个问题:用户不会将他们的密码发送到每个服务器;他们只将其发送到身份验证服务器,并向其他服务器出示票证。最近,已经发现了一些被 mimikatz 等工具利用的缺陷。但是,至少 Kerberos 旨在防止横向升级;LDAP 没有阻止它。