我目前正在尝试在FreeBSD上设置NFSv4服务器。 我在其他Unices(Solaris和Linux)上做了这方面的工作经验丰富,但对于FreeBSD我还是比较新的。
我的目标是实现以下目标:
目前,我已经设置了一些东西,以便我需要一个有效的TGT来访问文件系统。 试图访问这些文件后,我可以在客户端上运行klist ,我可以看到nfs/domainname主体已被检索。 这表明NFS挂载的Kerberos部分是正确的。
我的问题是,所有的客户端访问仍然使用nobody用户执行。 当我执行ls -l时,我可以看到权限。 即使用户映射工作正常,但除非nobody有权对文件进行任何操作,否则我将获得拒绝权限。
这里有一个来自客户端的示例交互(在这种情况下是Ubuntu,但是OSX发生同样的事情)。 在这个例子中, /export/shared/testshare是FreeBSD服务器的共享目录:
(我已经将实际域名更改为domain ,将Kerberos域名更改为REALM )
$ kinit Password for elias@REALM: $ klist Ticket cache: FILE:/tmp/krb5cc_1000_GBjtDP Default principal: elias@REALM Valid starting Expires Service principal 09/02/2013 09:40:47 10/02/2013 09:40:44 krbtgt/REALM@REALM $ sudo mount -t nfs4 -osec=krb5p,vers=4 lion:/export/shared/testshare /mnt $ ls -l /mnt total 4 -rw-r--r-- 1 nobody nogroup 5 Feb 7 18:17 bar.txt -rw------- 1 elias nogroup 4 Feb 5 23:09 foo.txt $ cat /mnt/bar.txt blah $ echo foo >>/mnt/bar.txt bash: /mnt/bar.txt: Permission denied $ cat /mnt/foo.txt cat: /mnt/foo.txt: Permission denied $ klist Ticket cache: FILE:/tmp/krb5cc_1000_GBjtDP Default principal: elias@REALM Valid starting Expires Service principal 09/02/2013 09:40:47 10/02/2013 09:40:44 krbtgt/REALM@REALM 09/02/2013 09:41:56 10/02/2013 09:40:44 nfs/lion.domain@REALM
服务器configuration
在find关于在FreeBSD上设置NFSv4的全面指导方面,我遇到了一些问题。 这本身有点令人惊讶,因为我发现有关如何在FreeBSD中做事情的信息非常好。
以下是/etc/rc.conf中的相关行:
rpcbind_enable="YES" nfs_server_enable="YES" nfsv4_server_enable="YES" nfsuserd_enable="YES" nfscbd_enable="YES" mountd_enable="YES" gssd_enable="YES" rpc_lockd_enable="YES" rpc_statd_enable="YES" zfs_enable="YES"
这里是/etc/exports的内容:
/export/shared/testshare -sec=krb5p V4: / -sec=krb5p
另一个有趣的方面是,当我使用tcpdumplogging客户端和服务器之间的NFSnetworkingstream量时,我看到了NFS3数据包和NFS4数据包。 这两种数据包types都包含encryption的数据,所以我仍然认为使用了Kerberos,但是考虑到上面的configuration,我预计除了NFS4stream量之外,其他的都没有。
vfs.nfsd.server_min_nfsvers=4禁用nfs3。 简而言之,必须有一些方法来映射系统之间的用户名。 你是否在服务器和客户端上运行idmapd? LDAP?
至less作为一个testing,尝试在名称之间进行特定的映射(至less在初始阶段)。
我解决了这个问题。 通过代码后,我发现原因是GSS库中的一个错误。 问题是由于发送到getpwnam_r的缓冲区太小而引起的。
所有的细节可以在邮件列表的讨论中find