我目前正在尝试在 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
- 需要用 禁用 nfs3
vfs.nfsd.server_min_nfsvers=4
。 - 为了避免“无人”,NFSv4 客户端和服务器应该位于同一
域领域中。
答案2
简而言之,必须有某种方法在系统之间映射用户名。您是否在服务器和客户端上运行 idmapd?Ldap?
至少作为测试,尝试在名称之间建立特定的映射...除了 root,至少最初是这样。
答案3
我解决了这个问题。查看代码后,我发现原因是 GSS 库中的一个错误。问题是由发送到的缓冲区getpwnam_r
太小引起的。
所有细节都可以在邮件列表