[FreeBSD-users-jp 96316] Re: NFSv4 + Kerberos
Hiroki Sato
hrs @ allbsd.org
2018年 9月 22日 (土) 11:47:37 UTC
佐藤です。もう解決しているかも知れませんが...
Hiroo Ono (小野寛生) <hiroo.ono+freebsd @ gmail.com> wrote
in <CANtk6SjZ028H4vdxhY6TmmpPvwjWE15DOAXPBi8gkg8OkvFynw @ 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.net @ 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
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: 無し
型: application/pgp-signature
サイズ: 163 バイト
説明: 無し
URL: <http://lists.freebsd.org/pipermail/freebsd-users-jp/attachments/20180922/164d5253/attachment.sig>
freebsd-users-jp メーリングリストの案内