« kmscon で Linux コンソールを日本語対応に | トップページ | GRUB で EFI への登録に失敗したら… »

2017-09-15

NFSv4 + Kerberos 環境構築

自宅の メディアサーバー&ファイルサーバー は以前立ち上げたが、今までファイルサーバーとしては Samba だけ使っていた。 メインで使っている PC は普段 Linux なので、どうせなら…ということで NFS サーバーも立ち上げることにした。

自宅内なのでセキュリティをあまり気にする必要もないが、以前から NFSv3 以前のアカウント・権限周りの挙動が気に入らなかったので、スキルアップを兼ねて NFSv4 + Kerberos で構築。 まぁ、まともに LDAP を立ち上げる気はないので、ユーザーマッピングがきちんと動けばいいというレベル。 NFSv4 と Kerberos の組み合わせについては意外とネット上に情報が少ないため、備忘録代わりにここにやったことを残しておく。

以下は私の環境である、サーバー/クライアント共に Debian Stretch の構成を前提にしたもの。

通常の DNS はブロードバンドルーターにお任せだし、自前で DNS サーバーまでは立ち上げていないので、 /etc/hosts で指定する簡易的なやり方。

いろいろやって結果的にうまくいったけど、余計なことも混じっているかも…。

サーバー側

/etc/hosts の確認

このサーバーが FQDN で載っていれば OK。 たとえばこんな感じ(実際の名前とは違います)。

127.0.1.1   server.domain.local server

これは IP を DHCP で取得する設定にしているため。 実際にはブロードバンドルーター側で固定 IP を割り当てるように設定しているので、ここにその IP を書いてもいいかもしれないが、とりあえずこれでも動くので放っておく。

もし FQDN で書かれていないようであれば FQDN が先になるように追記する。

必要パッケージインストール
root@server # apt-get install nfs-kernel-server
root@server # apt-get install krb5-kdc krb5-admin-server libpam-krb5

インストールの過程(設定)でレルム、ケルベロスサーバー、ケルベロス管理サーバーを訊いてくるので、これに答える。 ここでは、ケルベロスサーバーとケルベロス管理サーバーの両方をこのサーバーで稼働させることをにする。 レルムはドメイン名を大文字にしたものとする。

  • レルム:
    DOMAIN.LOCAL
  • ケルベロスサーバー (kdc):
    server.domain.local
  • ケルベロス管理サーバー (admin_server):
    server.domain.local
/etc/idmapd.conf の編集

ドメイン名を指定する

[General]
Domain = domain.local
Kerberos の初期設定

以下の処理の中で何度かパスワードを訊かれるはず。 それぞれのパスワードを忘れないように…。

まずはレルムを作成。

root@server # krb5_newrealm

kadmin.local コマンドを起動し、管理用プリンシパル root/admin を追加する。

root@server # kadmin.local
...
kadmin.local:  addprinc root/admin
...
kadmin.local:  quit

/etc/krb5kdc/kadmin.acl ファイルを編集して

# */admin *

のコメントを外すか、以下のように明示的に root/admin に管理権限を与えるように追記する。

root/admin@DOMAIN.LOCAL *

管理サーバーを再起動する。

root@server # systemctl restart krb5-admin-server.service
NFS 用に Kerberos を設定する

kadmin.local コマンドを起動し、 NFS に必要なプリンシパルを追加する。 user は実際に NFS を使用するユーザーを指定する(パスワードを訊かれるのでそのユーザーのパスワードを入力する)。

root@server # kadmin.local
...
kadmin.local:  addprinc user
...
kadmin.local:  addprinc -randkey host/server.domain.local
...
kadmin.local:  addprinc -randkey nfs/server.domain.local
...
kadmin.local:  quit

kadmin.local コマンドを起動し、 NFS に必要なキーを追加する。

root@server # kadmin.local
...
kadmin.local:  ktadd host/server.domain.local
...
kadmin.local:  ktadd nfs/server.domain.local
...
kadmin.local:  quit

これで /etc/krb5.keytab が作成される。

NFS の export 設定

