单点登录和企业目录,第四部分
欢迎回到关于使用单点登录和企业目录基础设施的最后一篇文章。到目前为止,我们已经介绍了如何设置基础设施,以及如何将运行不同操作系统的各种类型的客户端插入到该基础设施中。这项工作的大部分内容使您的用户受益,使他们只需登录一次,之后他们就可以使用各种资源,例如存储共享、打印机、电子邮件等等。
本月,我们将介绍使用 Kerberos 和 LDAP 来简化您的工作的方法。与往常一样,示例程序和其他文件可从在线资源中获得。
无论您的公司规模有多大,打印始终是必需的。不幸的是,打印也可能是最容易出错的过程之一,尤其是在异构环境中。幸运的是,CUPS(通用 UNIX 打印系统)项目已经建立。CUPS 的目标是提供基于标准的打印解决方案,并为基于 UNIX 的系统提供统一打印。如今,它是大多数 Linux 发行版以及 Apple OS X 的默认打印系统。
使用 CUPS 设置基本打印服务器很简单。要基本了解 CUPS 和可用的安装,您应该阅读 Colin Topliss 的文章“使用 CUPS 集中打印”(参见资源)。如果您想让 Windows 客户端能够打印,请务必在您的 Samba 服务器之一上配置 CUPS 服务器。我们将在稍后介绍如何做到这一点。
设置打印服务器后要做的第一件事是使用 SSL 启用加密。您应该创建一个证书签名请求,或 CSR,并使用您的 CA 对其进行签名。将证书和密钥分别保存在 /etc/ssl/cups 中,命名为 cups-cert.pem 和 cups-key.pem。此外,请确保它们的所有者是 cupsd 使用的用户,通常是 lp,并且私钥的权限设置正确,为 0400。接下来,对 /etc/cups/cupsd.conf 进行一些更改
ServerCertficate /etc/ssl/cups/cups-cert.pem ServerKey /etc/ssl/cups/cups-key.pem
保存您的更改并重启 cupsd。
打印管理最困难的任务之一是跟踪所有要管理的打印机。所有打印机都存在于中心位置的日子已经一去不复返了。现在,打印机更有可能分散在办公室周围,连接到人们的工作站等等。更糟糕的是,这些打印机是不同的品牌和型号,这增加了组织它们的挑战。
CUPS 网站(参见资源)声明 LDAP 支持计划包含在 1.3 版本中。1.1 版本目前是稳定的,而 1.2 版本已经测试了一段时间。但是,这不应该阻止我们使用 LDAP 作为一种盘点办公室中所有打印机的方式,甚至提供一种自动将打印机添加到 CUPS 服务器的方法。
IETF 一直在考虑这个问题,并制定了 RFC 3712,“轻型目录访问协议 (LDAP):打印机服务模式”。我擅自将此 RFC 转换为可在 OpenLDAP 中使用的实际模式,并将其包含在在线资源中。将此模式包含在您的 slapd.conf 文件中并重启 slapd。现在我们可以添加关于我们打印机的信息了
dn: ou=printers,o=ci,dc=example,dc=com objectClass: organizationalUnit ou=printers dn: printer-name=pr-laser,ou=printers,o=ci,dc=example,dc=com objectClass: top objectClass: printerAbstract objectClass: printerService objectClass: printerIPP printer-name: pr-laser printer-location: A101 printer-info: laserjet.ppd printer-more-info: http://www.hp.com printer-make-and-model: HP LaserJet printer-uri: socket://pr-laser.example.com
其中大多数是不言自明的,但 printer-info 和 printer-uri 可能需要一些解释。我们使用 printer-info 属性来指定此打印机要使用的 PostScript 打印机定义,PPD,在本例中为 laserjet.ppd。printer-uri 属性用于定义连接打印机的 URI。socket:// 设备通常用于 HP JetDirect 与打印机的连接。要查找您的打印服务器支持的所有设备,请使用 lpinfo 命令,该命令通常保存在 /usr/sbin 中
# /usr/sbin/lpinfo -v network socket direct hal network http network ipp network lpd direct scsi serial serial:/dev/ttyS0?baud=115200 direct usb:/dev/usb/lp0 network smb
您的输出可能会因编译 CUPS 时启用的选项而异。
您现在在 LDAP 中列出了一台打印机,但是 CUPS 不支持 LDAP,您能用它做什么呢?至少,您有一个中心位置来跟踪所有打印机及其功能。我编写了一个小型 Perl 脚本,该脚本查询 LDAP 目录中的所有打印机,然后创建一个脚本,该脚本可用于将所有打印机添加到 CUPS 服务器。它没有做太多事情,但它为您提供了一个关于如何使用 LDAP 来补充 CUPS 并使管理更易于处理的起点。如果您决定使用某些属性,例如 printer-sides-supported、printer-finishings-supported 和 printer-media-supported,您可以轻松扩展脚本以调用 lpoptions 来自动设置打印机特定的设置。
CUPS 的优点之一是它的默认设置允许它发现其他 CUPS 服务器以及它们服务的打印机。这意味着对于 Linux 和 OS X 客户端来说,使用您的新服务器就像启动 cupsd,等待大约 30 秒,然后就可以开始运行一样简单。幸运的是,使用 Samba 让 Windows 客户端启动并运行也不是难事。以下是对 smb.conf 文件的必要更改
[global] ... load printers = Yes printing = cups printcap = cups printer admin = root [printers] comment = All Printers path = /var/spool/samba browseable = no public = yes guest ok = yes writable = no printable = yes [print$] comment = Printer Drivers path = /etc/samba/drivers browseable = yes guest ok = no read only = yes write list = root
全局部分中的参数启用 CUPS 打印支持。printers 部分使 printcap 文件中列出的所有打印机自动对 Windows 客户端可用。print$ 部分为 Windows 客户端启用自动驱动程序下载,或“即点即印”。这意味着 Windows 客户端无需为他们安装的每台打印机安装打印驱动程序。当他们最初连接到打印机时,客户端将下载并安装一组通用的 CUPS 打印驱动程序,从而消除了用户或管理员担心 Windows 打印驱动程序的需要。保存您的更改并重启 Samba。
在“即点即印”成为现实之前,还有一些事情要做。首先,您应该从 Easy Software Products FTP 服务器下载最新的稳定 CUPS 驱动程序,截至撰写本文时为 1.1.16 版本到您的 CUPS/Samba 服务器。解压捆绑包并运行安装脚本 cups-samba.install。如果安装程序将 cups.hlp 文件放在 /usr/share/drivers 中,请将其与其余驱动程序一起移动到 /usr/share/cups/drivers 中。接下来,确保打印驱动程序共享目录 /etc/samba/drivers 存在。最后,您需要将驱动程序添加到 Samba 共享。如果您已从 LDAP 中删除了 root Samba 用户,则需要重新添加它以进行接下来的两个步骤,因为您需要成为 uid 0 用户。如果您不确定如何操作,请参阅本系列的第三部分 [2006 年 2 月]
# smbclient ///print\$ -Uroot -c 'mkdir ↪W32X86; put /etc/cups/ppd/pr-laser.ppd ↪W32X86/pr-laser.ppd; put ↪/usr/share/cups/drivers/cupsdrvr.dll ↪W32X86/cupsdrvr.dll; put ↪/usr/share/cups/drivers/cupsui.dll ↪W32X86/cupsui.dll; put ↪/usr/share/cups/drivers/cups.hlp ↪W32X86/cups.hlp' # rpcclient localhost -Uroot -c 'adddriver ↪"Windows NT x86" "pr-laser:cupsdrvr.dll ↪:pr-laser.ppd:cupsui.dll:cups.hlp:NULL:RAW:NULL"'
这两个命令专门指我们上面添加到 LDAP 的打印机 pr-laser。您需要为您希望 Windows 客户端访问的 CUPS 服务器提供的每台打印机运行这两个命令。如果您有很多打印机,将这些命令添加到打印机创建脚本可能是一个好主意。
现在,如果您从 Windows 客户端浏览到您的 Samba/CUPS 服务器,您将看到一个“打印机和传真”共享。如果您选择该共享,您将看到通过 CUPS 服务的所有打印机。如果您右键单击打印机并选择“连接...”,它会自动下载并安装驱动程序并连接到打印机,使其可用于从该客户端打印。就是这样!
到目前为止,LDAP 管理都是通过手动编辑 LDIF 文件和使用命令行 OpenLDAP 工具来完成的。Craig Swanson 和 Matt Lung 在他们的文章“重新审视 OpenLDAP Everywhere”(参见资源)中为管理 LDAP 提供了一些优秀的 GUI 实用程序指针,但他们忽略了一个我认为需要提及的实用程序,GQ。虽然 GQ 没有积极开发,但 1.0 beta1 版本已被证明是稳定且非常有用的。但是,如果 GQ 持续发生段错误,您可能需要将补丁应用于 util.c(参见资源)。GQ 的优点之一是它支持 SASL 身份验证。这允许我们使用 GUI 修改 LDAP。此外,我发现浏览模式向我展示了对象类和属性,否则我可能永远不会找到它们。
如果您担任系统管理员超过五分钟,您就会知道脚本编写常见任务的力量。LDAP 管理可能相当冗长,因此能够编写这些常见任务的脚本是非常宝贵的。Perl 和 Python 都具有非常强大的 LDAP 模块。您已经在上个月的文章 smb-create-password.pl 和 smb-new-machine.pl 中了解了 Perl 接口,但 Python 的 LDAP 模块也同样有用。Perl 还具有 Kerberos 和 SASL 的接口。我不会详细介绍每个模块的 API 描述,而是向您展示如何使用它们,同时向您展示使用 LDAP 和 Kerberos 的新的和不同的方法。
资源中包含了一个 OpenSSH 模式。您可能想到的此模式的首批用途之一是将主机公钥保存在一个位置,一种 known_hosts 目录。事实上,这就是创建此模式的原因。未来版本的 OpenSSH 将能够使用名称服务交换 NSS 来查找主机密钥,而不是总是需要包含所有主机密钥的本地文件。这很棒,因为当添加或删除主机时,您不再需要推送和拉取 known_hosts 文件,但是除非您修补了您的 OpenSSH 版本,否则它还不是那么有用。
在计算研究所,我们有一个大型集群,许多外部合作者都在使用它。该集群有自己的网络主目录,因此它不挂载中央 NFS 目录。我们也不希望基于密码的登录,因为密码会通过网络传输。通常,这是强制执行基于 GSSAPI 的身份验证的好时机,但我们无法控制合作者的桌面。因此,我请一位同事编写一个脚本来自动创建用户的主目录,并在用户提供 SSH 密钥的情况下将用户的 SSH 密钥添加到她的 .authorized_keys 文件中。因为 Python 是他选择的语言,所以 mkhomedirs.py 脚本诞生了。
它的工作原理如下。当用户被授予对集群的访问权限时,他们会被放入 cluster-users 网络组中,该网络组也由 LDAP 提供服务。mkhomedirs.py 脚本每小时从 cron 运行一次,检查 cluster-users 网络组中当前用户的列表,以查看哪些用户没有主目录。当它找到没有主目录的用户时,它会创建一个主目录并复制必要的文件,例如来自 /etc/skel 的文件。一旦用户提供 SSH 密钥,该密钥就会添加到 LDAP 中用户的 sshPublicKey 属性中。mkhomedirs.py 脚本还会检查哪些用户没有 ~/.ssh/authorized_keys 文件。如果用户没有该文件并且在 LDAP 中有密钥,它会创建该文件并将密钥添加到其中,允许用户登录。此脚本没有强制用户 authorized_keys 文件必须仅包含 LDAP 中的那些密钥的限制,但添加该功能将非常简单。破解者工具箱中的一个常见技巧是将他或她的 SSH 密钥添加到另一个用户的 authorized_keys 文件中。如果您要求用户 authorized_keys 文件中的所有密钥都在目录中,则可以在未知密钥添加到用户 authorized_keys 文件时发送警告。
您可以使用 LDAP 的另一种方法是自动为您的主机创建 iptables 规则。我们通过枚举主机的所有服务以及允许访问 LDAP 中该服务的所有网络来实现这一点
dn: cn=login,ou=hosts,o=ci,dc=example,dc=com objectClass: top objectClass: ipHost cn: login ipHostNumber: 192.168.1.2 dn: cn=sshd,cn=login,ou=hosts,o=ci,dc=example,dc=com objectClass: top objectClass: ipService cn: sshd ipServicePort: 22 ipServiceProtocol: tcp ipServiceProtocol: udp description: SSH Daemon dn: cn=all-local,cn=sshd,cn=login,ou=hosts,o=ci, ↪dc=example,dc=com objectClass: top objectClass: ipNetwork cn: all-local ipNetworkNumber: 192.168.1.0 ipNetmaskNumber: 255.255.255.0 description: Local Network
接下来,我们需要一些东西来遍历所有主机,并为每个主机提供 iptables 规则。在在线资源中,我提供了一个我编写的脚本 create-iptables.sh,它正是这样做的。它依赖于几个 Perl 模块,我在资源中提供了这些模块的链接。它简要地执行的操作是,为每个主机复制一个前缀文件,该文件具有适用于所有主机的一些规则,并设置我们在脚本中使用的链。接下来,它确保主机使用的所有 IP 都被允许连接回主机。然后,它遍历服务,为每个服务列出的网络打开漏洞。最后,它附加默认规则集,即丢弃所有数据包。所有脚本都写入目录 iptables-scripts,所有以前的脚本都保存到 iptables-backups。您应该在运行脚本之前创建这些目录。然后可以将这些脚本推送到适当的主机并运行,以保持主机规则的最新状态。
您可以轻松修改此脚本以生成其他部分,例如 /etc/hosts.allow 和网络设备 ACL,以增加安全性。这种目录结构的另一种用途是为 nmap 或 nessus 生成自定义扫描,以消除误报。
我包含的最后一个示例是为您的 DHCP 服务器生成 dhcpd.conf 文件。此脚本要求 LDAP 中的主机是 ipHost 和 ieee802Device 对象类的成员,并且已分配其 macAddress 和 ipHostNumber 属性。它不是一个非常复杂的脚本,因为它不能确保主机的 IP 有效。它也不会处理由同一 DHCP 服务器服务的具有多个 IP 或多个子网的主机。
ISC 的 DHCP 服务器有一个补丁,可以添加直接从 LDAP 获取信息的支持,但我更喜欢等待补丁经过审查并包含在主发行版中,然后再在生产服务器上使用。对于那些好奇的人,我在资源中包含了一个链接。
越来越多的应用程序直接包含 LDAP 支持,或者有可用的补丁。BIND 9 有一个 LDAP sdb 后端,用于在 LDAP 中存储区域信息,并且 sudo 能够从 LDAP 获取 sudoers 信息。但是,请记住,如果您的组织想要使用 LDAP 做一些需要新属性或对象类的事情,您可以联系 IANA 以分配您自己的 OID 以供使用。
到目前为止,我们一直在处理扩展 LDAP 的使用,但是我们还有更多方法可以利用 Kerberos。您可能希望启用单点登录的组织中的一个重要部分是 Web 资源的身份验证。许多现代浏览器,例如 IE 6.0、Mozilla、Firefox 和 Safari,已经(或可以使其)支持 GSSAPI 协商。要使用它,您可以安装并启用 Apache mod_auth_kerb 模块。它可以协商基于票据的身份验证以实现单点登录,或者向用户显示传统的用户名/密码框并将用户身份验证到 KDC。
Kerberos 的另一个扩展以 NFSv4 的形式出现。NFS 的第 4 版已将更强的安全性作为协议的一部分。它具有 ACL 支持,并且可以使用用户的 Kerberos 凭据进行访问和权限。密歇根大学的 CITI 小组正在率先进行 Linux NFSv4 的实现,并提供了您需要的用户空间工具的所有补丁的链接。最新的 2.6 内核附带了对 NFSv4 和 rpcsec_gss 的支持,但某些发行版默认情况下不启用该支持。必要的软件包可以在 Gentoo 系统上 emerge,并且 Red Hat Enterprise Linux 4 中完全支持。
在本系列文章中,我们已经走了很长一段路。您应该拥有一个可扩展的目录和单点登录环境。我们已经介绍了如何将异构客户端集成到基础设施中。最后,我们介绍了作为系统管理员的您如何更轻松地管理和利用您的 LDAP 和 Kerberos 环境。
这项工作得到了美国能源部科学办公室高级科学计算研究办公室数学、信息和计算科学部门子计划的支持,合同号为 W-31-109-ENG-38.4:08。感谢 Justin Binns 编写了 mkhomedirs.py 脚本。
本文的资源: /article/8749。
Ti Leggett (leggett@mcs.anl.gov) 是 Argonne 国家实验室数学和计算机科学部未来实验室的系统管理员。他还兼任芝加哥大学计算研究所的职务。