NFS/Kerberos
Kerberos は NFS に利用可能な数少ないセキュリティメカニズムの一つです。Kerberos は強力なユーザー認証とデータ暗号化を提供し、NFSv4 を使用することでクライアントとサーバー間の UIDs/GIDs の一致が不要になります。
Kerberos には NFSv4 が推奨されます。NFSv3 で Kerberos を有効にすることは可能ですが、補助的な NFSv3 プロトコル(例えば「マウント」プロトコル)がセキュアでないため、100% のカバレッジは提供されません。また、NFSv3 には idmapping がないため、Kerberos の使用性が大幅に低下します。
前提条件
Kerberos は KDC (Key Distribution Center)サービスがどこかで動作している必要があります。MIT Kerberos (krb5)に付属する krb5-kdc.service
は、Active Directory や FreeIPA のような複雑さが必要ない小規模設定に適しています。2 番目のオプションは Heimdal で、一部の BSD や Arch 上の heimdalAUR で見つかります。
Kerberos と共に NFSv4 の idmapping がとても重要になります。サーバーとクライアントはどちらも同じ idmapping ドメインを設定している必要があります:
/etc/idmapd.conf
[General] Domain = example.com
サーバーの設定
各 NFS サーバーは、KDC 上に nfs/server.fqdn
の Kerberos プリンシパルを作成し、その鍵をサーバーの /etc/krb5.keytab
に追加する必要があります。
fileserv# kadmin -p frob/admin Password for frob/admin@EXAMPLE.COM: ********* kadmin: addprinc -nokey nfs/fs.example.com kadmin: ktadd nfs/fs.example.com
サーバー上で gssproxy.service
を有効化し開始する必要があります。
gssproxy は NFS サーバーのサポートで事前に設定されています(標準パッケージの一部として /etc/gssproxy/24-nfs-server.conf
ファイルが含まれています)そして、NFS サービスの keytab を標準の場所に置く以外に調整する必要はありません。
/etc/exports
では、sec=
オプションで Kerberos 認証フレーバーを提供する必要があります:
/home *(rw,sec=krb5p) /usr 10.147.0.0/16(rw,sec=krb5p:krb5i:krb5:sys) *(rw,sec=krb5p)
利用可能なフレーバーは以下の通りです:
krb5p
は「プライバシー」(Kerberos ベースの暗号化)を提供します。インターネット上で使用するには十分なセキュリティですが、LAN 上でのスループットが低下する可能性があるため、RPC-with-TLS 内でkrb5
を使用することを検討してください。krb5i
は「完全性」(Kerberos ベースの MAC)を提供しますが、暗号化は提供しません。パケット改ざんから保護するため、静的データを提供する際に有用かもしれません。krb5
は認証のみを提供し、データの完全性や暗号化はありません。RPC-over-TLS をxprtsec=
を通じて有効化している、または Kerberos をそれ自体「安全な」LAN(例:WireGuard トンネルを通じて)上で運用している場合は良い選択ですが、公開ネットワーク上でクリアな状態で使用するのは避けてください。sys
は従来の UID ベース(非 Kerberos)の NFS セキュリティモードです。
クライアント設定
ユーザーに加えて、各 NFS クライアントは /etc/krb5.keytab
に「マシン」Kerberos プリンシパルを持つべきであり、ユーザーの Kerberos チケットがまだ利用可能でない状況で使用されます。特に、ユーザーがログインする前や(autofs 経由でのマウントが行われる場合など)、ファイルシステムをブート時にマウントするために必要になります。一般的に、「root として」行われるすべての操作はマシンプリンシパルとして認証されます。
サーバーの場合と異なり、クライアントマシンは特に nfs/
プリンシパルを必要としません。一般的な host/the.fqdn
プリンシパルがあれば十分です(rpc.gssd マニュアルページで何を探すかを参照)。
クライアントは rpc-gssd.service
をアクティブにする必要があります(つまり、rpc.gssd
デーモン)。
ファイルシステムをマウントするときに使用されるオプションは、/etc/exports
で使用されるオプションと非常に似ています。sec=
オプションを使用して、1つ以上のフレーバーを指定できます。クライアントは自動的に提供された最も強力なモードを使用しますが、ダウングレード攻撃を防ぐために、例えば sec=krb5p
を明示的に要求することを推奨します。
ファイルシステムがマウントされた後、root はすでに(マシンの Kerberos 資格情報を使用して)アクセスできますが、すべての非 root ユーザーは自身の Kerberos チケットが必要です。これはユーザーが自分で kinit
を手動で実行するか、ログイン中にチケットを取得する pam-krb5 を設定するか(これはパスワードベースのログインでのみ機能します)、または gssproxy
や k5start(1)(kstartAUR から)を使用して keytab ファイルからチケットを取得するかのいずれかを意味します。