单点登录和企业目录,第三部分

作者:Ti Leggett

欢迎来到关于如何实施单点登录和企业目录系统的第三部分。在本文中,我们探讨如何集成 Microsoft Windows 客户端。要实现这一切需要做很多工作,所以戴上您的工作手套,让我们开始吧。

当您想要将 Windows 客户端集成到异构环境中时,您需要做出一些选择。虽然您可以运行 Active Directory (AD) 服务器,并让您的 Linux 和 Apple 客户端绑定到它进行身份验证和身份管理,但所涉及的成本并不低。而且,这对于一篇关于开源单点登录和目录实施的文章来说,也不会很有趣。

当您将 Windows 客户端绑定到开源解决方案时,您还需要做出两个选择。您是将它们绑定到 Kerberos 域进行身份验证,还是将它们绑定到 LDAP 进行身份管理?这是一个二选一的选择,因为虽然 Windows 客户端知道如何使用 Kerberos 和 LDAP,但它们只有在与 AD 服务器通信时才知道如何同时使用它们。换句话说,Windows 客户端只能在用户的身份信息本地保存时,才能与非 AD Kerberos 服务器通信。同样,Windows 客户端可以通过 Samba 从 LDAP 获取身份信息,但前提是密码也通过 Samba 提供,而 Samba 目前无法通过 Kerberos 进行身份验证。

让 Windows 针对我们的 Kerberos KDC 进行身份验证更容易设置,但维护起来可能更困难,因为每个使用 Windows 客户端的用户都需要拥有本地帐户。如果您只需要维护一台 Windows 客户端,这很好,但如果您有更多客户端,则需要将每个用户添加到每个客户端。我不会探讨这个选项;但是,如果您有兴趣,您应该阅读 Jason Garman 的Kerberos: 权威指南

配置 Samba

因为我们正在处理企业目录,所以我假设您的网络上可能有多台 Windows 计算机。为了尽可能轻松地使用和整合它们,我们使用绑定到 LDAP 目录后端的 Samba。即使我们将以稍微不同的方式配置 Samba,您也应该首先阅读 Craig Swanson 和 Matt Lung 的“重新审视 OpenLDAP Everywhere”(请参阅在线资源),因为它将为您构建一个良好的基础。我在目录中创建了一个名为 samba 的组织单元分支,用于 Samba 特定的条目,例如机器和 ID 映射。列表 1 显示了这些特殊分支的层次结构,列表 2 显示了它们的 LDIF。

列表 1. 其他组织单元

+ o=ci,dc=example,dc=com
|- ou=samba
   |- ou=hosts
   |- ou=idmap

列表 2. 其他组织单元的 LDIF

dn: ou=samba,o=ci,dc=example,dc=com
objectClass: organizationalUnit
ou: samba

dn: ou=hosts,ou=samba,o=ci,dc=example,dc=com
objectClass: organizationalUnit
ou: hosts

dn: ou=idmap,ou=samba,o=ci,dc=example,dc=com
objectClass: organizationalUnit
objectClass: sambaUnixIdPool
uidNumber: 15000
gidNumber: 15000

我不使用 IDEALX 的 smbldap 脚本来创建必要的条目,因为我使用 LDAP 不仅仅是为了 Samba 身份验证。不使用 smbldap 工具的一个主要原因是它假设它和 Samba 将是添加用户和组等操作的唯一入口点。在我的环境中,并非所有用户都有权登录 Windows 计算机。有些用户可能一开始只是 Linux 用户,但后来需要被授予访问 Windows 计算机的权限。smbldap 工具不能很好地处理这种情况。但是,smbldap 工具确实很好地处理了其他事情,所以像所有事物一样,调查所有可用的工具并选择最适合您需求的工具。

我们需要 LDAP 中的几个用户来执行各种任务。首先,我们需要一个对目录的某些部分具有写入权限的用户。如果您注意到 /etc/samba/smb.conf 中,有一个选项 ldap admin dn,它定义了该用户的 DN。这个名为 samba_server 的用户应该存储在 LDAP 目录本身中,并且它将是目录中唯一具有关联密码的用户。因为此用户不是 posixAccount objectClass,所以该帐户在 Linux 下无法识别。要创建此用户,请首先运行slappasswd以生成哈希密码。然后,获取哈希值并创建一个类似于列表 3 的 ldif 文件。