/etc/exports に実際に NFS で公開するディレクトリを指定する。 以下のような感じ。

/srv    gss/krb5i(rw,sync,fsid=0,insecure,no_subtree_check)

NFSv4 の場合、一つのツリーで公開することになるので、その root となるディレクトリには fsid=0 を指定する。 私の場合はこれ一つだけで済んでいる。

設定が終わったら NFS server を再起動する。

root@server # systemctl restart nfs-server.service

クライアント側

/etc/hosts の確認・設定

クライアントとサーバーの両方が FQDN で載っている必要がある。 たとえばこんな感じ(実際の名前とは違います)。

127.0.1.1   client.domain.local client
192.168.1.2 server.domain.local server

サーバーの方は追記が必要。

必要パッケージインストール
root@client # apt-get install nfs-common
root@client # apt-get install krb5-user libpam-krb5

インストールの過程(設定)でレルム、ケルベロスサーバー、ケルベロス管理サーバーを訊いてくるので、サーバーで指定したものと同じものを指定する。

  • レルム:
    DOMAIN.LOCAL
  • ケルベロスサーバー (kdc):
    server.domain.local
  • ケルベロス管理サーバー (admin_server):
    server.domain.local
/etc/idmapd.conf の編集

ドメイン名を指定する

[General]
Domain = domain.local
NFS 用に Kerberos を設定する

kadmin コマンドを起動し、 NFS に必要なプリンシパルを追加する。

root@client # kadmin -p root/admin
...
kadmin:  addprinc -randkey host/client.domain.local
...
kadmin:  addprinc -randkey nfs/client.domain.local
...
kadmin:  quit

kadmin コマンドを起動し、 NFS に必要なキーを追加する。

root@client # kadmin -p root/admin
...
kadmin:  ktadd host/client.domain.local
...
kadmin:  ktadd nfs/client.domain.local
...
kadmin:  quit

これで /etc/krb5.keytab が作成される。

NFS のマウントをする

いろいろ方法はあるが、私は systemd の機能を使って自動マウントすることにした。

/etc/fstab を編集して以下のように指定する。

root@client # vi /etc/fstab
...
server.domain.local:/ /net    nfs    _netdev,noauto,x-systemd.automount,x-systemd.device-timeout=10,timeo=50,x-systemd.idle-timeout=1min,async,sec=krb5i 0 0
  • noauto: 実際に NFS アクセスされるまでマウントしない (OS boot 時にはマウントしない)
  • x-systemd.automount: systemd により自動マウントさせる
  • x-systemd.requires=network-online.target: ネットワーク関連サービスが起動してからマウントする
    これをやると systemd の depencency loop に陥るので、代わりに _netdev を指定する
  • x-systemd.idle-timeout=1min: NFS 共有が1分間使われなかったときに自動的にアンマウント
  • sec=krb5i: Kerberos 認証を使用

このように指定したらクライアント PC をリブートする。 あとは /net 配下をアクセスすればマウントされるはず。

NFS のマウントをする v2 【追記】

前述と結果的には同じだが、 systemd の unit を作成する方式 の方が筋がいいのかもしれない。

root@client # mkdir -p /usr/local/lib/systemd/system
root@client # vi  /usr/local/lib/systemd/system/net.mount
[Unit]
Documentation=NFS mount /net
After=remote-fs-pre.target

[Mount]
Where=/net
What=server.domain.local:/
Type=nfs
Options=sec=krb5i,timeo=50,async
TimeoutSec=10

[Install]
WantedBy=remote-fs.target
root@client # vi  /usr/local/lib/systemd/system/net.automount
[Unit]
Documentation=Automount /net

[Automount]
Where=/net
TimeoutIdleSec=1min

[Install]
WantedBy=remote-fs.target
root@client # systemctl enable net.automount

参考

« kmscon で Linux コンソールを日本語対応に | トップページ | GRUB で EFI への登録に失敗したら… »

Linux」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: NFSv4 + Kerberos 環境構築:

« kmscon で Linux コンソールを日本語対応に | トップページ | GRUB で EFI への登録に失敗したら… »

2024年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