Debian Stretch 上的 NFSv4 映射 UID 和 GID
我使用以下設置:
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;
由於太多人需要靜態映射,這可能必須修復,但是,您無法修復程序 UID 的使用。
要以 NFS 友好的方式解決它,最好的選擇是使用 kerberos 並使用 sec=krb5 進行掛載。在這種情況下,您的程序可以為一個使用者使用 kerberos 票證執行,但在本地仍具有不同的 UID。在這種情況下,可以使用靜態映射來避免使用 LDAP。