列表 3. Samba 用户的 LDIF

dn: uid=samba_server,ou=people,o=ci,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: uidObject
sn: samba_server
cn: samba_server
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
uid: samba_server

接下来,我们需要告诉 Samba 如何使用 samba_server 用户访问 LDAP 目录,方法是使用 smbpasswd 命令

# /usr/bin/smbpasswd -w <password>
Setting stored password for
&rarrhk;"uid=samba_server,ou=people,o=ci,dc=example,dc=com"
&rarrhk;in secrets.tdb

为了增加安全性,您应该关闭 shell 的历史记录日志记录,因为密码是在命令行中给出的。smbpasswd 命令获取给定的密码并将其存储在 /var/lib/samba/private/secrets.tdb 中,键值为 Samba 域和 admin dn,因此如果其中任何一个值发生更改,您都需要重新运行 smbpasswd。

因为 Samba 使用此用户来查询和修改目录中的值,我们需要允许 Samba 管理员对目录中的某些属性具有写入权限,因此请确保将适当的 ACL 添加到 /etc/openldap/slapd.conf。

此时,我们可以获取域的 SID。要获取域的 SID,您需要成为域的主域控制器 (PDC) 上的 root 用户,并运行

# net getlocalsid
SID for domain CI-PDC is:
↪S-1-5-21-2162541494-3670296480-3949091320

如果您不使用 smbldap 工具来创建所有 Samba LDAP 条目,则在创建这些条目时需要使用此 SID。我已在在线资源中包含了一个包含您需要创建的所有条目的示例 LDIF。

Samba 还临时需要 LDAP 目录中 uid 为 0 的用户来执行某些操作。该条目不需要是完整的 posixAccount 用户,但它应该类似于列表 4。

列表 4. root 帐户的 LDIF

dn: uid=root,ou=people,o=ci,dc=example,dc=com
objectClass: account
objectClass: sambaSamAccount
cn: root
uid: root
displayName: root
sambaSID:
↪S-1-5-21-2162541494-3670296480-3949091320-1000
sambaPrimaryGroupSID:
↪S-1-5-21-2162541494-3670296480-3949091320-512
sambaNTPassword: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sambaAcctFlags: [U          ]
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647

请注意,此用户条目确实有一个 NT 密码,但此密码不必与实际的 root 密码相同,它只是临时的,用于将权限分配给普通用户。我已在在线资源中包含了一个简单的 Perl 脚本,您可以使用它来生成所需的 NT 密码哈希值。您需要 Crypt::SmbHash 和 Term::ReadKey Perl 模块才能使用它。

要修改的最后一个用户是您自己的用户,以便它被识别为 Samba 用户并且是域管理员。列表 5 显示了 LDIF。

列表 5. 常规 Samba 用户的 LDIF

dn: uid=leggett,ou=People,o=ci,dc=uchicago,dc=edu
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: sambaSamAccount
cn: Ti Leggett
givenName: Ti
sn: Leggett
mail: leggett@mcs.anl.gov
uid: leggett
uidNumber: 1001
homeDirectory: /home/leggett
loginShell: /bin/bash
gidNumber: 1000
sambaSID:
↪S-1-5-21-2162541494-3670296480-3949091320-3002
sambaPrimaryGroupSID:
↪S-1-5-21-2162541494-3670296480-3949091320-512
sambaNTPassword: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sambaAcctFlags: [U         ]
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647

关于 SID 和 RID 的说明

您的域的 SID 是一个唯一键,并添加到域实体的开头。RID 是域中身份信息的唯一标识符,并附加到 SID 以构成 sambaSID。我遵循的确保 RID 唯一的算法是将用户的 uid 乘以 2 并加上 1000。对于组,将 gid 乘以 2 并加上 1001。这确保了用户都具有偶数 RID,而组具有奇数 RID。此规则的唯一例外是域管理员、域用户和域访客。这些组的 RID 与它们的 gid 相同,以便与 Windows 分配它们的方式保持一致。

