Paranoid Penguin - 单点登录和企业目录,第二部分

作者:Ti Leggett

欢迎回来!上个月,我们快速完成了单点登录和企业目录基础设施的启动和运行。在本文中,我们将配置一些 Linux 客户端和 Mac OS X 客户端,以充分利用上个月的辛勤工作。这次我们没有那么多部分需要研究,但我们仍然有很多内容要涵盖,所以让我们开始吧!同样,所有配置文件都可以在在线资源中找到。

在本文中,我们将探讨如何连接 Gentoo Linux 和 Red Hat Enterprise Linux (RHEL) v3 和 v4,但大多数 Linux 客户端的配置应该大致相同,只有细微的差别。我们还将介绍 Mac OS X v10.4 (又名 Tiger) 客户端集成。在后续文章中,我们将解释如何配置 Microsoft Windows 客户端以使用身份验证和授权系统,因为它依赖于配置和设置 Samba 软件包。

对于单点登录,Linux 和 Tiger 客户端需要 Kerberos 主机 keytab。我们以创建其他 keytab 相同的方式创建一个。对于 Linux 和 Tiger 客户端,此 keytab 都保存在 /etc/krb5.keytab 中。

Linux 客户端配置

并非所有用户,尤其是远程笔记本电脑用户,都希望或能够将其机器完全整合到 Kerberos 领域中。除非您完全控制用户将从中连接的所有机器,否则您需要允许传统的密码身份验证。虽然这通过必须通过网络传输密码而破坏了使用 Kerberos 的某些安全性,但只要您作为系统管理员意识到这一点并采取预防措施来限制其使用,您就不会比不选择使用 Kerberos 的情况更糟。与 /etc/passwd、NIS 或 LDAP 密码存储等机制相比,Kerberos 仍然具有一些优势。使用 Kerberos 比使用其他机制更容易实施密码规则,并且密码在 Kerberos 数据库中的存储更安全。请务必查看 Alf Wachsmann 的“使用 Kerberos 5 进行集中身份验证,第一部分”(请参阅资源),了解如何启用 Kerberos PAM 身份验证。

在 Craig Swanson 和 Matt Lung 的“OpenLDAP Everywhere”(请参阅资源)中,作者提到了 /etc/nsswitch.conf /etc/ldap.conf 和 /etc/openldap/ldap.conf。我们将调整这些文件,以提高速度和安全性。首先,让我们看一下 /etc/openldap/ldap.conf。此文件定义了 OpenLDAP 命令行工具(如 ldapadd 和 ldapsearch)的默认值。我们的 /etc/openldap/ldap.conf 文件如列表 1 所示。

列表 1. /etc/openldap/ldap.conf

BASE "o=ci,dc=example,dc=com"
URI ldaps://ldap.example.com ldaps://kdc.example.com
TLS_CACERTDIR /etc/ssl/certs
TLS_REQCERT allow

有关更多选项和更多信息,请参阅 ldap.conf(5)。由于无法在 /etc/openldap/ldap.conf 中指定我们想要使用 StartTLS,因此我们必须显式使用 ldaps:// URL。现在我们可以简单地发出ldapsearch,它默认使用 SASL 身份验证,然后引用 /etc/openldap/ldap.conf 获取默认主机和基础。

现在让我们开始正确配置名称服务交换 (NSS)。确保安装了 nss_ldap 软件包。此外,请注意,此软件包的旧版本无法处理某些服务(如 netgroups)的 LDAP 存储,因此请尽量获取您可以获得的最新版本。首先通过编辑 /etc/ldap.conf 来配置 nss_ldap 软件包本身。此文件与 /etc/openldap/ldap.conf 不同,后者仅用于 OpenLDAP 工具,而 /etc/ldap.conf 是 nss_ldap 的配置文件。列表 2 显示了 /etc/ldap.conf 应有的样子。

列表 2. /etc/ldap.conf

host ldap.example.com kdc.example.com
base o=ci,dc=example,dc=com

ssl start_tls
tls_checkpeer no
tls_cacertfile /etc/ssl/certs/ci-cert.pem

nss_base_passwd ou=people,o=ci,dc=example,dc=com
nss_base_group ou=group,o=ci,dc=example,dc=com
nss_base_hosts ou=hosts,o=ci,dc=example,dc=com
nss_base_services ou=services,o=ci,dc=example,dc=com
nss_base_netgroup ou=netgroups,o=ci,dc=example,dc=com

