FreeBSD 上的 Kerberised NFSv4 权限无效

FreeBSD 上的 Kerberised NFSv4 权限无效

我目前正在尝试在 FreeBSD 上设置 NFSv4 服务器。我在其他 Unix(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

服务器配置

我在寻找有关在 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

另一个有趣的方面是,当我tcpdump记录客户端和服务器之间的 NFS 网络流量时,我看到NFS3数据包与NFS4数据包。这两种数据包类型都包含加密数据,因此我仍然认为使用了 Kerberos,但考虑到上述配置,我本来预计除了 NFS4 流量之外什么都没有。

答案1

  1. 需要用 禁用 nfs3 vfs.nfsd.server_min_nfsvers=4
  2. 为了避免“无人”,NFSv4 客户端和服务器应该位于同一领域中。

答案2

简而言之,必须有某种方法在系统之间映射用户名。您是否在服务器和客户端上运行 idmapd?Ldap?

至少作为测试,尝试在名称之间建立特定的映射...除了 root,至少最初是这样。

答案3

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

所有细节都可以在邮件列表

相关内容