Freebsd

權限在 FreeBSD 上使用 Kerberised NFSv4 時不生效

  • February 21, 2013

我目前正在嘗試在 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 流量之外什麼都沒有。

  1. 需要禁用 nfs3 vfs.nfsd.server_min_nfsvers=4
  2. 為避免出現“nobody”,NFSv4 客戶端和伺服器應位於同一域域中。

簡而言之,必須有某種方法在系統之間映射使用者名。您是否在伺服器和客戶端上都執行 idmapd?ldap?

至少作為一個測試,嘗試在名稱之間進行特定的映射……除了根之外,至少最初是這樣。

引用自:https://serverfault.com/questions/477118