让我们看一下这些不同行的作用,因为此文件没有 man 手册。前两行定义了要联系的 LDAP 服务器和要从中搜索的基础。接下来的三行解释了如何启动 TLS 连接。如您所见,nss_ldap 知道 StartTLS,因此我们使用该方法启动 TLS 连接。最后几行描述了要从各种 nsswitch 控制的属性中搜索的基础。我们出于性能原因设置这些。如果我们的所有用户名都在树的一个分支下,则无需搜索整个目录来查找给定的用户名。例如,nss_base_passwd 指定传统上与 /etc/passwd 中的信息关联的搜索基础。但是,如果您确实将用户名存储在目录的多个分支中,则不能使用此选项。可以在此文件中定义大量其他选项。要探索这些选项,请查看 nss_ldap 软件包附带的示例 ldap.conf。

确保您在 /etc/ssl/certs 中有 CA 证书,并运行 c_rehash。对于任何将通过 SSL 连接联系 LDAP 服务器以获取任何信息的机器,都需要完成此过程。

接下来,编辑 /etc/nsswitch.conf 以指定在 LDAP 中查找信息。不要将 ldap 作为主机的第一个条目;如果这样做,您将无法解析 LDAP 服务器的主机名。如果您已在本地将用户添加到 /etc/passwd 或 /etc/shadow 中,并且希望从 LDAP 中提供服务,请删除或注释掉它。现在您可以测试它是否工作

# getent passwd leggett
leggett:x:1001:100:Ti Leggett:/home/leggett:/bin/bash

# id leggett
uid=1001(leggett) gid=100(users)

如果这两个命令都有效,则您已准备就绪。某些程序需要重新启动才能识别对 /etc/nsswitch.conf 的更改。OpenSSH 就是其中之一,因此请重新启动 sshd,然后尝试 slogin。

到目前为止,我们所做的一切都使我们能够启用 Gentoo 和 RHEL 客户端,但让我们回顾一下需要到位的内容。

以下文件是 Kerberos 授权所必需的

  • /etc/krb5.conf

  • /etc/krb5.keytab

  • /etc/pam.d/system-auth

以下文件定义了 OpenLDAP 帐户管理

  • /etc/openldap/ldap.conf

  • /etc/ldap.conf

  • /etc/nsswitch.conf

  • /etc/ssl/certs/ci-cert.pem (Gentoo)

  • /usr/share/ssl/certs/ci-cert.pem (RHEL)

在撰写本文时,RHEL 4 有一个需要注意的地方。当您在 /etc/ldap.conf 中使用主机名而不是 IP 时,会发生错误,因此请在 /etc/nsswitch.conf 中将 LDAP 作为主机数据库的查找,并使用 DHCP 获取客户端 IP。如果您注意到启动网络设备会导致 dhclient 中出现段错误,请将 /etc/ldap.conf 中的主机名更改为 IP。

在 Gentoo 和 RHEL v4 下配置 sshd 以进行单点登录非常简单。您需要确保在 /etc/ssh/sshd_config 中设置以下选项

GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes

设置好这些后,请务必重新启动 sshd。

不幸的是,RHEL v3 的 sshd 支持一种称为 gssapi 的旧版 GSSAPI 机制,该机制容易受到中间人攻击。它已被 gssapi-with-mic 机制取代,RHEL v4 和 Gentoo 都使用该机制。如果您不确定您的 sshd 支持哪种机制,只需在 sshd_config 文件中启用 GSSAPI 身份验证,然后尝试使用 verbose 标志 ssh 进入。您将获得 sshd 支持的所有机制的报告。如果您尝试从使用一种机制的客户端 ssh 到使用另一种机制的服务器,系统将提示您输入密码。这是因为凭据传递在每种机制中都略有不同且不兼容。

我们的最终目标是用户每天只需输入一次密码,并且密码永远不会通过网络传输。那么,如果您的用户每次检查电子邮件时都通过网络发送密码,为什么要经历所有这些麻烦呢?幸运的是,越来越多的电子邮件客户端开始支持 GSSAPI 机制。不幸的是,如果您是 Mozilla Thunderbird 用户,您就不走运了(截至本文撰写之时)。但是,还存在其他一些选项;例如,KDE 的 KMail v1.8 和 Ximian Evolution v2.2 都支持 GSSAPI。我从未使用过 KMail,所以我将坚持我所知道的。配置 Evolution 以使用 GSSAPI 很简单。只需在“接收邮件”和“发送邮件”选项卡下选择 GSSAPI 作为身份验证类型(图 1)。如果您将“使用安全连接”选项设置为“尽可能”,Evolution 将使用 StartTLS 来保护数据传输。

