私は現在、FreeBSDでNFSv4サーバーをセットアップしようとしています。私は他のUnices(SolarisおよびLinux)でこれを行った豊富な経験がありますが、FreeBSDにはかなり慣れていません。
私の目標は、次のことを達成することです。
現在、ファイルシステムにアクセスするために有効なTGTが必要になるように設定することができました。これらのファイルにアクセスしようとした後、クライアントでklist
を実行すると、nfs/domainname
プリンシパルが取得されたことがわかります。これは、NFSマウントのKerberos部分が正しいことを示しています。
私の問題は、すべてのクライアントアクセスがまだnobody
ユーザーを使用して実行されていることです。ls -l
を実行するとアクセス許可が表示されます。ユーザーマッピングも正しく機能しますが、nobody
にファイルを処理する権限がない限り、権限が拒否されます。
これはクライアントからのインタラクションの例です(この場合はUbuntuですが、OSXでも同じことが起こります)。この例では、/export/shared/testshare
はFreeBSDサーバーからの共有ディレクトリです。
(実際のドメイン名をdomain
に変更し、Kerberosレルム名をREALM
に変更しました)
$ kinit
Password for elias@REALM:
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000_GBjtDP
Default principal: elias@REALM
Valid starting Expires Service principal
09/02/2013 09:40:47 10/02/2013 09:40:44 krbtgt/REALM@REALM
$ Sudo mount -t nfs4 -osec=krb5p,vers=4 lion:/export/shared/testshare /mnt
$ ls -l /mnt
total 4
-rw-r--r-- 1 nobody nogroup 5 Feb 7 18:17 bar.txt
-rw------- 1 elias nogroup 4 Feb 5 23:09 foo.txt
$ cat /mnt/bar.txt
blah
$ echo foo >>/mnt/bar.txt
bash: /mnt/bar.txt: Permission denied
$ cat /mnt/foo.txt
cat: /mnt/foo.txt: Permission denied
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000_GBjtDP
Default principal: elias@REALM
Valid starting Expires Service principal
09/02/2013 09:40:47 10/02/2013 09:40:44 krbtgt/REALM@REALM
09/02/2013 09:41:56 10/02/2013 09:40:44 nfs/lion.domain@REALM
サーバー構成
FreeBSDでNFSv4をセットアップするための包括的なガイドを見つけるのにかなりの問題がありました。 FreeBSDで物事を行う方法に関する情報が非常に優れていることがわかったので、これ自体はやや驚くべきことです。
/etc/rc.conf
の関連する行は次のとおりです。
rpcbind_enable="YES"
nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfsuserd_enable="YES"
nfscbd_enable="YES"
mountd_enable="YES"
gssd_enable="YES"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"
zfs_enable="YES"
/etc/exports
の内容は次のとおりです。
/export/shared/testshare -sec=krb5p
V4: / -sec=krb5p
もう1つの興味深い側面は、tcpdump
を使用してクライアントとサーバー間のNFSネットワークトラフィックを記録したときに、NFSパケットとNFS4パケットが表示されたことです。 。これらのパケットタイプは両方とも暗号化されたデータを含んでいたので、Kerberosが使用されたと思いますが、上記の構成を考えると、NFS4トラフィックしかないと予想していました。
私は問題を解決しました。コードを調べたところ、原因はGSSライブラリのバグであることがわかりました。この問題は、getpwnam_r
に送信されたバッファが小さすぎることが原因で発生しました。
すべての詳細は メーリングリスト の議論で見つけることができます
vfs.nfsd.server_min_nfsvers=4
でnfs3を無効にする必要があります。簡単に言えば、システム間でユーザー名をマッピングする方法が必要です。サーバーとクライアントの両方でidmapdを実行していますか? LDAP?
少なくともテストとして、少なくとも最初は、ルート以外の名前の間で特定のマッピングを作成してみてください。