Red Hat Training

A Red Hat training course is available for RHEL 8

3.4. 了解并配置 Samba ID 映射

Windows 域通过唯一安全标识符(SID)来区分用户和组。但是,Linux 需要为每个用户和组群有唯一的 UID 和 GID。如果您以域成员身份运行 Samba,winbindd服务负责向操作系统提供域用户和组的信息。

要启用winbindd服务来向 Linux提供唯一的用户和组ID,您必须在/etc/samba/smb.conf文件中为以下情况配置 ID 映射:

  • 本地数据库(默认域)
  • Samba 服务器所属的 AD 或 NT4 域
  • 每个用户必须能够访问这个 Samba 服务器上的资源的可信域

Samba 为特定配置提供不同的 ID 映射后端。最常用的后端是:

后端使用案例

tdb

*仅限默认域

ad

仅限 AD 域

rid

AD 和 NT4 域

autorid

AD、NT4 和 * 默认域

3.4.1. 规划 Samba ID 范围

无论您在 AD 中是否存储了 Linux UID 和 GID,还是将 Samba 配置为生成它们,每个域配置都需要一个唯一的 ID 范围,其不得与任何其他域重叠。

警告

如果您设置了重叠 ID 范围,Samba 无法正常工作。

例 3.1. 唯一的 ID 范围

以下显示了默认(*)、AD-DOMTRUST-DOM域的非重叠 ID 映射范围。

[global]
...
idmap config * : backend = tdb
idmap config * : range = 10000-999999

idmap config AD-DOM:backend = rid
idmap config AD-DOM:range = 2000000-2999999

idmap config TRUST-DOM:backend = rid
idmap config TRUST-DOM:range = 4000000-4999999
重要

每个域只能分配一个范围。因此,在域范围之间有足够的空间。这可让您在域扩展后扩展范围。

如果您稍后给某个域分配了一个不同的范围,那么之前由这些用户和组创建的文件和目录的所有权将会丢失。

3.4.2. * 默认域

在域环境中,您可以为以下每个情况添加一个 ID 映射配置:

  • Samba 服务器所属的域
  • 每个可以访问 Samba 服务器的可信域

但是,对于所有其他对象,Samba 会从默认域分配 ID。这包括:

  • 本地 Samba 用户和组
  • Samba 内置帐户和组,如BUILTIN\Administrators
重要

您必须按照描述配置默认域,以便使 Samba 正确运行。

默认域后端必须可写,才能永久存储分配的 ID。

对于默认域,您可以使用以下后端之一:

tdb

当您将默认域配置为使用tdb后端时,请设置一个足够大的 ID 范围,以包含将来要创建的对象,这些对象不属于已定义的域ID映射配置的一部分。

例如,在/etc/samba/smb.conf文件中的[global]部分中设置以下内容:

idmap config * : backend = tdb
idmap config * : range = 10000-999999

详情请查看 使用 TDB ID 映射后端

autorid

当您将默认域配置为使用autorid后端时,为域添加额外的 ID 映射配置是可选的。

例如,在/etc/samba/smb.conf文件中的[global]部分中设置以下内容:

idmap config * : backend = autorid
idmap config * : range = 10000-999999

详情请查看 使用 autorid ID 映射后端

3.4.3. 使用 tdb ID 映射后端

winbindd服务默认使用可写的tdb ID 映射后端来存储安全标识符(SID)、UID 以及 GID 映射表。这包括本地用户、组和内置主体。

仅将此后端用于*默认域。例如:

idmap config * : backend = tdb
idmap config * : range = 10000-999999

其它资源

3.4.4. 使用 ad ID 映射后端

您可以将 Samba AD 成员配置为使用 ad ID 映射后端。

ad ID 映射后端实现了一个只读 API,以便从 AD 读取帐户和组信息。它具有以下优点:

  • 所有用户和组群设置都集中存储在 AD 中。
  • 使用这个后端的所有 Samba 服务器中的用户和组群 ID 是一致的。
  • ID 不会存储在本地数据库中(本地数据库可能会被损坏),因此文件所有者不会丢失。
注意