您会注意到,此帐户在 LDAP 目录中也有一个 NT 密码。不幸的是,截至撰写本文时,除非 Samba 针对 AD 服务器进行身份验证,否则 Samba 尚无对使用 Kerberos 身份验证的稳定支持。但是,如果您使用 Heimdal Kerberos 实现,则可以将 Kerberos 主体数据存储在 LDAP 目录中。这可能会使 Samba 身份验证更简洁一些,尽管它不会使您的 Samba 域成为 AD 服务器。因为我们没有使用 Heimdal,并且这没有得到官方支持,所以我们必须将 Samba 密码存储在目录中。如果您有兴趣,我已在在线资源中提供了一些关于 Kerberos/LDAP 解决方案的链接。

我们现在准备启动 Samba,但请确保您也启动了 winbind 服务。在 Gentoo 下,修改 /etc/conf.d/samba。

Samba 权限

在 Samba v3.0.11 中,引入了权限的概念。在此版本之前,所有用户、组、机器和打印机管理都需要一个可通过网络访问的 uid 0 用户。从 v3.0.11 开始,具有适当权限的用户可以发起这些类型的请求。uid 0 用户最终对于其中一些仍然是必要的,但它不再需要可通过网络访问。因此,您可能想知道为什么我们在目录中添加了 uid 0 帐户。好吧,在最初设置 Samba 时,存在一个先有鸡还是先有蛋的问题。为了执行这些特殊操作,您需要适当的权限,但您无法在没有这些权限的情况下授予自己这些权限。因此,为了将这些权限授予普通用户,您需要短暂地使用 uid 0 用户,然后您可以将其从目录中删除。要了解您的版本支持哪些权限,您可以使用 net 命令

# net rpc rights list -U root
Password:
     SeMachineAccountPrivilege  Add machines to domain
      SePrintOperatorPrivilege  Manage printers
           SeAddUsersPrivilege  Add users and groups to the domain
     SeRemoteShutdownPrivilege  Force shutdown from a remote system
       SeDiskOperatorPrivilege  Manage disk shares

较新版本添加了更多权限,因此请确保在继续之前了解您的版本支持的所有权限。现在我们需要将权限分配给组和/或用户。显而易见的第一步是将所有权限授予 Domain Admins 组

# net rpc rights grant "CI\Domain Admins" \
 SeMachineAccountPrivilege SePrintOperatorPrivilege \
 SeAddUsersPrivilege SeRemoteShutdownPrivilege \
 SeDiskOperatorPrivilege -U root
Password:
Successfully granted rights.

在这个阶段,我们应该能够从目录中删除 root 用户,因为 Domain Admins 组的任何成员都应该能够发出管理 Samba 命令。

将计算机加入域

因此,我们有一个 Samba 用户,但实际上没有用户可以登录的地方。在 Windows 世界中,计算机必须加入域,用户域帐户才能有效。当计算机加入域时,它需要为自己创建一个域帐户。此帐户看起来与常规用户帐户完全相同,只是它以美元符号结尾。因为我不使用 smbldap 工具,所以我编写了一个小的 Perl 脚本,该脚本从 secrets.tdb 读取管理员 dn 的密码,并将计算机帐户添加到 LDAP 目录。该脚本可从在线资源获得,并依赖于 Crypt::SmbHash、Net::LDAP、File::Temp 和 TDB_File Perl 模块。一旦您安装了此脚本,您可以通过右键单击“我的电脑”,选择“属性”,选择“计算机名”选项卡,然后单击“更改...”按钮将计算机添加到域。如果尚未提供计算机名,请输入适当的计算机名,然后在“隶属于”字段中选择“域:”选项,并输入您的 Samba 域名(图 1)。单击“确定”后,它将要求您输入用户名和密码。输入属于 Domain Admins 组的用户的用户名和密码——在我的例子中是 leggett。片刻之后,您应该收到一条欢迎您加入域的消息。重新启动后,您将有机会以域用户身份登录。

