在本文中,将学习以下概念:
- 本地密码数据库设置
- smbpasswd 文件格式
- Samba 和其他系统间的密码同步
- 替代的后端密码存储
- Samba 和 Lightweight Directory Access Protocol (LDAP) 集成
- 访问控制列表 (ACL)
本文帮助您准备 Linux Professional Institute's (LPI) Mixed Environment 特性考试 (302) 的主题 313 下的目标 313.2。该目标的权值为 8。
为了最有效地利用本系列中的文章,您应该具有Linux 高级知识,还应该安装一个 Linux 工作系统,以便在该系统上练习本文涉及的命令。另外,您还应该能够访问一个用于测试身份验证和授权机制的 Windows 环境。
Samba 提供了几种方法来通过密码后端 存储密码和帐户信息。有些方法依赖于磁盘存储;有些依赖于基于网络的方法。另外,Samba 向 Linux 服务器提供了通过 Samba 身份验证系统实现登录身份验证的机制。
由于 Samba 已经存在近了 20 年,因此它携带了一些技术包袱 (technical baggage)。较旧的身份验证系统仍然受到支持,但新技术已经替代了旧技术。当您阅读关于 Samba 的文档时,就会发现一些对这些旧系统的引用。一些命令行工具拥有类似于某个特殊技术的名称,这进一步加剧了名称混淆。
尽管名称为密码后端,但后端中存储的数据除了密码外还包括帐户数据和其他属性。数据本身也可能存储在一个 LDAP 服务器中,Samba 密码后端的作用是充当 Samba 和 LDAP 之间的中介。
更有趣的是,Microsoft 设备期望密码散列表使用某种不同于 UNIX 密码格式的格式。将密码散列化 (hashed) 意味着使用单向方式对它们进行加密;所以无法在 UNIX 和 Samba 密码格式之间进行转换。因此,无法在 UNIX 密码数据库之外对 Samba 客户端进行身份验证。
本地密码数据库 指那些将信息存储在服务器上而不是通过网络进行身份验证的密码后端。它们虽然不是性能最好的选项,但是简单易用。
您可能在某些文档中看到过对纯文本 后端的引用。多年以前,Windows 客户端采用未经加密的格式向服务器传递它们的凭据。然后使用 UNIX 样式散列化密码,并对照本地密码数据库检查结果。如果不进行一些注册表更改,Windows 客户端无法实现此操作,如果能够避免,没有人愿意在自己的网络上传递未经加密的密码。因此,您可能看到过有人提到纯文本密码数据库,但生产环境中不会使用这种数据库。
大多数旧系统都使用 smbpasswd 密码后端。这种后端在一个简单的平面文件中存储帐户数据。这个文件中的数据包含帐户名称、密码散列表以及一些基本帐户信息。这些基本帐户信息很简单,它们不会存储您在 Microsoft 管理工具中看到的高级属性。
目前最受欢迎的本地存储后端是 tdbsam。回想一下主题 310.3 下的 Trivial Database (TDB) 文件(参见 参考资料 中的链接):TDB 文件提供一种快速可靠的方法来访问 “键-值” 信息。tdbsam 后端存储信息的格式非常类似于 Microsoft Windows NT Security Account Manager (SAM) 采用的格式,这意味着,可以在 SAM 中存储的任何内容几乎都可以在 Samba 服务器中表示。因此,tdbsam 提供了与 Microsoft 系统的高级兼容性。
tdbsam 的不足之处在于它采用的是二进制格式,因此不能轻松查看其中的内容。文章 “学习 Linux,302(混合环境):Trivial Database 文件”(developerWorks,2011 年 3 月)展示了如何从这个文件内部提取一些 “键-值” 对,但必须由您将其重构为有意义的数据。这个文件称为 passdb.tdb 。
在进行新的安装时,通常不会选择使用 smbpasswd 数据库后端。但是,您可能会在这个领域中遇到这个后端,因此,理解它仍然非常重要。
这个密码数据库后端使用 passdb backend 参数配置。下面的代码显示了将要选择的 smbpasswd 数据库:
[global] passdb backend=smbpasswd:/etc/samba/smbpasswd |
如您所见,这里使用了 passdb backend 全局参数,参数值为冒号 (:) 分隔的 smbpasswd 和文件路径。冒号和路径都是可选的,但建议您使用它们。如果省略它们,Samba 会将文件放置到其选择的目录中。Samba 在您重启时创建这个文件,但文件会是空的。
smbpasswd 命令用于添加用户。清单 1 展示一个将要添加的用户以及 smbpasswd 文件上的效果。
清单 1. 将用户添加到 smbpasswd 文件
# smbpasswd -a sean New SMB password: Retype new SMB password: Added user sean. # cat smbpasswd sean:1001:01FC5A6BE7BC6929AAD3B435B51404EE: \ 0CB6948805F797BF2A82807973B89537:[U ]:LCT-4DCDE4D8: |
清单 1 首先通过使用 -a 标志添加一个名为 sean 的用户。该用户必须位于本地 UNIX 数据库中,否则命令将失败。smbpasswd 文件这时只有一行(为了更加清楚易懂,清单 1 已将该行分割为多行),包含几个用冒号分隔的字段。这些字段按顺序分别为:
- 用户名
- UNIX 用户 ID
- Legacy Lanman 散列表(由于这个散列表上缺乏安全性,它实际上是一个纯文本密码。)
- 安全的 Windows NT 散列表(这时验证现代客户端所需的散列表)
- 帐户标志(这里的唯一标志为
U, 表示一个用户帐户。请参阅 smbpasswd(5) 手册页了解更多标志。) - 帐户的 Last Changed Time (LCT)(这个十六进制值是 UNIX 时间戳的一个编码版本)
用户可以通过键入 smbpasswd 更改其密码,root 用户可以通过指定用户名更改其他用户的密码。-a 标志仅用于添加帐户。
纯文本文件在以下两方面存在局限性:一是查阅它们的速度;二是能够存储的帐户元数据。因此,我们创建了 tdbsam 数据库。
tdbsam 数据库旨在取代 smbpasswd 数据库。这个数据库可以存储更多帐户数据;由于使用了细节数据库 (trivial databases),这个数据库的速度快了很多。
关于 tdbsam 数据库的局限性的一些指南都不够具体。官方文件建议在达到 250 个用户时升级到 LDAP 数据库,但据说 tdbsam 数据库曾支持过数千个客户端。并发请求的数量似乎是一个重要因素,该因素受到客户端数量、工作负载以及客户端和服务器之间的延迟的影响。与大多数应用程序一样,最好监控延迟、CPU 和磁盘 I/O 等关键因素来预测您的网络的临界点。
tdbsam 后端的配置与 smbpasswd 一样简单。将 passdb backend=tdbsam(文件名是可选的)添加到您的 global 区域,重启 Samba。包含身份验证信息的 TDB 文件的默认名称为 passdb.tdb。
smbpasswd 工具也能操作 tdbsam 数据库中的用户。清单 2 展示了使用 smbpasswd 添加一个用户前后的 tdbsam 数据库。
清单 2. 使用 smbpasswd 创建一个用户并查看 tdbsam
# tdbdump passdb.tdb
{
key(13) = "INFO/version\00"
data(4) = "\03\00\00\00"
}
# smbpasswd -a sean
New SMB password:
Retype new SMB password:
Added user sean.
# tdbdump passdb.tdb
{
key(13) = "RID_00000bba\00"
data(5) = "sean\00"
}
{
key(10) = "USER_sean\00"
data(205) = "\00\00\00\00....EC\04\00\00"
}
{
key(13) = "INFO/version\00"
data(4) = "\03\00\00\00"
}
|
passdb.tdb 的初始内容只有一个包含版本字符串的键。然后,使用与 以前 完全相同的方式添加一个用户。smbpasswd 实用工具非常智能,能够阅读 smb.conf
,理解应该以何种方式添加用户。密码数据库现在包含另外两个键:第一个键将一个 Microsoft relative ID (RID) 映射到一个用户名,另一个键包含用户信息。这个数据大多数情况下是二进制数据,因此解码该数据需要查看 Samba 源代码中的数据结构的布局。
TDB 文件格式可以提供较好的性能,适合大多数小环境。要将该格式扩展到 TDB 文件之外,则必须针对 LDAP 服务器进行身份验证。由于 LDAP 采用了树型结构,所以它适合进行身份验证。Microsoft 的 Active Directory® Domain Services 也构建于 LDAP 基础之上。
集成 Samba 和 LDAP 的第一步是配置 LDAP 服务器。对此进行详细描述已超出了本文的范围,但 301 考试的学习材料已经深入介绍了这个主题(请参见 参考资料)。您可能需要复习这个材料,因为集成 Samba 和 LDAP 需要理解 LDAP。
OpenLDAP 是 Linux 服务器上最常见的 LDAP 服务器,它的配置文件是 slapd.conf。清单 3 提供了一个准备与 Samba 集成的配置文件。
清单 3. slapd.conf
# Include the core schema files, and the perquisites for samba.schema include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/samba.schema database bdb # Configure the tree and the admin user pidfile /var/run/openldap/slapd.pid suffix "dc=ertw, dc=com" rootdn "cn=admin, dc=ertw, dc=com" rootpw linux directory /var/lib/ldap # Indexes index objectclass eq index cn pres,sub,eq index sn pres,sub,eq # For storing Unix accounts in LDAP index uidNumber eq index gidNumber eq index memberUid eq # Samba specific index uid pres,sub,eq index displayName pres,sub,eq index sambaSID eq index sambaPrimaryGroupSID eq index sambaDomainName eq index default sub |
清单 3 对所有对象使用 dc=ertw,dc=com 前缀。第一部分加载 Samba 集成所需的所有架构元素。core.schema 是 OpenLDAP 的基本操作所必需的,samba.schema 引入了一些 Samba objectClass。其他架构是 samba.schema 的先决条件,所以必须先包含这些架构,文件是按顺序处理的。
下一部分将从 database bdb 开始,它指明将要使用 Berkeley 数据库,并提供了一些关于树的信息,包括管理用户和目录。文件的剩余部分将设置一些索引,以简化树的搜索;这些索引来自 OpenLDAP 的默认配置和 Samba 文档。
现在必须使用各种容器填充您的 LDAP 树,以便存储用户、计算机和组。您还必须将服务器的安全标识符 (SID) 与一些记录相关联。这是一项复杂的工作;幸运的是,smbldap-tools 项目简化了这项工作。您的发行版可能已经附带一个包含这些工具的包;如果没有,请下载并手动安装它们(参见 参考资料 中的链接)。
安装好 smbldap-tools 实用工具后,请检查配置文件并填充要求填写的信息(比如您的域或工作组的名称和管理信息),以便连接到您的 LDAP 服务器。然后,运行 smbldap-populate 命令来构建您的树。输出如清单 4 所示。
清单 4. 填充 LDAP 树
# smbldap-populate Populating LDAP directory for domain BOB (S-1-5-21-2287037134-1443008385-640796334) (using builtin directory structure) entry dc=ertw,dc=com already exist. adding new entry: ou=People,dc=ertw,dc=com adding new entry: ou=Groups,dc=ertw,dc=com adding new entry: ou=Computers,dc=ertw,dc=com adding new entry: ou=Idmap,dc=ertw,dc=com adding new entry: uid=root,ou=People,dc=ertw,dc=com ... adding new entry: cn=Replicators,ou=Groups,dc=ertw,dc=com adding new entry: sambaDomainName=BOB,dc=ertw,dc=com Please provide a password for the domain root: Changing UNIX and samba passwords for root New password: Retype new password: |
清单 4 显示,smbldap-populate 命令已经确定了本地机器的 SID 和域,正在构建 LDAP 中的目录结构。最后,这个工具会询问您的 root 密码并在 LDAP 树中同步它。
可以通过配置 Samba 来使用 LDAP,这涉及告知服务器如何绑定到您的 LDAP 树。清单 5 展示了用于 LDAP 身份验证的一个最小 Samba 配置。
清单 5. 通过身份验证 Samba 来使用 LDAP 的最小配置
[global] passdb backend = ldapsam:ldap://ldap.ertw.com ldap suffix = dc=ertw,dc=com ldap user suffix = ou=People ldap group suffix = ou=Groups ldap admin dn = uid=samba_service,ou=People,dc=ertw,dc=com |
清单 5 在全局范围内操作,将本地服务器指向位于 ldap.ertw.com 的一个 LDAP 服务器。首先定义的三个后缀会向 Samba 告知树的基础名称、用户分支的名称和组分支的名称。最后会配置管理用户的可分辨名称 (Distinguished Name, DN)。该用户将被用于连接到树,对其他用户进行身份验证。这个用户的 LDAP Data Interchange Format (LDIF) 信息如清单 6 所示。
清单 6. 服务帐户的 LDIF
dn: uid=samba_service,ou=People,dc=ertw,dc=com
uid: samba_service
objectclass: person
objectclass: uidobject
description: Service account to allow Samba to authenticate
cn: samba_service
sn: samba_service
userPassword: {SSHA}tQNdW/bNxQGz2iGoLz5zFL5wJ8px43v5
|
必须使用 smbpasswd -w 命令和密码来设置管理 DN 的密码。清单 6 中显示的 userPassword 散列表是同一个密码,但该密码是使用 slappasswd 命令生成的。现在,请重启 Samba。
通常,您必须负责管理 UNIX 用户 ID 和 Microsoft SID 之间的映射,因此请牢记域 SID。这个映射过程容易出错,所以 smbldap-useradd 命令会提供相应的帮助。运行 smbldap-useradd -a sean 添加一个名为 sean 的用户。-a 参数会告知程序将一些 Samba objectClass 添加到 LDAP 对象,以便用户能登录 Microsoft 域。最后,可以使用 smbldap-passwd 命令和用户名向用户提供一个密码。
现在,您应该能够连接到您的 Samba 服务器并使用刚刚在 LDAP 树中提供的凭据。smbldap-tools 包中的其他许多工具能够帮助您管理用户并规划更大的迁移。
Linux 和 Microsoft 之间的单点登录 或密码同步很难实现,因为这两个操作系统以不同的方式存储密码。smbldap-tools 包通过同时在两个系统上工作来绕过这个问题。另一种办法是将密码控制权交给 Microsoft 网络。
Linux 支持一个名为可插拔身份验证模块 (Pluggable Authentication Module, PAM) 的概念。PAM 允许管理员配置如何验证服务,并在应用程序不知情的情况下,通过操作配置文件来更改身份验证过程。应用程序调用 PAM 库对用户进行身份验证。PAM 会参考配置文件,以获取针对特定服务对用户进行身份验证的指令。然后将身份验证成功或失败的信息返回给应用程序。
随着时间推移,人们编写出了许多身份验证模块,以支持针对其他服务(从本地密码文件到 LDAP、Kerberos,甚至是 Microsoft 网络)的身份验证。提供这项服务的模块名为 pam_smb。
您的发行版应该附带了最新版的 pam_smb;如果没有,可以从网站下载其源代码(参见 参考资料 中的链接)。该模块是在 /etc/pam_smb.conf 中配置的。文件格式很简单:仅仅是域名加上能够提供身份验证的一个或两个服务器。下面是一个样例配置:
MYGROUP ALICE BOB |
这个样例针对 ALICE 和 BOB 服务器对 MYGROUP 域或工作组中的用户进行身份验证。如果只有一个用于处理身份验证的服务器,那么您的配置文件将只有两行,分别指定域和身份验证服务器。
下面,您必须将 pam_smb 插入身份验证堆栈。您会发现,/etc/pam.d 中的几个配置文件引用了单个服务的特定身份验证顺序。这些文件中的大多数看起来都是大同小异,因为它们通常都包含一个通用文件,而不是在多个不同文件间复制配置。请查找使用 include 关键字包含的文件。例如,在 Fedora 上,这个文件为 password-auth 或 system-auth。清单 7 展示了 password-auth 文件的身份验证部分。
清单 7. password-auth 的身份验证部分
auth required pam_env.so # Use samba authentication auth sufficient pam_smb_auth.so debug auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth required pam_deny.so |
清单 7 中的每一行都是按顺序处理的。第一行调用 pam_env,设置环境变量。第二行让 pam_smb 通过额外的调试尝试发出一个身份验证请求。如果身份验证成功,则认为检查已经足够了,用户可以进行登录。如果失败,
则将控制权交给 pam_unix,对照 UNIX 密码文件进行检查。
使用 PAM 时,最好以 root 帐户登录并关闭一个已知的文件工作副本。如果您将自己锁在系统之外,则可以通过复制不正确的文件迅速获得访问权。
Linux 有一个名为 /etc/nsswitch.conf 的文件,控制系统库如何在用户和组 ID 之间映射以及系统库表示的名称。这个文件可配置 Name Service Switch (NSS) 系统。大多数系统指向本地文件(比如 /etc/passwd 和 /etc/group)或一个 LDAP 或 Network Information Service (NIS) 服务器。也可以使用一个名为 Winbind 的服务让系统库从 Microsoft 网络请求映射。
本系列下一篇文章将深入了解这个主题。至于现在,理解用户通过 RAM 进行身份验证,但用户和组名称从 NSS 系统进行身份验证就已经足够了。
Microsoft 服务器支持一个相当健壮的权限集,允许管理员非常精确地配置对文件和目录的访问。尽管有些 UNIX 系统附带了文件系统 ACL,但对它的支持并不是很普遍。因此,Linux 系统通常受限于针对 Everyone/Group/User 访问的传统 Read/Write/Execute 位。Samba 必须向 Microsoft 客户端提供 ACL 接口,将此接口映射到 UNIX 文件权限,并有选择地将一些信息存储在 TDB 文件中。
一些参数负责管理如何在 UNIX 和 Windows NT 权限之间映射文件权限。其中的两个重要参数是 force security mode
和 security mask。这两个参数互相配合,分别用于设置和移除文件权限位。
UNIX 文件权限模式是八进制数字:Execute 为 1,Write 为 2,Read 为 4。这些数字对应组成一个 八进制数字所需的三个位。这三个八进制数字的第一个所有者权限,然后是组,最后是全局 (Everyone) 权限。模式为 750 的文件为所有者提供了读取、写入和执行权限,为组提供了读取和执行权限,没有为其他人提供任何访问权限。
您可以在八进制值上执行二进制操作,以设置和清除权限。OR 用于设置一些关联位,而 AND 用于清除一个位。1 OR 4
等同于 5,这是因为您从 1 开始,然后设置 4 位。类似地,5 OR 4 依然等同于 5,因为 5 是 1 和 4 位的组合,此外,设置一个已经设置的位没有任何效果。
AND 的作用与 OR 正好相反。对于将放置到最终结果中的某个位位置,该位必须设置在 AND 的两侧。1 AND 1 等同于 1,因为两个 1 位都被设置。5 AND 1 也等同于 1,因为 1 位在两边设置,而 4 位只在左边设置。通过小心使用 AND 和
OR,可以确保位总是被设置或清除。
当文件创建或客户端试图更改权限时,force security mode 会强制在文件上设置位。默认情况下,这个值为 000,这意味着不强制设置任何位。如果将 force security mode 设置为 700,则意味着总是将用户位强制设置为 Read/Write/Execute,确保用户总是能阅读自己的文件,即使用户试图移除这些权限。
类似地,security mask 执行一个 AND 并清除位。默认情况下,这个模式为 777,这意味着什么都不清除。775 将从文件的 Everyone 位置清除 Write 位,阻止用户创建所有人都能写入的文件。
可以在全局或共享级别同时应用 security mask 和
force security mode。它们对于公共和组文件夹最有用,因为您可能想确保这些文件夹中的文件拥有正确的组或全局权限,且不受用户干扰。
学习
-
要重温 TDB 文件,请参阅 “学习 Linux,302(混合环境):Trivial Database 文件”(developerWorks,2011 年 3 月)。
-
如果您对 LDAP 概念感到生疏,那么请回顾 针对 LPI 考试 301 的 developerWorks 教程 中介绍的主题。
-
详细了解
umask,它非常类似于force security mask参数。这个介绍将帮助您了解二进制数学。 -
如果您比较忙,可以利用一些 OpenLDAP 服务器配置样例。
-
如果您没有接触过 PAM,那么
Linux-PAM 系统管理员指南 是一个不错的读物。
-
Samba 文档拥有关于 访问控制 的深入研究材料。
-
在 LPIC Program 站点查找 LPI 的 Linux 系统管理认证的三个级别的详细目标、任务列表和样例问题,特别是要查看 LPI-302
详细目标 和 任务和样例问题。
- 复习 developerWorks 上的整个 LPI 考试备考系列,学习 Linux 基础知识,根据 2009 年 4 月以前的 Linux 考试目标准备系统管理员认证考试。
-
针对修订后的 LPIC 考试备考资源 提供由 LPI 维护的一个其他认证培训资源列表。
- 在 Twitter 上关注 developerWorks,或者订阅 Linux tweets on developerWorks 的提要。
- 观看 developerWorks 演示中心,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
-
smbldap-tools包使得 Samba-LDAP 集成更加轻松。 -
pam_smb允许您使用 Microsoft 凭据登录 Linux 服务器。 -
获取 最新 Samba 版本,拥有最新特性。
- 要跨多个环境访问数据,可以考虑使用 IBM Tivoli Directory Integrator 试用版。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。