内容


学习 Linux,302(混合环境)

域控制

使用 Samba 进行网络身份验证

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 学习 Linux,302(混合环境)

敬请期待该系列的后续内容。

此内容是该系列的一部分:学习 Linux,302(混合环境)

敬请期待该系列的后续内容。

概述

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

  • 域成员
  • 配置首域控制器
  • 配置备份域控制器
  • 添加计算机到域中
  • 管理登录脚本
  • 管理漫游配置文件
  • 管理系统策略

本文帮助您准备 LPI 的 Mixed Environment 特性考试(302)的主题 312 下的目标 312.4。该目标的权值为 4。

先决条件

您应该拥有 Linux 命令行功能的使用知识,并了解 Samba 配置的基础知识。您应该熟悉 smb.conf 配置文件的总体结构,并能够在自己选定的编辑器中编辑它。您应该能够运行 Samba 服务器提供文件服务。

设置基本的域特性

域控制器的首要用途是管理其他计算机的身份验证。这需要 Samba 服务器从其客户端接受某些类型的身份验证数据,并做出正确的响应。 启用这些特性需要设置一些 smb.conf 选项。实际上,域控制器往往还在网络上充当另外的角色,因此您可能需要调整另外的 Samba 选项。

在进一步学习之前,您应该了解 Microsoft® Windows NT® 式的域上计算机之间的关系。 域控制器位于这个网络的核心,它的客户端可能是运行 Samba、Windows® 操作系统或一些其他软件的文件与打印服务器。 这些计算机称为域成员服务器,而且它们可以同时充当服务器(对于工作站而言)和客户端(对于域控制器而言)。 网络的架构可以影响这些关系。例如,在对等网络中,一台计算机可以同时充当域成员服务器和文件共享客户端。域控制器可以充当文件服务器,甚至是客户端。

设置强制的域控制器特性

域控制器的最基本 Samba 配置包括设置以下 smb.conf 选项:

workgroup = EXAMPLE
security = User
encrypt passwords = Yes
passdb backend = tdbsam:/etc/samba/private/passdb.tdb
domain logons = Yes
admin users = ntadmin

在这些选项中,有些可以根据您的需要进行修改,但另一些则无法修改。下面针对这些选项进行明确说明:

  • workgroup 选项用于设置 Windows NT 域名。 就是具有额外特性的工作组。
  • security 选项必须设为 User
  • encrypt passwords 选项必须设为 Yes
  • passdb backend 选项可以设为任意合法值;然而,如果您想同时使用主备域控制器, 可能需要对其进行特殊设置,请参考 配置备份域控制器 中的说明。
  • domain logons 选项必须设为 Yes
  • admin users 选项将一个或多个用户(在本例中为 ntadmin) 设为管理用户。这些用户对他们连接的任意共享都拥有 root 权限。您必须要么以这种方式设定一个管理用户,要么给您的 Samba 帐户数据库添加 root 权限,才能在您的域中添加新的计算机。

这些设置具有某些意义。特别地,您的 Samba 服务器计算机必须拥有它应当验证的所有用户的本地 Linux 帐户, 而且这些帐户必须在 Samba 密码数据库中拥有对应的数据项。一旦以这种方式配置了 Samba,它将开始接受域登录,但只针对老式的 Microsoft Windows 9x/Me 计算机或设定了 security = Server 选项的 Samba 服务器。 对于较新的 Windows 计算机或使用更加安全的 security = Domain 配置的 Samba 计算机,您必须 创建本机信任的帐户。

创建本机信任帐户

与网络上任意计算机都能加入的工作组不同,域是排他性的:要充分利用域的优点,计算机必须是域的全权成员。 从用户的角度看,域成员的主要优点是单点登录,意思是用户只需要输入一次用户名和密码,即可访问域中的任意服务器成员。 从 Samba 管理的角度看,域成员支持在域成员服务器上使用 security = Domain 配置选项。这项设置比 security = Server 设置更加安全,但完全加入域中需要另外的配置。

要完全加入一个域,计算机(域成员服务器或客户端系统)需要在域控制器上拥有自己的帐户。域控制器本身没有这个要求。这个帐户独立于可能使用计算机的任意用户的帐户,称为本机信任帐户

最好所有的本机信任帐户都使用专为此目的而保留的一个 Linux 组。下面的命令创建一个用于此目的的 trust 组:

# groupadd -r trust