Paranoid Penguin - Single Sign-On and the Corporate Directory, Part II

图 1. Evolution 2.2 帐户首选项

Mac OS X 客户端

从 Tiger 开始,Apple 几乎 Kerberized 了操作系统的所有部分。如果您需要将 Panther (v10.3) 客户端整合到您的基础设施中,请与我联系以获取信息;需要做很多事情。但是,Tiger 相对容易。

首先编辑文件 /Library/Preferences/edu.mit.Kerberos。此文件与其 Linux 对应文件 /etc/krb5.conf 非常相似,只有一些非常小的更改。我们的文件如列表 3 所示。

列表 3. /Library/Preferences/edu.mit.Kerberos

[libdefaults]
 ticket_lifetime = 600
 default_realm = CI.EXAMPLE.COM
 default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc
 default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc
 dnsfallback = no

[realms]
 CI.EXAMPLE.COM = {
  kdc = kdc.example.com:88
  kdc = ldap.example.com:88
  admin_server = kdc.example.com:749
 }

[domain_realm]
 .example.com = CI.EXAMPLE.COM
 example.com = CI.EXAMPLE.COM

配置 Kerberos 后,下一步是为主机创建 keytab 并将其放在 /etc/krb5.keytab 中。您可以从 OS X 客户端运行 kadmin,但由于 v10.4 附带的版本略有错误,因此您需要附加 -O 选项

#/usr/sbin/kadmin -p <admin princ> -O

这就是 Tiger 的 Kerberos 身份验证的全部内容。

不幸的是,在撰写本文时,一个错误会导致机器的身份验证子系统在网络用户尝试在使用有效的 Kerberos 凭据时使用 sudo 时挂起。我正在与 Apple 合作解决此问题,因此请回来查看我的解决方案。

Mac OS X 不使用 nsswitch 来解析名称服务。相反,它使用所谓的目录服务。我解释了如何通过名为 Directory Access 的 GUI 修改目录服务,但最终 GUI 会修改两个文件:/Library/Preferences/DirectoryService/DSLDAPv3PlugInConfig.plist 和 /Library/Preferences/DirectoryService/SearchNodeConfig.plist。

GUI 实用程序可以在 /Applications/Utilities 中找到。首先,启用 LDAPv3 插件,然后选择它并单击“配置”按钮。进入后,单击“显示选项”下拉列表,然后单击“新建”以定义新的 LDAP 服务器。输入您的 LDAP 服务器名称,确保选中所有三个复选框(图 2),然后单击“继续”。接下来,选择 RFC 2307 (Unix) 作为模板,输入您的 LDAP 基础,单击“继续”并定义配置名称。就这样!

您可以像在 Linux 下使用 /etc/ldap.conf 一样,优化目录服务搜索目录的方式。如果您突出显示目录服务并单击“编辑”,它会显示更多高级选项。单击“搜索和映射”选项卡。您将在那里看到一个标记为“记录类型和属性”的列表。对于其中的每一个,您可以选择并定义更具体的搜索基础(图 3)。单击“确定”两次,然后单击“应用”以保存更改。

Paranoid Penguin - Single Sign-On and the Corporate Directory, Part II

图 2. 创建新的 OS X LDAP 目录连接

Paranoid Penguin - Single Sign-On and the Corporate Directory, Part II

图 3. 优化 OS X LDAP 搜索

当然,您需要验证您的目录更改是否正确且有效。OS X 有一个命令行实用程序 dscl,它不仅可以查询 LDAP 目录,还可以查询 NetInfo 目录、NIS 目录或 Directory Access 中列出的任何其他目录。首先,我们应该确保我们可以直接查询我们的 LDAP 服务器

# dscl localhost list \
 /LDAPv3/ldap.example.com/Users

如果您在没有任何选项的情况下运行 dscl,您将获得使用说明并停留在交互式提示符下。以下是使用 dscl 的另外两个示例

# dscl localhost list /Search/Users
# dscl localhost read /Search/Users/leggett

