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」カテゴリの記事
- Debian Linux を Secure Boot 環境で使う(2023.03.06)
- コンテナで GUI / GPU を使う(2022.10.19)
- 仮想環境のイメージ格納場所の移動(2022.09.10)
- Kodi の設定(2019.12.02)
- メインマシンを AMD Ryzen 5 2400G に(2019.06.24)
« kmscon で Linux コンソールを日本語対応に | トップページ | GRUB で EFI への登録に失敗したら… »
コメント