创建本机的 trust 组之后,您可以继续为网络上的每个域成员(客户端或服务器)创建一个 本机信任帐户。您应该使用计算机的网络基本输入/输出系统 (NetBIOS) 名称,但要先把它转化为小写文本并在后面附上美元符号 ($)。例如,如果计算机的 NetBIOS 名称为 WEMBLETH,它的本机信任帐户名称就是 wembleth$。您可以使用 useraddsmbpasswd 命令创建这些帐户,如下所示:

# useradd -d /dev/null -M -g trust -s /bin/false wembleth$
# smbpasswd -a -m wembleth$

这个例子创建了一个叫做 wembleth$ 的本机信任帐户,将该帐户的主目录设为 /dev/null (-d /dev/null),告诉实用工具不要创建主目录 (-M),将它添加为 trust 组 (-g trust) 的成员之一,并将默认的 shell 设为 /bin/false (-s /bin/false)。第二个命令在 Samba 密码数据库中为该帐户创建了一个数据项, 指定它应该是一个本机信任帐户 (-m)。

如果您为 admin user 参数创建了一个新用户, 必须像 smbpasswd ntadmin 中那样,使用 smbpasswd 设置该用户的 Samba 密码 ,从而设置该用户的密码。这个帐户将在添加计算机到域中时用到。如果您在 Samba 下没有其他地方用到这个帐户的高权限,在将所有域客户端都加入到域中之后,可以慎重考虑注释掉 smb.conf 中的 admin users 行。

设置另外的域特性

尽管刚刚描述的特性对关键域控制器特性进行了补充,但域控制器一般在 NetBIOS 网络上还具有某些其他角色。 特别地,它们充当着域的主浏览器、Windows Internet Name Service(也叫做 NetBIOS Name Server)系统,通常还有时间服务器。 配置这些特性的方法是设置以下选项:

domain master = Yes
preferred master = Yes
os level = 65
wins support = Yes
time server = Yes

当您保存对 smb.conf 文件的改动之后,Samba 最终会检测到改动并自行重新配置。如果您想加快进程,可以 传递给服务器一个 SIGHUP 信号,或者使用发行版的 SysV 初始化脚本重新加载配置。

添加计算机到域中

至此,您的 Samba 服务器经过了充分配置,成为了域控制器,您可以开始添加计算机到域中了。 但添加计算机的方式取决于域成员服务器或域客户端上安装的操作系统。在 Windows 7 中,需要执行以下步骤:

  1. 输入以下注册表项。

    HKEY_LOCAL_MACHINE\System\CCS\Services\LanmanWorkstation\Parameters
        DWORD  DomainCompatibilityMode = 1
        DWORD  DNSNameResolutionRequired = 0

    另外,在 Windows 系统上下载 Win7_Samba3DomainMember.reg 文件,然后双击它。这个步骤对于 Windows Vista® 或更早的 Windows 操作系统不是必需的。

  2. 打开控制面板中的 System and Security 项。
  3. 单击 System
  4. 单击 Computer Name, Domain, and Workgroup Settings 标题下的 Change Settings

    Windows 打开一个系统属性窗口。

  5. 单击 Change

    Windows 将打开 Computer Name/Domain Changes 窗口,如图 1 所示。

    图 1. 通过使用 Computer Name/Domain Changes 窗口加入 Windows 中的一个域
    通过使用 Computer Name/Domain Changes 窗口加入 Windows 中的一个域
    通过使用 Computer Name/Domain Changes 窗口加入 Windows 中的一个域
  6. 选择 Domain 选项,然后在文本框内输入您的域名。
  7. 单击 OK

    Windows 将打开一个 Windows Security 窗口,如图 2 所示。

    图 2. Windows Security 窗口提示您输入管理用户名与密码
    Windows Security 窗口提示您输入管理用户名与密码。
    Windows Security 窗口提示您输入管理用户名与密码。
  8. 在窗口中输入您的 Samba 管理帐户名(通过 admin users 设定)和密码,然后单击 OK

Windows 提示您重启计算机,之后就能成功加入域中。

注意:并非所有版本的 Windows 都能加入一个域中。例如,家庭版就无法在工作组中使用。

当您已经把一台 Windows 计算机加入到您的域中并重启该计算机之后,该计算机会提示您按下 Ctrl-Alt-Del 键登录。 您应该使用一个与 Samba 服务器相关的用户名和密码进行登录。 此后,您将能够访问域中的任意计算机,而这将在您首次登录时对您使用的帐户进行授权,同时无需再次输入密码。 如果您将计算机配置为共享文件或打印机,该计算机依赖于 Samba 服务器进行身份验证。