ad ID 映射后端不支持具有单向信任的Active Directory域。如果您使用单向信任在 Active Directory 中配置域成员,请使用以下一种 ID 映射后端: tdbdeleteautorid

后端从 AD 读取以下属性:

AD 属性名称对象类型映射到

sAMAccountName

用户和组群

用户和组名称,取决于对象

uidNumber

用户

用户 ID(UID)

gidNumber

组 ID(GID)

loginShell [a]

用户

用户 shell 的路径

unixHomeDirectory [a]

用户

用户主目录的路径

primaryGroupID [b]

用户

主组群 ID

[a] 如果您设置了 idmap config DOMAIN:unix_nss_info = yes,则 Samba 只读取这个属性。
[b] 如果您设置了 idmap config DOMAIN:unix_primary_group = yes,则 Samba 只读取这个属性。

先决条件

  • 用户和组必须在 AD 中设置唯一的 ID,并且 ID 必须在 /etc/samba/smb.conf 文件中配置的范围之内。其ID 不在范围之内的对象在 Samba 服务器上不可用。
  • 用户和组必须在 AD 中设置所有必需的属性。如果缺少所需的属性,该用户或组将无法在 Samba 服务器中可用。所需的属性取决于您的配置。
  • 已安装 Samba。
  • Samba 配置(除了ID 映射)位于 /etc/samba/smb.conf 文件中。

流程

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. 如果默认域(*)不存在,请为其添加 ID 映射配置。例如:

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999
    2. 为 AD 域启用 ad ID 映射后端:

      idmap config DOMAIN : backend = ad
    3. 设置分配给 AD 域中用户和组的 ID 范围。例如:

      idmap config DOMAIN : range = 2000000-2999999
      重要

      范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围

    4. 当从AD读取属性时,使用RFC 2307模式来设置 Samba:

      idmap config DOMAIN : schema_mode = rfc2307
    5. 要让 Samba 从对应的 AD 属性读取登录 shell 和用户主目录的路径,请设置:

      idmap config DOMAIN : unix_nss_info = yes

      或者,您可以设置适用于所有用户的统一的域范围的主目录路径和登录 shell。例如:

      template shell = /bin/bash
      template homedir = /home/%U
    6. 默认情况下,Samba 使用用户对象的 primaryGroupID 属性作为 Linux 上用户的主组。或者,您可以将 Samba 配置为使用gidNumber属性中设置的值:

      idmap config DOMAIN : unix_primary_group = yes
  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • * 默认域
  • smb.conf(5) and idmap_ad(8) man pages
  • smb.conf(5) 手册页中的 VARIABLE SUBSTITUTIONS 部分

3.4.5. 使用网格 ID 映射后端

您可以将 Samba 域成员配置为使用 rid ID 映射后端。

Samba 可以使用 Windows SID 的相对标识符(RID),以便在 Red Hat Enterprise Linux 上生成 ID。

注意

RID 是 SID 的最后部分。例如,如果用户的 SID 是S-1-5-21-5421822485-1151247151-421485315-30014,那么30014是对应的 RID。

ridID映射后端实施了一个只读 API,以便根据 AD 和 NT4 域的算法映射方案计算帐户和组信息。当配置后端时,您必须在 idmap config DOMAIN : range参数中设置最低和最高的 RID。Samba 不会映射比这个参数中设置低或更高 RID 的用户或组。

重要

作为只读后端,rid无法分配新的ID,例如为BUILTIN组。因此,请勿将此后端用于 * 默认域。

使用网格后端的好处

  • 所有在配置范围内具有 RID 的域用户和组都会自动在域成员中可用。
  • 您不需要手动分配 ID、主目录和登录 shell。

使用网格后端的缺陷

  • 所有域用户可以获得相同的登录 shell 和主目录。但是,您可以使用变量。
  • 如果它们都使用具有相同ID范围设置的rid后端,那么用户和组ID只在 Samba 域成员之间是相同的。
  • 您不能阻止单独的用户或组在域成员中可用。只有超出配置范围以外的用户和组才会包括。
  • 根据 winbindd 服务用于计算 ID 的公式,如果不同域中的对象有相同的 RID,那么在多域环境中可能会有重复ID的事情发生 。

