![NFSv4 + SSSD + Active Directory:禁用 ldap_id_mapping 时“无人”权限](https://linux22.com/image/707675/NFSv4%20%2B%20SSSD%20%2B%20Active%20Directory%EF%BC%9A%E7%A6%81%E7%94%A8%20ldap_id_mapping%20%E6%97%B6%E2%80%9C%E6%97%A0%E4%BA%BA%E2%80%9D%E6%9D%83%E9%99%90.png)
我正在尝试根据 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 报告“无法在域中找到”错误时,我意识到了这一点。
我仍然不清楚为什么当sss
nsswitch.conf 中列出的密码和组数据库之一是 db 时,NSS 无法完成工作,但上述更改似乎有效。