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 映射后端。最常用的后端是:
| 后端 | 使用案例 |
|---|---|
|
|
|
|
| 仅限 AD 域 |
|
| AD 和 NT4 域 |
|
|
AD、NT4 和 |
3.4.1. 规划 Samba ID 范围 复制链接链接已复制到粘贴板!
无论您在 AD 中是否存储了 Linux UID 和 GID,还是将 Samba 配置为生成它们,每个域配置都需要一个唯一的 ID 范围,其不得与任何其他域重叠。
如果您设置了重叠 ID 范围,Samba 无法正常工作。
例 3.1. 唯一的 ID 范围
以下显示了默认(*)、AD-DOM和TRUST-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 映射后端: tdb、delete 或 autorid。
后端从 AD 读取以下属性:
| AD 属性名称 | 对象类型 | 映射到 |
|---|---|---|
|
| 用户和组群 | 用户和组名称,取决于对象 |
|
| 用户 | 用户 ID(UID) |
|
| 组 | 组 ID(GID) |
|
| 用户 | 用户 shell 的路径 |
|
| 用户 | 用户主目录的路径 |
|
| 用户 | 主组群 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文件中。
流程
编辑
/etc/samba/smb.conf文件中的[global]部分:如果默认域(
*)不存在,请为其添加 ID 映射配置。例如:idmap config * : backend = tdb idmap config * : range = 10000-999999为 AD 域启用
adID 映射后端:idmap config DOMAIN : backend = ad设置分配给 AD 域中用户和组的 ID 范围。例如:
idmap config DOMAIN : range = 2000000-2999999重要范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围。
当从AD读取属性时,使用RFC 2307模式来设置 Samba:
idmap config DOMAIN : schema_mode = rfc2307要让 Samba 从对应的 AD 属性读取登录 shell 和用户主目录的路径,请设置:
idmap config DOMAIN : unix_nss_info = yes或者,您可以设置适用于所有用户的统一的域范围的主目录路径和登录 shell。例如:
template shell = /bin/bash template homedir = /home/%U默认情况下,Samba 使用用户对象的
primaryGroupID属性作为 Linux 上用户的主组。或者,您可以将 Samba 配置为使用gidNumber属性中设置的值:idmap config DOMAIN : unix_primary_group = yes
验证
/etc/samba/smb.conf文件:# testparm重新载入 Samba 配置:
# smbcontrol all reload-config
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文件中。
流程
编辑
/etc/samba/smb.conf文件中的[global]部分:如果默认域(
*)不存在,请为其添加 ID 映射配置。例如:idmap config * : backend = tdb idmap config * : range = 10000-999999为域启用
ridID映射后端:idmap config DOMAIN : backend = rid设置一个足够大的范围,以包括将来将要分配的所有RID。例如:
idmap config DOMAIN : range = 2000000-2999999Samba 会忽略此域中其RID不在范围内的用户和组。
重要范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围。
设置分配给所有映射用户的 shell 和主目录路径。例如:
template shell = /bin/bash template homedir = /home/%U
验证
/etc/samba/smb.conf文件:# testparm重新载入 Samba 配置:
# smbcontrol all reload-config
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文件中。
流程
编辑
/etc/samba/smb.conf文件中的[global]部分:为
*默认域启用autoridID映射后端:idmap config * : backend = autorid设置一个足够大的范围来为所有现有和将来的对象分配 ID。例如:
idmap config * : range = 10000-999999Samba 忽略在此域中计算 ID 不在范围范围内的用户和组。
警告设置范围并开始使用 Samba 后,您只能增加范围的上限。对范围的任何其他变化都可能会导致分配新的 ID,从而会丢失文件的所有者信息。
可选:设置范围大小。例如:
idmap config * : rangesize = 200000Samba 会为每个域的对象分配这个连续的ID号,直到
idmap config * : range参数中设置的范围内的所有ID分配完。注意如果设置了 rangesize,则需要相应地调整 range。range 必须是 rangesize 的倍数。
设置分配给所有映射用户的 shell 和主目录路径。例如:
template shell = /bin/bash template homedir = /home/%U可选:为域添加额外的 ID 映射配置。如果没有针对单个域的配置,Samba 则使用之前配置的
*默认域中的autorid后端设置来计算 ID。重要范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围。
验证
/etc/samba/smb.conf文件:# testparm重新载入 Samba 配置:
# smbcontrol all reload-config