佐藤です。もう解決しているかも知れませんが... Hiroo Ono (小野寛生) <hiroo.ono+free...@gmail.com> wrote in <cantk6sjz028h4vdxhy6tmmppvwjwe15doaxpbi8gkg8okvf...@mail.gmail.com>:
hi> samba4 を Active Directory の DC にしているのですが、こいつを KDC にして NFSv4 で hi> -sec=krb5 でマウントしたいと考えています。 hi> hi> https://wiki.freebsd.org/KerberizedNFS hi> https://lists.samba.org/archive/samba/2014-November/186562.html hi> hi> を参考にしました。 hi> hi> -sec=sys で NFSv4 でマウントできるところまでは確認しました。 hi> その後、下記の手順で keytab を作成して、 hi> # mount_nfs -o nfsv4,sec=krb5 image.oikumene.ukehi.net:/exports/data /mnt hi> hi> としたのですが、マウントはできて、ls でファイルのリストは出てくるものの、 hi> # cat /mnt/data.txt hi> とすると hi> hi> nfsv4 err=10016 hi> cat: /mnt/data.txt: Input/output error hi> hi> とエラーになります。 ぱっと読む限りでは、NFS サーバのサービスプリンシパルが 大文字で書いてあるところが間違いだと思います。 マウントしてから KDC のログを見るとわかると思いますが、 この構成なら nfs/image.oikumene.ukehi....@oikumene.ukehi.net という プリンシパル名が使われるはずです。 また、メールにある exports の V4: 行にある "kerb5p" はスペルが間違っています。 /exports/data は / と同じパーティションであれば -sec のオプションが 適用されるはずですが、間違えやすいので同じ -sec を付けることをお勧めします。 プリンシパル名を修正するだけで動くかも知れません。 ただ、この設定ではマウントする前に kinit しないとサービスプリンシパルのチケットが とれないので、起動時にマウントすることができないと思います。 NFSv4 + Kerberos を設定する場合、次のようにするのがおすすめです。 * NFS サーバで NFS 用のサービスプリンシパルを作成する ドキュメントには kadmin を使った例がありますが、 kadmind を動かしているのであれば、ktutil を使うと 新しいプリンシパルの作成と keytab への挿入が一度にできます。 server# ktutil get nfs/`hostname` FQDN として指定している名前は、逆引きが正しく行なえる 必要があります。DNS で設定するのが一般的ですが、 KDC, クライアント, サーバで情報が一致していれば良いので 3 者の /etc/hosts を手動でそろえても動かせます。 * NFS クライアントで host/FQDN というサービスプリンシパルを作成する マウントするためのプリンシパルを作成します。理由は次のとおりです。 ログインユーザのプリンシパルでもマウントは可能ですが、 起動時に自動的にマウントするには、 そのユーザのチケットをあらかじめ keytab に入れるか 起動のたびに kinit するか、いずれかの作業が必要です。 ログインユーザのチケットを keytab に入れて使うと セキュリティ的に問題なので、通常は専用のプリンシパルを用意します。 root/FQDN, nfs/FQDN, host/FQDN あたりが良く使われます。 下記の例は host/FQDN を使う場合です。 client# ktutil get host/`hostname` * サーバ・クライアント・KDC の時刻が合っていることを確認する ずれているとチケット要求が失敗します。 * サーバ・クライアントで gssd が上がっていることを確認する gssd_enable="YES" を rc.conf に書く必要があります。 ここまで作業したら、クライアントで次の順番で動作を確認します。 1. kdestroy して、自分のユーザプリンシパルのチケットのキャッシュを消す。 2. クライアントでマウントする。 client# mount -o rw,nfsv4,sec=krb5p,gssname=host,noinet6 server.fqdn:/dir /mnt クライアントは KDC に host/FQDN でアクセスし、サーバの nfs/FQDN (上の例だと nfs/server.fqdn) のチケットを取り出します。ここで err=10016 が出る場合、 上記の準備のどれかが欠けています。KDC 側のアクセスログを調べて、 ちゃんとチケットを取りにいっているか確認しましょう。 3. ls -al /mnt してみる。 ここでは次のエラーが出るはずで、エラーが出るのが正しいです。 nfsv4 err=10016 ls: /mnt: Input/output error 4. kinit する。 自分のユーザで kinit し、チケットを取ります。 5. もう一度 ls -al /mnt する。 今度はエラーにならないはずですが、owner の情報が nobody:nogroup になって見えると思います。 このアクセスの際、nfs/FQDN のチケットを取得します。 3 で失敗するのは、kinit する前は TGT がないので nfs/FQDN が 取得できないのが原因です。 ここで klist を実行すると、nfs/FQDN のチケットを 取っていることがわかります。 6. nfsuserd をサーバ・クライアントで起動する rc.conf に nfsuserd_enable="YES" として デーモンを起動します。 7. もう一度 ls -al /mnt する。 owner がきちんと表示されるはずです。 NFSv4 はサーバから UID を数値ではなく文字列で送るため、 サーバと同じ名前のユーザがクライアントに存在しない場合は nobody:nogroup になります。 確認できたら、rc.conf と fstab に設定を書き込んで再起動させ、 自動でマウントされるかどうか確認すると良いでしょう。 gssd が上がらないとマウントに失敗しますので、fstab には late オプションを 指定しておくと良いかも知れません。 -- Hiroki
pgp1d_8HqLzDs.pgp
Description: PGP signature