在FreeBSD上,权限不会对Kerberised NFSv4起作用

我目前正在尝试在FreeBSD上设置NFSv4服务器。 我在其他Unices(Solaris和Linux)上做了这方面的工作经验丰富,但对于FreeBSD我还是比较新的。

我的目标是实现以下目标:

  • FreeBSD系统提供的文件
  • 唯一的安全模式应该是krb5p
  • 客户端是Linux(Ubuntu)和OSX

目前,我已经设置了一些东西,以便我需要一个有效的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量之外,其他的都没有。

  1. 需要使用vfs.nfsd.server_min_nfsvers=4禁用nfs3。
  2. 为了避免“nobody”,NFSv4客户端和服务器应该处于相同的领域。

简而言之,必须有一些方法来映射系统之间的用户名。 你是否在服务器和客户端上运行idmapd? LDAP?

至less作为一个testing,尝试在名称之间进行特定的映射(至less在初始阶段)。

我解决了这个问题。 通过代码后,我发现原因是GSS库中的一个错误。 问题是由于发送到getpwnam_r的缓冲区太小而引起的。

所有的细节可以在邮件列表的讨论中find