sec = krb5pによってNFS権限が拒否されました。

sec = krb5pによってNFS権限が拒否されました。

sec=krb5pDebian 11(Bullseye)を実行している2つの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-共通:

NEED_STATD=
STATDOPTS=
NEED_IDMAPD=
NEED_GSSD=

/etc/export:

/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

(注:Iでも同じ結果が表示されます。マウントが失敗したときに誤ってローカルディスクに書き込むのを防ぐために正しいとchown ned:ned /imports/ned仮定するものは何ですか?)root:rootned

許可が拒否されました

サーバーとクライアントを再起動した後:

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できないことがあります。 1分後にそうしようとすると、フォルダのプロパティの疑問符が表示されます。これが発生した場合は、次のことができます。cdnedls -lPermission deniedned

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 deniedls -l

私が試したこと

クライアントとサーバーの両方に次のものがあります。

  • 設定Verbosity = 4する/etc/idmapd.conf
  • 、およびrpcdebug設定に使用されるすべてのフラグnfsnfsdnlmrpc
  • 関連情報のsystemdログを検索します(再起動して共有にアクセスしようとした後)。

私はsystemctl status次のレッスンが正しいことを確認して確認しactive、各レッスンにリストされている最新のジャーナルエントリを読み、明らかなエラーの兆候を見つけられませんでした。

  • 仕える人:
    • krb5 - 管理サーバー
    • krb5-kdc
    • nfs カーネルサーバー
    • nfs-idmapd
    • nfsマウント
    • nfs サーバー
    • rpc-svcgssd
    • rpc-gssd
  • 顧客:
    • rpc-gssd
    • 輸入・マウント

私が知る限り、Kerberosは正しく認証します。

見つかったすべての関連マニュアルページとオンラインマニュアル、およびStackExchangeで関連していると思われるすべての質問を読みましたが、問題を解決できなかったか、クライアントまたはサーバーで許可が拒否された理由を示すエラーメッセージを生成することはできません。

host/test-debian-desktopKerberosプリンシパルとキーを追加するように編集します。host/test-debian-serverUnix アプリケーションサーバー - MIT Kerberos ドキュメント

私が逃したものは何ですか

選択した回答は、私の設定がうまくいかない理由をよく説明します。誰もが同じ状況が発生した場合、私が見逃した詳細は次のとおりです。理由を理解するには、以下の回答を読んでください。

Kerberosは個々のユーザーを認証します(何らかの理由で認証しないようです)。したがって、ned接続するにはKerberosにプリンシパルが必要で、クライアントPCのLinuxユーザーはned@TESTそのプリンシパルのチケット付与チケット(TGT)を取得する必要があります。そうすれば、すべてが順調に進みます。これをある程度自動化するために、以下を行いました。nedkinit

/etc/krb5/user/<uid>/client.keytab:nedとのキーを保持します。nedだけ読むことができます!私は0600所有者とグループの両方の権限を使用しましたned

kinit -kiこのキータブを使用すると、パスワードを入力せずにログインを簡単に呼び出すことができます。これを自動化する迅速で汚い方法は、~/.gnomerc、~/.bashrc、および~/.zshrcに追加することです(私はGnome、Bash、Zshを使用しているためです)。

kinitまた、Ansibleを介してこれらの設定を展開し、いくつかの共有ポイントファイルがあるがNFSアクセスを必要としないシステムがあるため、クライアントキータブがある場合にのみ実行されるBashとZshにも興味があります。

~/.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

答え1

「許可拒否」というメッセージが表示されるのは、上記のように資格情報キャッシュにKerberos TGT(チケット付与チケット)がないためです。アカウントを実行してパスワードを入力する必要がklistあります。kinit認証を受けてTGTチケットがキャッシュされると、このチケットを使用してNFSサーバーに認証できます。

Kerberos認証の全体的な概念は、NFSサーバー(または他の関連サービス)に対してあなたの身元を「証明する」ことです。コマンドにパスワード(自分だけが知っている)を入力して生成されたキャッシュされたTGTを提供することで、これを「証明」できますkinit。したがって、これは通常これが機能する方法です。期限切れになる前にチケットが長く持続するようにkrb5//で期限切れと更新時間を変更できますが、sssd最終的にはある時点で何らかの方法で再認証する必要があります。

もちろん、いつでもアカウントのキータブを作成できます。クライアントのキータブに追加しないでください。クライアントキータブは、次の目的で使用されます。顧客一人で。新しいファイルに新しいキータブを作成する必要がありますあなたのアカウントを作成し、最小限の権限でこのファイルを安全にプライベートに保ち、このキータブを使用してインタラクティブにパスワードを入力することなく、資格情報キャッシュにTGTを作成できます。理論的には、定期的にこれを行うためのキータブを作成することもできますが、誰かcrontabが特定の時点(たとえばrootアクセス権を持っている場合)でキータブを盗んでユーザーであるふりをして他のサービスを提供できるので、セキュリティは安全ではありません。しかし、それはあなたの考慮事項です。

また、キータブ方式を使用している場合は、アカウントのパスワードを変更するたびにキータブも更新する必要があることを忘れないでください。

関連情報