NFSv4 + SSSD + Active Directory:禁用 ldap_id_mapping 时“无人”权限

NFSv4 + SSSD + Active Directory:禁用 ldap_id_mapping 时“无人”权限

我正在尝试根据 RedHat 的当前建议,使用 SSSD 访问 Active Directory。在这种情况下,NFS 服务器是 NAS 设备,它处理 user@domain 帐户与从 AD/LDS 提取的 UID/GID 之间的用户映射。我已禁用 SSSD 中的 ID 映射,因为 NAS 没有相同的哈希+模数方法来计算“自制”ID。

在当前状态下,NAS 可识别文件权限的用户和组所有权,并按预期执行这些权限。但是,ls客户端的输出将显示nobody nobody域用户拥有的任何文件/文件夹。

[root@nfsclient ~]# ls -al /mnt/nfs4test/
total 0
drwxr-xr-x. 1 nobody nobody  0 Jul 17 10:46 .
drwxr-xr-x. 3 root   root   22 Jul 17 10:47 ..

当 idmapd 和 sssd 的日志详细程度达到最大值时,我看到的唯一表明存在问题的事件是: Jul 17 11:48:23 nfsclient nfsidmap[10601]: nss_getpwnam: name 'nfsadmin' not found in domain 'testdomain.local'

我还通过数据包捕获确认了查找答复中所有者和组 (而非 ID) 返回了预期的用户/组名称字符串:

fattr4_owner: [email protected]
fattr4_owner_group: Domain [email protected]

环境包括 2012R2 DC、CentOS 7.3 客户端和作为服务器的供应商专有(基于 CentOS)NAS 设备。除了安装必需的软件包和 IP / NTP 配置外,以下是我在客户端上的配置步骤:

  • 添加Domain = testdomain.local到 /etc/idmapd.conf
  • 加入 AD 域realm join testdomain.local -U nfsadmin
  • 允许所有域用户的 SSH 访问(领域允许)
  • ldap_id_mapping = False在 /etc/sssd/sssd.conf 中设置
  • 启用/启动/重新启动 sssd.service rpcgssd rpcidmapd 和 nfs-secure
  • 使用挂载导出sec=sys将所有权更改为域用户
  • 使用 sec=krb5 重新挂载

无论使用 sec=sys 还是 sec=krb5、root 还是域帐户,ls 输出都是相同的。

我在搜索中发现的唯一适用的解决方案是需要为用户创建本地帐户,但这似乎违背了 AD 集成的目的。我希望可以创建一个新的 AD 用户,将他们添加到适当的组中以获得访问权限,设置 UID/GID,然后该用户在通过 SSH 连接到客户端计算机后应该能够访问导出的文件。

客户端配置纯粹是从 Active Directory 中提取数据(只有服务器/NAS 使用 AD/LDS)。活动目录中的 UID/GID 是通过 PowerShell 手动填充的(例如Get-ADUser "nfsadmin" | Set-AdUser -replace @{uidNumber=10001}- 尝试使其与 2016 兼容并避免使用 adminui/nis 或 UNIX 属性选项卡,即使我目前正在 2012R2 上进行测试)

如何让 NSS / nfsidmap 正确转换服务器返回的域用户/组名?

我非常希望有一种不需要为每个用户手动创建本地帐户的方法,这样扩展到数千个用户就不会变得非常麻烦。此外,强制服务器(本例中为 NAS 设备)返回 ID 而不是名称是不可能的。

答案1

在这种情况下,idmapd 默认使用 nsswitch,但上述文档中详述的 AD 集成方法没有提及任何 idmapd.conf 修改。

idmapd.conf 中的注释指出“分布式方法包括 nsswitch、umich_ldap 和 static。”然而,这并不是一个完整的插件列表,在这种情况下应该使用系统安全服务 (sss)。

/etc/idmapd.conf:

[General]
Domain = testdomain.local

[Translation]
Method = sss

当我意识到当 ldap_id_mapping 仍然启用时 sss 能够完美地处理映射(但导致 NAS 设备的服务器端映射问题),并且 nss_getpwnam 报告“无法在域中找到”错误时,我意识到了这一点。

我仍然不清楚为什么当sssnsswitch.conf 中列出的密码和组数据库之一是 db 时,NSS 无法完成工作,但上述更改似乎有效。

相关内容