NFS 權限被 sec=krb5p 拒絕
sec=krb5p
我正在執行 Debian 11 (Bullseye) 的兩台 Hyper-V VM 上使用 MIT Kerberos ( ) 設置 NFSv4.2 。當我使用基於機器的身份驗證 (sec=sys
) 時,一切正常。使用 Kerberos (sec=krb5p
),我可以在客戶端上掛載共享,但是Permission denied
當我嘗試訪問共享時會看到。我在下面詳細記錄了所有這些,包括想到的所有相關配置資訊。我有點超出我的深度。我錯過了什麼或做錯了什麼?NFS 與
sec=sys
/etc/exports 在伺服器上:
/exports/ned 192.168.1.0/24(sec=sys,rw,no_subtree_check)
/etc/fstab 在客戶端:
test-debian-server:/exports/ned /imports/ned nfs sec=sys 0 0
測試共享:
ned@test-debian-desktop:/imports$ su - -c "nfsstat -m" Password: /imports/ned from test-debian-server:/exports/ned Flags: rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.63,local_lock=none,addr=192.168.1.62 ned@test-debian-desktop:/imports$ id uid=2001(ned) gid=2001(ned) groups=2001(ned) ned@test-debian-desktop:/imports$ ls -l total 4 drwxr-xr-x 2 ned ned 4096 Jan 26 17:57 ned ned@test-debian-desktop:/imports$ cd ned ned@test-debian-desktop:/imports/ned$ ls ned@test-debian-desktop:/imports/ned$ touch test.txt ned@test-debian-desktop:/imports/ned$ ls test.txt
在伺服器上驗證 test.txt:
ned@test-debian-server:/exports$ id uid=2001(ned) gid=2001(ned) groups=2001(ned) ned@test-debian-server:/exports$ ls -l total 4 drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned ned@test-debian-server:/exports$ ls -l ned total 0 -rw-r--r-- 1 ned ned 0 Jan 26 19:11 test.txt
權限被拒絕
sec=krb5p
伺服器配置
/etc/主機:
127.0.0.1 localhost 127.0.1.1 test-debian-server.test test-debian-server 192.168.1.63 test-debian-desktop 192.168.1.62 test-debian-server
/etc/default/nfs-核心伺服器:
RPCNFSDCOUNT=8 RPCNFSDPRIORITY=0 RPCMOUNTDOPTS="--manage-gids" NEED_SVCGSSD="" RPCSVCGSSDOPTS=""
/etc/default/nfs-common:
NEED_STATD= STATDOPTS= NEED_IDMAPD= NEED_GSSD=
/etc/出口:
/exports/ned 192.168.1.0/24(sec=krb5p,rw,no_subtree_check)
/etc/krb5.conf(大量刪節):
[libdefaults] default_realm = TEST kdc_timesync = 1 ccache_type = 4 forwardable = true proxiable = true [realms] TEST = { kdc = test-debian-server admin_server = test-debian-server }
Kerberos 主體:
root@test-debian-server:~# kadmin.local listprincs K/M@TEST host/test-debian-desktop@TEST host/test-debian-server@TEST kadmin/admin@TEST kadmin/changepw@TEST kadmin/test-debian-server@TEST kiprop/test-debian-server@TEST krbtgt/TEST@TEST nfs/test-debian-desktop@TEST nfs/test-debian-server@TEST
Kerberos 密鑰表:
root@test-debian-server:~# klist -ke Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- -------------------------------------------------------------------------- 2 nfs/test-debian-server@TEST (aes256-cts-hmac-sha1-96) 2 nfs/test-debian-server@TEST (aes128-cts-hmac-sha1-96) 2 host/test-debian-server@TEST (aes256-cts-hmac-sha1-96) 2 host/test-debian-server@TEST (aes128-cts-hmac-sha1-96)
NFS 有效域:
root@test-debian-server:~# nfsidmap -d test
出口許可:
root@test-debian-server:~# ls -ld /exports /exports/* drwxr-xr-x 3 root root 4096 Jan 26 17:58 /exports drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 /exports/ned
客戶端配置
/etc/主機:
127.0.0.1 localhost 127.0.1.1 test-debian-desktop.test test-debian-desktop 192.168.1.63 test-debian-desktop 192.168.1.62 test-debian-server
/etc/default/nfs-common:與伺服器相同。
/etc/fstab:
test-debian-server:/exports/ned /imports/ned nfs sec=krb5p 0 0
/etc/krb5.conf:與伺服器相同。
Kerberos 密鑰表:
root@test-debian-desktop:~# klist -ke Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- -------------------------------------------------------------------------- 3 nfs/test-debian-desktop@TEST (aes256-cts-hmac-sha1-96) 3 nfs/test-debian-desktop@TEST (aes128-cts-hmac-sha1-96) 2 host/test-debian-desktop@TEST (aes256-cts-hmac-sha1-96) 2 host/test-debian-desktop@TEST (aes128-cts-hmac-sha1-96)
NFS 有效域:
root@test-debian-desktop:~# nfsidmap -d test
進口許可(解除安裝共享後):
root@test-debian-desktop:~# umount /imports/ned root@test-debian-desktop:~# ls -ld /imports /imports/* drwxr-xr-x 3 root root 4096 Jan 26 19:08 /imports drwxr-xr-x 2 root root 4096 Jan 26 17:02 /imports/ned
(注意:我的結果是一樣的
chown ned:ned /imports/ned
。我認為root:root
是正確的,以防止ned
掛載失敗時意外寫入本地磁碟?)沒有權限
重啟伺服器和客戶端后:
ned@test-debian-desktop:/imports$ su -c "nfsstat -m" Password: /imports/ned from test-debian-server:/exports/ned Flags: rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5p,clientaddr=192.168.1.63,local_lock=none,addr=192.168.1.62 ned@test-debian-desktop:/imports$ ls -l total 4 drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned ned@test-debian-desktop:/imports$ cd ned bash: cd: ned: Permission denied ned@test-debian-desktop:/imports$
有時
ned
可以列出ls -l
最初的共享但不能cd
進入它,如上面的會話;一分鐘後,如果ned
嘗試ls -l
,他們將看到文件夾屬性的Permission denied
問號。ned
發生這種情況時,我可以執行以下操作:ned@test-debian-desktop:/imports$ ls -l ls: cannot access 'ned': Permission denied total 0 d????????? ? ? ? ? ? ned ned@test-debian-desktop:/imports$ su -c "ls -l /imports" Password: total 4 drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned ned@test-debian-desktop:/imports$ ls -l total 4 drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned ned@test-debian-desktop:/imports$
這似乎是由於屬性記憶體過期:如果我
noac
在客戶端上的 /etc/fstab 中禁用屬性記憶體並重新掛載,ned
則Permission denied
在呼叫ls -l
.我試過的
在客戶端和伺服器上,我都有:
- 設置
Verbosity = 4
在/etc/idmapd.conf
- 用於
rpcdebug
設置nfs
、nfsd
、nlm
和的所有標誌rpc
- 搜尋 systemd 日誌以獲取相關資訊(在重新啟動並嘗試訪問共享之後)。
我已經檢查
systemctl status
以確認以下單位是active
,並且我已經閱讀了為每個單位列出的最近的日記條目(並沒有發現明顯的錯誤跡象):
伺服器:
- krb5-管理伺服器
- krb5-kdc
- nfs 核心伺服器
- nfs-idmapd
- nfs-mountd
- nfs 伺服器
- rpc-svcgssd
- rpc-gssd
客戶:
- rpc-gssd
- 進口-ned.mount
據我所知,Kerberos 正在正確地進行身份驗證。
我已經閱讀了我可以找到的所有相關聯機幫助頁和線上手冊,以及 StackExchange 上似乎相關的每個問題,但我無法解決問題或讓客戶端或伺服器生成錯誤消息來告訴我為什麼權限被拒絕。
編輯以根據Unix 應用程序伺服器添加
host/test-debian-desktop
和Kerberos 主體和密鑰- MIT Kerberos 文件host/test-debian-server
我錯過了什麼
選擇的答案很好地解釋了我的配置不起作用的原因。如果有人遇到同樣的情況,以下是我所缺少的詳細資訊 - 請閱讀下面的答案以了解原因。
Kerberos 對單個使用者進行身份驗證(出於某種原因,我認為它沒有)。因此,
ned
要進行連接,Kerberos 必須有一個主體,並且客戶端 PC 上ned@TEST
的 Linux 使用者必須為該主體獲取一個 Ticket-Granting Ticket (TGT)。然後一切都很好。為了或多或少自動化,我做了以下事情:ned``kinit
/etc/krb5/user/<uid>/client.keytab:保存密鑰,
ned
並且**只能由 ned 讀取!**我使用0600
了權限,所有者和組都為ned
.使用此密鑰表,我可以簡單地呼叫
kinit -ki
登錄而無需輸入密碼。我自動化它的快速而簡單的方法是將它添加到 ~/.gnomerc、~/.bashrc ~/.zshrc(因為我使用 Gnome、Bash 和 Zsh)。此外,由於我通過 Ansible 部署這些配置並且有一些共享點文件但不需要 NFS 訪問的系統,因此我對 Bash 和 Zsh 有了一些興趣,只有
kinit
在它和客戶端 keytab 存在時才執行:〜/ .bashrc:
# Grab or renew a Kerberos ticket. if type -t kinit >/dev/null && [[ -r /etc/krb/user/$(id -u)/client.keytab ]] then kinit -ki fi
〜/ .zshrc:
# Grab or renew a Kerberos ticket. if type kinit >/dev/null && [[ -r /etc/krb/user/$(id -u)/client.keytab ]] then kinit -ki fi
您得到“權限被拒絕”的原因是您的憑證記憶體中沒有 TGT Kerberos 票證,正如您在
klist
. 您必須執行kinit
該帳戶並輸入您的密碼。一旦您通過身份驗證並記憶體了 TGT 票證,您就可以使用此票證對 NFS 伺服器進行身份驗證。您需要記住,Kerberos 身份驗證的整個想法是您需要向 NFS 伺服器(或任何其他服務)“證明”您的身份。
TGT
您通過向命令輸入密碼(只有您知道)生成的記憶體(Ticket Granting Ticket)來“證明”它kinit
。所以通常這就是它應該工作的方式。您可以在krb5
/sssd
/whatever 中更改到期和續訂時間,以使您的票在到期前持續更長時間,但最終在某些時候您需要以一種或另一種方式重新進行身份驗證。當然,您始終可以為您的帳戶創建一個密鑰表。不要將其添加到客戶端的密鑰表中!客戶端密鑰表僅適用於客戶端。您需要在新文件中為您的帳戶創建新的密鑰表,並以最低權限保持此文件的安全和私密,並使用此密鑰表在您的憑證記憶體中生成 TGT,而無需互動輸入密碼。從理論上講,您甚至可以創建一個
crontab
定期為您執行此操作的工具,但這不太安全,因為有人可能會在某個時候竊取您的密鑰表(例如,如果他具有 root 訪問權限)並假裝為您提供其他服務,但那是為了你的考慮。此外,如果您要使用密鑰表,請不要忘記,每次更改帳戶密碼時,您還需要更新您的密鑰表。