简短问题描述
该问题是关于 NFSv4 中的 id 映射出错。
NFS 服务器:Synology DS,带有 DSM 5.2。
客户端:常规的 FC22 机器,它自动将上面导出的文件夹之一挂载为 /home。
两台机器都是 freeIPA 域的注册客户端,因此使用 freeIPA 服务器作为 DNS 和 LDAP 服务器。
当 LDAP 用户登录客户端时,它会找到已挂载的文件夹。因此挂载成功。但是,文件的所有权被映射为nobody:nobody
。我知道这个“无人问题”并不新鲜,但到目前为止,我找到的解决方案都无法解决这个问题。
LDAP用户登录和文件触摸
$ ssh ldapuser1@client1
ldapuser1@client1's password:
-bash-4.3$ id
uid=1172000004(ldapuser1) gid=1172000004(ldapuser1) groups=1172000004(ldapuser1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
ldapuser1
可以正确登录并且具有uid 1172000004。
-bash-4.3$ pwd
/home/ldapuser1
-bash-4.3$ ls -lan
total 8
drwxrwxrwx. 2 1172000004 1172000004 4096 18 aug 17:34 .
drwxr-xr-x. 3 0 0 0 18 aug 18:33 ..
LDAP 用户正确进入了之前创建并分配给他的主目录。但任何新文件都会获得错误的所有权:
-bash-4.3$ touch a
-bash-4.3$ ls -lan
total 8
drwxrwxrwx. 2 1172000004 1172000004 4096 18 aug 18:41 .
drwxr-xr-x. 3 0 0 0 18 aug 18:33 ..
-rwxrwxrwx. 1 99 100 0 18 aug 18:42 a
请注意,99:100 在guest:users
服务器上。服务器上的文件idmapd.conf
指示映射nobody:nobody
到guest:users
。
服务器配置
$ exportfs -v
/volume1/shared_homes xxx.xxx.0.0/24(rw,async,no_root_squash,no_subtree_check,insecure_locks,anonuid=1025,anongid=100,sec=krb5,rw,no_root_squash,no_all_squash)
$ klist -k /etc/nfs/krb5.keytab
Keytab name: FILE:/etc/nfs/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
5 nfs/[email protected]
5 nfs/[email protected]
5 nfs/[email protected]
5 nfs/[email protected]
$ cat /etc/idmapd.conf
[General]
Domain=hq.example.com
Verbosity=10
[Mapping]
Nobody-User=guest
Nobody-Group=users
[Translation]
Method=nsswitch
GSS-Methods=static,synomap
[Static]
$ cat /etc/nsswitch.conf
passwd: files ldap winbind
shadow: files ldap winbind
group: files ldap winbind
osts: files dns wins
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
netgroup: files
publickey: nisplus
automount: files
aliases: files
客户端配置
$ automount -s
Mount point: /home
source(s):
instance type(s): sss
map: auto.home
* | -fstype=nfs4,rw,sec=krb5,soft,rsize=8192,wsize=8192 nfs-server.hq.example.com:/volume1/shared_homes/&
$ df
nfs-server.hq.example.com:/volume1/shared_homes/ldapuser1 11609721368 2208608120 9400994464 20% /home/ldapuser1
$ cat /etc/idmapd.conf
[General]
Domain=hq.example.com
$ cat /etc/nsswitch.conf
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files sss
netgroup: files sss
publickey: nisplus
automount: files sss
aliases: files nisplus
sudoers: files sss
$ cat /etc/sysconfig/nfs | egrep -v "^#"
RPCNFSDARGS=""
RPCMOUNTDOPTS=""
STATDARG=""
SMNOTIFYARGS=""
RPCIDMAPDARGS=""
RPCGSSDARGS="-vvv"
GSS_USE_PROXY="yes"
RPCSVCGSSDARGS="-vvv"
BLKMAPDARGS=""
SECURE_NFS=yes
日志服务器
Aug 18 18:50:59 nfs-server idmapd[14622]: nfsdcb: authbuf=gss/krb5 authtype=user
Aug 18 18:50:59 nfs-server idmapd[14622]: nfs4_uid_to_name: calling nsswitch->uid_to_name
Aug 18 18:50:59 nfs-server idmapd[14622]: nfs4_uid_to_name: nsswitch->uid_to_name returned 0
Aug 18 18:50:59 nfs-server idmapd[14622]: nfs4_uid_to_name: final return value is 0
Aug 18 18:50:59 nfs-server idmapd[14622]: Server : (user) id "1173000004" -> name "[email protected]"
Aug 18 18:50:59 nfs-server idmapd[14622]: nfsdcb: authbuf=gss/krb5 authtype=group
Aug 18 18:50:59 nfs-server idmapd[14622]: nfs4_gid_to_name: calling nsswitch->gid_to_name
Aug 18 18:51:00 nfs-server idmapd[14622]: nfs4_gid_to_name: nsswitch->gid_to_name returned 0
Aug 18 18:51:00 nfs-server idmapd[14622]: nfs4_gid_to_name: final return value is 0
Aug 18 18:51:00 nfs-server idmapd[14622]: Server : (group) id "1173000004" -> name "[email protected]"
请注意,映射似乎是针对正确的用户/域请求的。然而,在日志中,我还发现许多对[email protected]
和映射的引用[email protected]
。
LOGS 客户端
aug 18 18:50:59 client1.hq.example.com nfsidmap[2118]: key: 0x274d13a5 type: uid value: [email protected] timeout 600
aug 18 18:50:59 client1.hq.example.com nfsidmap[2118]: nfs4_name_to_uid: calling nsswitch->name_to_uid
aug 18 18:50:59 client1.hq.example.com nfsidmap[2118]: nss_getpwnam: name '[email protected]' domain 'hq.example.com': resulting localname 'ldapuser1'
aug 18 18:50:59 client1.hq.example.com nfsidmap[2118]: nfs4_name_to_uid: nsswitch->name_to_uid returned 0
aug 18 18:50:59 client1.hq.example.com nfsidmap[2118]: nfs4_name_to_uid: final return value is 0
aug 18 18:50:59 client1.hq.example.com nfsidmap[2120]: key: 0x3e28949 type: gid value: [email protected] timeout 600
aug 18 18:50:59 client1.hq.example.com nfsidmap[2120]: nfs4_name_to_gid: calling nsswitch->name_to_gid
aug 18 18:50:59 client1.hq.example.com nfsidmap[2120]: nfs4_name_to_gid: nsswitch->name_to_gid returned 0
aug 18 18:50:59 client1.hq.example.com nfsidmap[2120]: nfs4_name_to_gid: final return value is 0
备注和问题
- 在这些情况下,错误映射的最常见原因似乎是两侧的
Domain
设置缺失或不一致。这里两侧的设置均正确idmapd.conf
- 如果我使用静态映射,它就会起作用,即 1)
ldapuser1
在服务器上创建本地 2) 在 [Static] 下添加一个条目idmapd.conf
,其中显示[email protected]=ldapuser1
。然而,这不是目标。 - Synology 服务器显然不是 Fedora/RedHat,因此它不是完美的免费 IPA 伴侣。特别是,它缺少
SSSD
。不过,我认为它应该可以工作。
我现在完全被难住了。我甚至不知道该去哪里寻求帮助。Synology 支持声称这应该工作。根据 freeIPA 开发人员的说法,这甚至是题外话,因为这不是 freeIPA 特有的,而“只是”NFS 和公司的问题。这是有争议的,因为所有这些技术的连接和使用方式都是 freeIPA 特有的。
无论如何,我不知道该看什么了。这就是为什么我在这里问,希望有人能让我至少再向前迈出一步。任何猜测都是受欢迎的!
答案1
在与 Synology 支持人员沟通后,我终于明白,由于 DSM 5.2 的限制,此功能目前无法实现。
问题是 DSM 假设 LDAP 服务器使用密歇根大学模式GSSAuthName
,它是特定于 NFS 的,因此在 GSS 请求进入时查找属性。相反,FreeIpa 将 Kerberos 主体存储在 LDAP 中,并且对于每个 Kerberos 主体始终有krbPrincipalName
可用的属性。
没有找到GSSAuthName
,DSM 将每个请求映射到nobody
。
我已经向 Synology 提出功能请求,以使用 SSSD 正确处理 id 映射。
直到那时,我才求助于sec=sys
。注意:确保 Synology LDAP 配置中的“启用 UID/GID 转换”未选中!