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 域启用
ad
ID 映射后端: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
其它资源
- * 默认域
-
您系统上的
smb.conf (5)
和idmap_ad (8)
手册页 -
系统上的
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。
rid
ID映射后端实施了一个只读 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
为域启用
rid
ID映射后端:idmap config DOMAIN : backend = rid
设置一个足够大的范围,以包括将来将要分配的所有RID。例如:
idmap config DOMAIN : range = 2000000-2999999
Samba 会忽略此域中其RID不在范围内的用户和组。
重要范围不得与这个服务器上的任何其他域配置重叠。此外,范围必须足够大,以便包含将来分配的所有 ID。详情请查看 规划 Samba ID 范围。
设置分配给所有映射用户的 shell 和主目录路径。例如:
template shell = /bin/bash template homedir = /home/%U
验证
/etc/samba/smb.conf
文件:# testparm
重新载入 Samba 配置:
# smbcontrol all reload-config
其它资源
- * 默认域
-
系统上的
smb.conf (5)
手册页中的VARIABLE SUBSTITUTIONS
部分 -
RID 中本地 ID 的计算,请查看系统中的
idmap_rid (8)
手册页
3.4.6. 使用自动 ID 映射后端
您可以将 Samba 域成员配置为使用 autorid
ID 映射后端。
autorid
后端的工作方式与rid
ID 映射后端类似,但可以为不同的域自动分配 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]
部分:为
*
默认域启用autorid
ID映射后端:idmap config * : backend = autorid
设置一个足够大的范围来为所有现有和将来的对象分配 ID。例如:
idmap config * : range = 10000-999999
Samba 忽略在此域中计算 ID 不在范围范围内的用户和组。
警告设置范围并开始使用 Samba 后,您只能增加范围的上限。对范围的任何其他变化都可能会导致分配新的 ID,从而会丢失文件的所有者信息。
可选:设置范围大小。例如:
idmap config * : rangesize = 200000
Samba 会为每个域的对象分配这个连续的ID号,直到
idmap config * : range
参数中设置的范围内的所有ID分配完。注意如果设置了 rangesize,则需要相应地调整范围。范围必须是 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
其它资源
-
系统上的
idmap_autorid (8)
手册页中的THE MAPPING FORMULAS
部分 -
系统上的
idmap_autorid (8)
手册页中的rangesize
参数描述 -
系统上的
smb.conf (5)
手册页中的VARIABLE SUBSTITUTIONS
部分