在 FreeBSD 上,Kerberised NFSv4 的权限没有生效

Eli*_*son 7 freebsd nfs kerberos nfs4

我目前正在尝试在 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
Run Code Online (Sandbox Code Playgroud)

服务器配置

我在寻找在 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"
Run Code Online (Sandbox Code Playgroud)

以下是内容/etc/exports

/export/shared/testshare -sec=krb5p
V4: / -sec=krb5p
Run Code Online (Sandbox Code Playgroud)

另一个有趣的方面是,当我用来tcpdump记录客户端和服务器之间的 NFS 网络流量时,我看到NFS3数据包与NFS4数据包一起。这两种数据包类型都包含加密数据,所以我仍然认为使用了 Kerberos,但考虑到上面的配置,我原以为只有 NFS4 流量。

Eli*_*son 0

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

所有细节都可以在邮件列表的讨论中找到