權限在 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
伺服器配置
在尋找在 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 流量之外什麼都沒有。
- 需要禁用 nfs3
vfs.nfsd.server_min_nfsvers=4
。- 為避免出現“nobody”,NFSv4 客戶端和伺服器應位於同一域域中。
簡而言之,必須有某種方法在系統之間映射使用者名。您是否在伺服器和客戶端上都執行 idmapd?ldap?
至少作為一個測試,嘗試在名稱之間進行特定的映射……除了根之外,至少最初是這樣。