Single Sign-On and the Corporate Directory, Part III

图 1. 加入域

单点登录和 Windows

虽然现在 Windows 计算机已插入您的基础设施中,这很好,但本文也关于单点登录。您可能会问自己“但是身份验证不是由 Kerberos 提供的,那么单点登录如何工作?” MIT 有一个 Windows 版 Kerberos 软件包,允许您获取和管理票证,类似于 Apple 的 Kerberos.app(图 2)。

Single Sign-On and the Corporate Directory, Part III

图 2. MIT Windows 版 Kerberos Leash

单点登录的两个主要需求是 SSH 访问和邮件访问。Certified Security Solutions 修补了适用于 Windows 的 PuTTY SSH 客户端,以允许 GSSAPI 身份验证。为了在 Windows 2000 和 XP 系统下使用 MIT Windows 版 Kerberos,请将文件 plugin_mitgss.dll 复制到 PuTTY 安装目录中的 plugingss.dll。启动 PuTTY 后,转到“连接/SSH”类别中的“Auth”菜单,并选中“尝试 GSSAPI/Kerberos 5 身份验证”(图 3)。确保您拥有有效的 Kerberos 凭据,然后就可以开始了。

Single Sign-On and the Corporate Directory, Part III

图 3. PuTTY GSSAPI 配置

要使邮件访问工作的最后一块主要部分。Microsoft 不使用 GSSAPI 作为其身份验证方案。相反,它使用所谓的 SPNEGO。因此,Outlook 和 Outlook Express 将无法与我们的单点登录环境一起工作。但有好消息。Qualcomm 的 Eudora 电子邮件软件包支持 GSSAPI,并且它有一个免费版本可以启动。

配置 Eudora v6.2

启动帐户创建过程,并选择“直接跳到高级帐户设置”。输入 SMTP 和 IMAP 设置所需的信息。确保为“安全套接字”设置选择“如果可用,则为 STARTTLS”,并在“传入邮件”选项卡下,确保选择“Kerberos”作为身份验证样式(图 4)。

Single Sign-On and the Corporate Directory, Part III

图 4. Eudora 帐户创建

配置好您的帐户后,您可能会在第一次尝试连接时收到错误消息,提示连接已断开或 GSSAPI 失败。这些错误并没有很好地描述实际问题,即 Eudora 不信任您的自签名 SSL 证书。要解决此问题,请编辑新创建的身份的属性(图 5)。单击“传入邮件”选项卡,然后单击“上次 SSL 信息”按钮,然后单击“证书信息管理器”按钮(图 6)。如果您单击“添加到受信任”按钮,您的自签名证书将被 Eudora 信任为有效。第一次尝试发送邮件时,您也需要为您的 SMTP 服务器执行此操作。

Single Sign-On and the Corporate Directory, Part III

图 5. Eudora 身份属性

Single Sign-On and the Corporate Directory, Part III

图 6. Eudora 证书信息管理器

总结

您现在已将另一个主要架构集成到您的单点登录和企业目录基础设施中。仍然可以添加或增强一些部分,例如在 Kerberos 和 Samba 之间保持密码同步的方法、Eudora 中的 LDAP 搜索以及更强大的 Samba 用户管理脚本。但是,您可以看到 Kerberos 和 LDAP 如何使您的系统的管理和使用更加轻松和统一。在本系列的最后一篇文章中,我将探讨一些关于如何将您的新基础设施用于管理功能的想法。在那之前,继续扩展和使用您的企业目录!

致谢

这项工作得到了美国能源部科学办公室高级科学计算研究办公室数学、信息和计算科学部门子计划的支持,合同号为 W-31-109-ENG-38.4:08。

本文的资源: /article/8701

Ti Leggett (leggett@mcs.anl.gov) 是 Argonne 国家实验室数学和计算机科学部门未来实验室的系统管理员。他还兼任芝加哥大学计算研究所的职务。

加载 Disqus 评论