如果您想让 Samba 服务器成为域成员,还必须把它加入到域中。为此,首先在 Samba 域成员服务器的 smb.conf 文件中设置以下选项:

password server = SERVERNAME
domain logons = No
encrypt passwords = Yes
security = Domain
domain master = No
preferred master = No
os level = 1
wins support = No

这些选项中很多都与域控制器的选项相反;您必须将它们设置为这些值,才能确保不会出现有两台计算机竞争成为主浏览器或提供 NetBIOS 名称的情况。password server 选项应该指向您计划使用的域控制器。设置 security 选项有两种方式:与在本例中一样,可以将它设置为 Domain, 以便完全加入域,或者将它设置为 Server,这样 Samba 将不会完全加入域,但会使用更简单的非域协议把它的密码请求发送给域控制器。如果设置 security = Domain,您必须通过输入以下命令完全加入域:

# net join member -U ntadmin

ntadmin 改为您为管理帐户选定的用户名。程序提示输入密码时,输入与 ntadmin 用户相关的密码。如果一切顺利,您将看到一条消息,通知您已成功加入通过 smb.conf 中 workgroup 选项指定的域中。

一旦将一台 Samba 服务器加入到域中,计算机就依赖于域控制器进行身份验证,但这只针对 Samba。 313.3 主题 Winbind 介绍了如何修改 Linux 计算机,以便使用域控制器完成非 Samba 身份验证任务。

创建域共享与用户设置

当您测试完基本的域登录功能之后,可能想更进一步。方法之一是创建一个名为 NETLOGON 的特殊域共享, 并将 Samba 配置为在域控制器上存储用户的 Windows 桌面设置。

创建 NETLOGON 共享

域登录脚本存储在 NETLOGON 共享中。每当用户登录到域中时这些脚本运行在域客户端上。 因此,您应该在 Windows 中创建这类脚本并在 Windows 中测试它们:这些不是 Linux 脚本。

NETLOGON 共享就是一个名为 NETLOGON 的普通文件共享。(目标 312.2 介绍了如何创建文件共享。)一般地,您需要限制谁能写入到 NETLOGON 共享中。典型的定义可能像下面这样:

[netlogon]
   comment = Network Logon Service
   path = /var/samba/netlogon
   guest ok = No
   read only = Yes
   write list = abe

这个例子创建了一个只读共享,并保存在 /var/samba/netlogon 中。 write list 参数赋予用户 abe 对共享的写入权限。注意,abe 必须拥有对 /var/samba/netlogon 的 Linux 写入权限。如果 Linux 权限不允许 abe 写入到这个目录,列出共享的 write list 中的用户没有任何好处。

Windows 客户端必须知道哪些脚本要从 NETLOGON 共享运行。这通过 logon script 全局参数完成。下面这个基础例子设置了一个简单的文件名:

logon script = LOGON.BAT

这个例子告诉所有客户端运行 LOGON.BAT 文件。但是有时候, 您需要为不同的客户端提供不同的登录脚本。例如,您可能对不同的客户端操作系统需要不同的脚本。下面给出了一个这样的例子:

logon script = LOGON-%a.BAT

在这个例子中,%a 这个变量针对不同的客户端操作系统具有不同的值,如 表 1 中所示。您也可以使用其他变量,目标 312.1 中对此进行了说明。如果您要使用前面的例子, Windows 7 客户端将执行名为 LOGON-Vista.BAT 的脚本,而 Windows XP 客户端将执行名为 LOGON-WinXP.BAT 的脚本。 注意,并非所有操作系统都使用网络登录脚本。例如,Linux 就不会,因此您不需要创建 LOGON-CIFSFS.BAT 脚本。

表 1. %a 变量的值
客户端类型
SambaSamba
CIFSFSLinux Common Internet File System (CIFS) 文件系统
OS2IBM® Operating System/2® (OS/2)
WfWgWindows for Workgroups
Win95Windows 95, 98 或 Me
WinNTWindows NT
Win2KMicrosoft Windows 2000
WinXPWindows XP
WinXP64Windows XP 64 位
Win2K3Windows Server® 2003
VistaWindows Vista 或 Windows 7
未知任何其他客户端

