[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 メーリングリストの案内