学习 Linux,302(混合环境): 身份验证和授权

身份验证机制和访问控制配置

本文旨在帮助系统管理员准备 Linux Professional Institute Certification 考试 LPI-302,从中可了解如何设置和存储密码,集成 Samba 和 LDAP,以及使用 ACL 保护您的 Linux 安装。

Sean A. Walberg, 高级网络工程师

Sean Walberg 是一位网络工程师,撰写了两本关于网络的图书。他的工作经历跨几个行业,其中包括医疗保健和媒体。



2011 年 12 月 19 日

关于本系列

本系列文章帮助您了解 Linux 系统管理任务相关知识。您可以使用本系列文章的资料准备 Linux Professional Institute Certification level 3 (LPIC-3) 考试

参见我们的 学习 Linux, 302(混合环境):LPI-302 路线图,查看本系列中各篇文章的介绍和链接。路线图目前仍在更新中,目前反映的最新内容是 LPIC-3 考试的最新目标(2011 年 3 月)。在我们完成每篇文章后,都会将其添加到路线图中。

在本文中,将学习以下概念:

  • 本地密码数据库设置
  • 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 身份验证机制

关于可选的 LPI-302 考试

与其他许多认证一样,Linux Professional Institute Certification (LPIC) 提供多个不同级别,每个级别都比前一个级别要求更多知识和经验。LPI-302 考试是 LPIC 层级的第三级中的一个可选特性考试,要求具有高级 Linux 系统管理知识。

要通过 LPIC-3 认证,您必须通过前两个一级考试(101 和 102),两个二级考试(201 和 202),以及 LPIC-3 核心考试 (301)。到达这个级别后,才能参加一些可选特性考试,比如 LPI-302。

Samba 提供了几种方法来通过密码后端 存储密码和帐户信息。有些方法依赖于磁盘存储;有些依赖于基于网络的方法。另外,Samba 向 Linux 服务器提供了通过 Samba 身份验证系统实现登录身份验证的机制。

由于 Samba 已经存在近了 20 年,因此它携带了一些技术包袱 (technical baggage)。较旧的身份验证系统仍然受到支持,但新技术已经替代了旧技术。当您阅读关于 Samba 的文档时,就会发现一些对这些旧系统的引用。一些命令行工具拥有类似于某个特殊技术的名称,这进一步加剧了名称混淆。

尽管名称为密码后端,但后端中存储的数据除了密码外还包括帐户数据和其他属性。数据本身也可能存储在一个 LDAP 服务器中,Samba 密码后端的作用是充当 Samba 和 LDAP 之间的中介。

更有趣的是,Microsoft 设备期望密码散列表使用某种不同于 UNIX 密码格式的格式。将密码散列化 (hashed) 意味着使用单向方式对它们进行加密;所以无法在 UNIX 和 Samba 密码格式之间进行转换。因此,无法在 UNIX 密码数据库之外对 Samba 客户端进行身份验证。

本地密码数据库选项

构建您自己的提要

您可以构建一个 RSS、Atom 或 HTML 提要,以便在我们添加新文章或更新内容时收到通知。访问 developerWork RSS 提要。选择 Linux 作为专区,Articles 作为类型,输入 Linux Professional Institute 作为关键字。然后选择您想要的提要类型。

本地密码数据库 指那些将信息存储在服务器上而不是通过网络进行身份验证的密码后端。它们虽然不是性能最好的选项,但是简单易用。

您可能在某些文档中看到过对纯文本 后端的引用。多年以前,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 数据库

在进行新的安装时,通常不会选择使用 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 数据库

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 源代码中的数据结构的布局。


LDAP 身份验证

TDB 文件格式可以提供较好的性能,适合大多数小环境。要将该格式扩展到 TDB 文件之外,则必须针对 LDAP 服务器进行身份验证。由于 LDAP 采用了树型结构,所以它适合进行身份验证。Microsoft 的 Active Directory® Domain Services 也构建于 LDAP 基础之上。

设置 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

可以通过配置 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 包中的其他许多工具能够帮助您管理用户并规划更大的迁移。


针对 Samba 的 UNIX 身份验证

Linux 和 Microsoft 之间的单点登录 或密码同步很难实现,因为这两个操作系统以不同的方式存储密码。smbldap-tools 包通过同时在两个系统上工作来绕过这个问题。另一种办法是将密码控制权交给 Microsoft 网络。

Linux 支持一个名为可插拔身份验证模块 (Pluggable Authentication Module, PAM) 的概念。PAM 允许管理员配置如何验证服务,并在应用程序不知情的情况下,通过操作配置文件来更改身份验证过程。应用程序调用 PAM 库对用户进行身份验证。PAM 会参考配置文件,以获取针对特定服务对用户进行身份验证的指令。然后将身份验证成功或失败的信息返回给应用程序。

随着时间推移,人们编写出了许多身份验证模块,以支持针对其他服务(从本地密码文件到 LDAP、Kerberos,甚至是 Microsoft 网络)的身份验证。提供这项服务的模块名为 pam_smb

配置 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 modesecurity 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 位只在左边设置。通过小心使用 ANDOR,可以确保位总是被设置或清除。

对 Samba 应用位操作

当文件创建或客户端试图更改权限时,force security mode 会强制在文件上设置位。默认情况下,这个值为 000,这意味着不强制设置任何位。如果将 force security mode 设置为 700,则意味着总是将用户位强制设置为 Read/Write/Execute,确保用户总是能阅读自己的文件,即使用户试图移除这些权限。

类似地,security mask 执行一个 AND 并清除位。默认情况下,这个模式为 777,这意味着什么都不清除。775 将从文件的 Everyone 位置清除 Write 位,阻止用户创建所有人都能写入的文件。

可以在全局或共享级别同时应用 security maskforce security mode。它们对于公共和组文件夹最有用,因为您可能想确保这些文件夹中的文件拥有正确的组或全局权限,且不受用户干扰。

参考资料

学习

获得产品和技术

讨论

  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=781694
ArticleTitle=学习 Linux,302(混合环境): 身份验证和授权
publish-date=12192011