在这里,我们使用 /Search 目录,它作用于所有启用的目录。因此,如果您在 NetInfo 目录中有本地用户,并且还有 LDAP 用户,则 /Search 将作用于这两个目录,合并结果以进行显示。第二个示例使用 read 操作来显示指定分支 /Search/Users/leggett 的叶子的详细信息。当您只有控制台访问权限访问您的 OS X 机器时,dscl 实用程序会很有帮助。

在验证我们的 LDAP 用户可用后,我们需要为我们刚刚启用的 LDAP 用户创建本地主目录

# install -d -o leggett /Users/leggett
# ln -sf /Users /home

OS X v10.4 比标准的 POSIX 访问权限具有更精细的策略,用于控制对 OS 某些方面的访问。默认情况下,admin 组的成员具有管理员权限。但是,此组本地存储在每台机器的 NetInfo 目录中,我被告知删除或重命名此组是非常糟糕的。您也不能使用名为 admin 的 LDAP 组覆盖此组,因为目录的搜索顺序始终首先搜索本地 NetInfo 目录。要使用 LDAP 组替换本地组角色,您需要编辑文件 /etc/authorization。这是一个标准的 Apple plist 格式文件,它定义了系统不同方面的角色。如果您更改看起来像这样的行

<key>group</key>
<string>admin</string>

改为

<key>group</key>
<string>ldap-admins</string>

对于不同的权限,您将使 ldap-admins 组中的这些用户成为该机器上的管理员。这些权限与 sudo 权限不同,sudo 权限在 /etc/sudoers 中定义。这些权限控制对安装软件和修改系统偏好设置等任务的权限。

此时,我们应该能够以用户 leggett 身份登录。Tiger 的 sshd 支持 GSSAPI 机制 gssapi 和 gssapi-with-mic。以前的 OS X 版本仅支持 gssapi,因此在登录或从 OS X 客户端登录时需要密码。SSO 支持已开箱即用,无需编辑配置文件。

正如我之前所说,在 v10.4 中,几乎所有 OS X 的内置服务和应用程序都已 Kerberized,包括 Apple 的 Mail.app。如果您运行自己的 CA 或使用自签名证书,您需要首先将您的 CA 证书导入到系统密钥链中,这样 Mail.app 在连接到自签名 SSL 启用服务(如 IMAP 和 SMTP)时就不会抱怨。将 CA 证书复制到 OS X 客户端,然后运行 certtool

sudo certtool i ci-cert.pem v \
 k=/System/Library/Keychains/X509Anchors

现在您已准备好启动 Mail.app。在帐户创建过程中启用 GSSAPI 的技巧是填写用户名并留空密码。如果您还没有有效的凭据,它将提示您输入 Kerberos 密码。创建帐户后,返回并启用 IMAP 的 SSL。默认情况下未启用,并且 Mail.app 在帐户创建时不会为您提供选择。

自 v10.3 以来的所有 OS X 版本都附带一个 GUI 应用程序,用于管理 Kerberos 凭据,名为 Kerberos.app(图 4),但它隐藏在 /System/Library/CoreServices 中。您可以将这个有用的应用程序添加到您的 Dock,并使其在启动时启动。它可以自动续订您的凭据(当它们即将过期时),并轻松地向您显示您的凭据还有多久有效,以及其他有用的功能。

Paranoid Penguin - Single Sign-On and the Corporate Directory, Part II

图 4. OS X Kerberos 应用程序

Apple 的许多服务和应用程序都已完全 Kerberized,包括 Safari、VPN、Xgrid 和 AFP,使您的 Apple 用户和管理员成为您网络中的一等公民。

总结

到现在为止,您可能已经开始意识到 LDAP 目录和 Kerberos 身份验证的巨大潜力。您拥有强大且可扩展的基础架构以及充分利用它的客户端。在我的下一篇文章中,我们将讨论如何集成另一种类型的客户端 Microsoft Windows。在那之前,享受您劳动的成果!

致谢

这项工作得到了美国能源部科学办公室高级科学计算研究办公室数学、信息和计算科学部子计划的支持,合同号为 W-31-109-ENG-38。芝加哥大学计算研究所和国家科学基金会根据 SCI: 0451491 拨款提供了额外支持。

本文资源: /article/8636

Ti Leggett (leggett@mcs.anl.gov) 是阿贡国家实验室数学和计算机科学部期货实验室的系统管理员。他还与芝加哥大学计算研究所共同任命。

加载 Disqus 评论