Nfs

Debian Stretch 上的 NFSv4 映射 UID 和 GID

  • June 18, 2018

我使用以下設置:

NFS 伺服器(Ubuntu 16.04 LTS)

  • nfs-common 1:1.2.8-6ubuntu1.2
  • nfs 核心伺服器 1:1.2.8-6ubuntu1.2
  • 使用者:測試(uid=1300)

NFS 客戶端

  • nfs 通用 1:1.3.4-2.1
  • 使用者:testmf (uid=1350)

在客戶端,使用者test存在與伺服器端相同的 UID。但我需要使用使用者testmf而不是那個test

我已經閱讀了很多文件,以及來自 StackOverflow/StackExchange 的答案,但由於某些原因,我沒有任何用處。

眾多答案之一是更改文件/etc/idmapd.conf

所以這裡是兩邊:

伺服器

[General]
Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
# Domain = localdomain

[Mapping]    
Nobody-User = nobody
Nobody-Group = nogroup

在客戶端:

[General]
Verbosity = 9
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if it differs from FQDN minus hostname
# Domain = localdomain
Domain = example.com

[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup

[Translation]
Method = static

[Static]
test@nfsserver.example.com = testmf
test@192.168.0.1 = testmf
test@nfsserver = testmf

我使用這樣的命令在客戶端上掛載目錄:

mount 192.168.0.1:/home/test/my_exp_dir /home/testmf/my_imp_dir

當我這樣做時,ls -l /home/testmf/my_imp_dir我會得到類似的東西:

-rw-r--r-- 1 test test  326025780 May  9  2017 allCountries.zip

並不是

-rw-r--r-- 1 testmf testmf  326025780 May  9  2017 allCountries.zip

如果我這樣做,touch testfile我會明白:

-rw-r--r-- 1 test test  326025780 May  9  2017 allCountries.zip
-rw-r--r-- 1 testmf testmf      0 Jun  9  18:57 testfile

或者ls -ln

-rw-r--r-- 1 1300 1300  326025780 May  9  2017 allCountries.zip
-rw-r--r-- 1 1350 1350          0 Jun  9  18:57 testfile

我試圖提高詳細程度,但在我的日誌中沒有任何地方可以看到使用者從一個 UID 到另一個 UID 的映射,就像我在一些答案中看到的那樣。我可以看到的兩件事是核心設置/sys/module/nfs/parameters/nfs4_disable_idmapping被設置為Y,即使更改為N,似乎也沒有任何效果。

我發現的第二件事是我的客戶端伺服器上不存在 2 個條目:

  • /proc/net/rpc/nfs4.nametoid
  • /proc/net/rpc/nfs4.idtoname

而且我不知道如何添加它,尤其是在 nfsidmap 不可用的情況下。

我已經讀到我還需要idmapd在更改後重新啟動服務。但是在 Debian 9 中這是不可能的……或者至少我還沒有找到如何去做……

我還更改了文件/etc/default/nfs-common以設置變數NEED_IDMAPD=yes,即使重新啟動後它也沒有做任何事情……

所以我的問題可能很愚蠢,但是如何在 Debian Stretch 上啟動 nfsidmapd?我真的沒有選擇,搜尋關鍵字和 Debian 的官方文件在這裡並沒有真正的幫助,除非我完全失明!

預先感謝您的幫助。

好吧,這就是我的答案,也許不是我想要的,但至少它解決了我的問題,我繼續。

基本上我已經確保每個使用者都屬於同一個組,在所有涉及的伺服器上具有相同的 GID。然後我設置了共享目錄中所有目錄的組 ID:

find /share-dir -type d -exec chmod g+s {} \;

我還檢查了 umask 設置為 007 而不是 022、027。

nfs id 映射存在很大的混淆。當字元串形式的主體(如 test@example.com)必須轉換為數字 id 時使用的映射,反之亦然。但是,當您使用 sec=sys 掛載時,您顯然會這樣做,然後所有請求都使用客戶端的本地 UID 和 GID 進行身份驗證。IOW,客戶端程序的觸摸UID 將是伺服器上的文件所有者。

第二個困惑是Static可用於定義靜態映射。根據手冊頁:

“靜態”轉換方法使用 GSS 認證名稱到本地使用者名的靜態列表。

從字面上看,它需要 GSS-Authenticated 主體:

if (strcmp(secname, "krb5") != 0 && strcmp(secname, "spkm3") != 0)
    return -EINVAL;

http://git.linux-nfs.org/?p=trondmy/libnfsidmap.git;a=blob;f=static.c;h=fffd4580847d2577d3fb9638a246069bdb8f12b5;hb=HEAD#l118

由於太多人需要靜態映射,這可能必須修復,但是,您無法修復程序 UID 的使用。

要以 NFS 友好的方式解決它,最好的選擇是使用 kerberos 並使用 sec=krb5 進行掛載。在這種情況下,您的程序可以為一個使用者使用 kerberos 票證執行,但在本地仍具有不同的 UID。在這種情況下,可以使用靜態映射來避免使用 LDAP。

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