Linux

NFS 權限被 sec=krb5p 拒絕

  • February 4, 2022

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 中禁用屬性記憶體並重新掛載,nedPermission denied在呼叫ls -l.

我試過的

在客戶端和伺服器上,我都有:

  • 設置Verbosity = 4/etc/idmapd.conf
  • 用於rpcdebug設置nfsnfsdnlm和的所有標誌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 &gt;/dev/null && [[ -r /etc/krb/user/$(id -u)/client.keytab ]]
then
 kinit -ki
fi

〜/ .zshrc:

# Grab or renew a Kerberos ticket.
if type kinit &gt;/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 訪問權限)並假裝為您提供其他服務,但那是為了你的考慮。

此外,如果您要使用密鑰表,請不要忘記,每次更改帳戶密碼時,您還需要更新您的密鑰表。

引用自:https://unix.stackexchange.com/questions/688126