除了网络登录脚本之外,NETLOGON 共享可以包含一个系统策略 文件。此文件可以自动修改 Windows 注册表文件,帮助计算机适应域。在 Windows 9x/Me 下,这个策略文件叫做 Config.POL,在 Windows 计算机上使用 名为 Policy Editor 的工具 (Poledit.exe) 生成。在 Windows NT、 Windows 2000、Windows Server 2003、Windows XP、Windows Vista 和 Windows 7 中,该策略文件叫做 NTConfig.POL,通过点击 Start > Programs > Administrative Tools 生成。 生成这些文件已经超出了本文的范围,但您应该知道有可能需要将此文件放到 NETLOGON 共享中。

创建漫游配置文件

通常,Windows 计算机将信息存储在用户的本地桌面环境中。如果大多数时候每个用户都只使用一台计算机,这完全没有问题。 但实际上并不总是这样。例如在大学的计算机实验室中,每个人都可能使用好几台计算机进行登录。在这种情况下,就需要把用户的桌面设置存储在远程服务器上。这就是漫游配置文件 的作用。

为了在 Windows NT、Windows 2000、Windows XP、Windows Vista 与 Windows 7 上支持漫游配置文件,您必须创建一个 PROFILES 共享。 此共享一般是不可浏览的,这样它就不会出现在浏览器列表中,以免让用户搞混。在 Samba 中,还对其设置了有限的文件与目录权限,以防止 用户读取或写入别人的配置文件。但用于共享的 Linux 目录必须支持所有用户都能读写它(根据您的组策略,0777 权限可能是必要的)。 用于存储漫游配置文件的 Samba 共享可能像下面这样:

[profiles]
   comment = NT Profiles Share
   directory = /var/samba/profiles
   read only = No
   create mode = 0600
   directory mode = 0700
   browseable = No

按照惯例,这个共享是在 Samba 域控制器上创建的,但它原则上出现在一些其他的文件服务器上。 除了创建 PROFILES 共享之外,您必须告诉 Windows 它的位置。通过全局的 logon path 选项即可达到目的:

logon path = \\%L\PROFILES\%U

这个例子使用 %L 变量(当前服务器的 NetBIOS 名称)和 %U 变量 (与会话相关的用户名)作为通向漫游配置文件目录的路径的组成部分。确保将漫游配置文件存储在您创建的 PROFILES 共享中。

配置备份域控制器

Windows NT 域可以有多个域控制器,以便在其中一个出现故障时提供冗余。Windows NT 域的用法是,一个域 控制器作为主域控制器 (PDC),而其他域控制器作为备份域控制器 (BDC)。这种 配置增加了额外的复杂性,但如果您的网络高度依赖于域控制器,这是值得的。

在 Samba 中,实现 BDC 支持最好使用轻量级目录访问协议(Lightweight Directory Access Protocol ,LDAP)来存储帐户信息。LDAP 设计用于支持这类配置所需的数据库数据交换, 这样对一台 LDAP 主服务器使用 PDC 并对一台 LDAP 从服务器使用 BDC 就很合理。LDAP 服务器可以运行在与 Samba 服务器相同或不同的计算机上。 其他配置如使用一台同时具有 PDC 与 BDC 的 LDAP 服务器,是可行的但不是最优的,因为您至少失去了一些故障恢复功能,特别是当 LDAP 服务器运行在 作为域控制器之一的计算机上时。

使用 LDAP 服务器的最低 PDC 配置添加了一些 Samba 配置选项,用于识别 LDAP 服务器。修改后或新的 PDC 全局选项最少包括:

passdb backend = ldapsam://localhost:389
ldap suffix = dc=example,dc=org
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap idmap suffix = ou=Idmap
ldap admin dn = cn=ntadmin,dc=example,dc=org