先决条件

  • 已安装 Samba。
  • Samba 配置(除了ID 映射)位于 /etc/samba/smb.conf 文件中。

流程

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. 如果默认域(*)不存在,请为其添加 ID 映射配置。例如:

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999
    2. 为域启用ridID映射后端:

      idmap config DOMAIN : backend = rid
    3. 设置一个足够大的范围,以包括将来将要分配的所有RID。例如:

      idmap config DOMAIN : range = 2000000-2999999

      Samba 会忽略此域中其RID不在范围内的用户和组。

      重要

      范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围

    4. 设置分配给所有映射用户的 shell 和主目录路径。例如:

      template shell = /bin/bash
      template homedir = /home/%U
  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • * 默认域
  • smb.conf(5) 手册页中的 VARIABLE SUBSTITUTIONS 部分
  • 从 RID 中本地 ID 的计算,请查看 idmap_rid(8) 手册页

3.4.6. 使用自动 ID 映射后端

您可以将 Samba 域成员配置为使用 autorid ID 映射后端。

autorid后端的工作方式与ridID 映射后端类似,但可以为不同的域自动分配 ID。这可让您在以下情况下使用autorid后端:

  • 仅用于*默认域
  • 对于*默认域和附加域,不需要为每个附加域创建 ID 映射配置
  • 只适用于特定域
注意

如果您对默认域使用autorid,为域添加额外的 ID 映射配置是可选的。

本节的部分内容来自在 Samba Wiki 中发布的 idmap config autorid 文档。许可证: CC BY 4.0。作者和贡献者:请参阅 Wiki页面上的历史选项卡。

使用自动扩展后端的好处

  • 所有在配置范围内计算 UID 和 GID 的域用户和组都会在域成员中自动可用。
  • 您不需要手动分配 ID、主目录和登录 shell。
  • 没有重复的 ID,即使多域环境中的多个对象有相同的 RID。

缺陷

  • 在 Samba 域成员中用户和组群 ID 不相同。
  • 所有域用户可以获得相同的登录 shell 和主目录。但是,您可以使用变量。
  • 您不能阻止单独的用户或组在域成员中可用。只有计算 UID 或 GID 不在配置范围内的用户和组才会包括。

先决条件

  • 已安装 Samba。
  • Samba 配置(除了ID 映射)位于 /etc/samba/smb.conf 文件中。

流程

  1. 编辑 /etc/samba/smb.conf 文件中的 [global] 部分:

    1. * 默认域启用autoridID映射后端:

      idmap config * : backend = autorid
    2. 设置一个足够大的范围来为所有现有和将来的对象分配 ID。例如:

      idmap config * : range = 10000-999999

      Samba 忽略在此域中计算 ID 不在范围范围内的用户和组。

      警告

      设置范围并开始使用 Samba 后,您只能增加范围的上限。对范围的任何其他变化都可能会导致分配新的 ID,从而会丢失文件的所有者信息。

    3. 另外,还可设置范围大小。例如:

      idmap config * : rangesize = 200000

      Samba 会为每个域的对象分配这个连续的ID号,直到 idmap config * : range参数中设置的范围内的所有ID分配完。

      注意

      如果设置了 rangesize,则需要相应地调整范围。范围必须是 rangesize 的倍数。

    4. 设置分配给所有映射用户的 shell 和主目录路径。例如:

      template shell = /bin/bash
      template homedir = /home/%U
    5. 另外,还可为域添加额外的 ID 映射配置。如果没有针对单个域的配置,Samba 则使用之前配置的 * 默认域中的 autorid 后端设置来计算 ID。

      重要

      范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围

  2. 验证/etc/samba/smb.conf文件:

    # testparm
  3. 重新载入 Samba 配置:

    # smbcontrol all reload-config

其它资源

  • idmap_autorid(8) 手册页中的 THE MAPPING FORMULAS 部分
  • idmap_autorid(8) 手册页中的 rangesize 参数描述
  • smb.conf(5) 手册页中的 VARIABLE SUBSTITUTIONS 部分