这个例子告诉 Samba 使用运行在同一台计算机上的 LDAP 服务器 (passdb backend = ldapsam://localhost:389), 并确定用于识别和管理帐户信息的各种关键的 LDAP 特性。

注意:LDAP 配置本身是一个复杂的主题。在本文中,我假定您的主从 LDAP 服务器均已经过正确的配置。 查看 参考资料 部分中的链接,以了解其他的 LDAP 信息。

我建议您将 PDC 配置为使用 LDAP 主服务器,并在继续之前彻底测试这种配置。完成这个任务之后, 您就可以从一些基本的步骤开始配置 BDC:

  1. 在 BDC 计算机上输入 net rpc getsid

    此命令检索一个必须匹配 PDC 和 BDC 计算机的关键标识符。

  2. 在 BDC 上输入 smbpasswd -w mypass,其中 mypass 是 LDAP 管理密码。
  3. 同步 PDC 和 BDC 上的本地帐户数据库。

    有好几种方式可以完成这个任务,其中最简单的一种是将 /etc/passwd、/etc/group 和 /etc/shadow 从一台计算机复制到另一台计算机。如果您使用 LDAP 进行 Linux 帐户维护,这个步骤可能不是必需的。

  4. 将 NETLOGON 共享从 PDC 复制到 BDC。

    切记要同时复制 smb.conf 和共享目录中的共享定义。您应该定期同步共享目录,以便复制随着时间推移可能出现的改动。

完成这些步骤之后,您可以在 smb.conf 中创建 BDC 配置:

passdb backend= ldapsam:ldap://slave-ldap.example.org
domain master = No
domain logons = Yes
os level = 64
ldap suffix = dc=example,dc=org
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap idmap suffix = ou=Idmap
ldap admin dn = cn=ntadmin,dc=example,dc=org
idmap backend = ldap:ldap://master-ldap.example.org
idmap uid = 10000-20000
idmap gid = 10000-20000

这些选项让 BDC 服从 PDC 的主浏览器选择,以便使用 LDAP 从服务器 (slave-ldap.example.org) 作为其密码数据库,同时使用 LDAP 主服务器 (master-ldap.example.org) 来存储 Linux 与 Windows 帐户信息之间的映射信息。

建立域间信任关系

在大型组织中,不同部门可能拥有自己的 Windows NT 域。这种配置支持每个部门维护自己的帐户, 但可能会限制各个部门利用彼此资源的能力。例如,两个物理位置靠近的部门可能想让各自的用户共享它们的打印机。 这种跨域的资源共享可以通过建立域间信任关系 来实现,简称为信任关系

信任关系有两个重要属性,您应该牢牢记住。首先,它们是非传递的,这表示它们 对显式配置这种信任关系的域有效。 例如,如果 PHYSICS 域信任 GEOLOGY,而 GEOLOGY 信任 BIOLOGY,PHYSICS 不会自动信任 BIOLOGY。其次,信任关系是单向的。 例如,PHYSICS 可以信任 GEOLOGY,但 GEOLOGY 不一定信任 PHYSICS。要启用双向的信任关系,您必须将每个域配置为信任其他域。

为了配置域间信任关系,首先必须正确配置每个域自己的的权限。第一个域是信任域,其他域应该能够访问这个域上的资源, 而这些其他域就是受信域。例如,假设 PHYSICS 有一台宽行打印机,而 GEOLOGY 的用户应该都能访问它。那么 PHYSICS 就是信任域,而 GEOLOGY 是受信域。要开始配置信任关系,您必须首先在信任域(PHYSICS)上为受信域(GEOLOGY)创建 Linux 和 Samba 帐户:

# useradd -d /dev/null -M -g trust -s /bin/false geology$
# smbpasswd -a -i geology

注意,使用 useradd 创建 Linux 帐户时,您必须在最后包含一个美元符号 ($),而在使用 smbpasswd 创建 Samba 帐户时则不需要。 smbpasswd 命令提示您为域间信任帐户输入密码。记住这个密码,因为您很快就需要再次输入它。 如果受信域控制器是信任域的一个普通成员,GEOLOGY 域控制器将使用这个帐户来支持它自己的成员访问 PHYSICS 资源。

凭借在信任域控制器上创建的域间信任帐户,您现在可以配置受信域控制器来使用该帐户:

# net rpc trustdom establish physics

在受信域(本例中为 GEOLOGY)的 Linux 成员上输入此命令。您将被要求输入密码;请输入您在信任域上为 smbpasswd 命令 输入的相同密码。如果一切顺利,GEOLOGY 的成员现在将能够访问 PHYSICS 上的服务器。如果您想要建立双向信任关系,就必须 重复这些步骤,调转这两个域的角色。

如果您想要终止一种域间信任关系,可以在受信域上运行以下命令:

# net rpc trustdom revoke physics

另外,您可以在信任域上输入以下命令:

# net rpc trustdom del geology

下期简介

下一个考试目标 312.5 将讨论 Samba Web 管理工具,该工具支持基于 Web 的 Samba 配置。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=767374
ArticleTitle=学习 Linux,302(混合环境): 域控制
publish-date=08162011