Contents
Overview
NFS サーバーを構築します。
NFS (Network File System) は、主に UNIX/Linux システムでファイルを共有するためのプロトコルであり、NFSv4 は RFC 7530 で定義されています。NFS はファイル共有を目的としますが、UNIX/Linux は主にサーバーとして使用される OS であるため、その性質上、一般のユーザーが NFS を意識することは通常ではありません。NFS は主に v3 と v4 が使用されますが、最近では v4 を使うことが一般的であり、v3 をサポートしないシステムも存在します。一方で、まだ v3 を推奨しているシステムもありますが、強い制約がなければ v4 を使いましょう。
前提条件
- こちらを参考に基本設定が完了していること。
インストール
NFS サーバーをインストールします。
myadmin@ubuntu:~$ sudo apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install nfs-kernel-server
/etc/nfs.conf
/etc/nfs.conf を設定します。
デフォルト値
デフォルト値は下記の通りです。
myadmin@ubuntu:~$ grep -v -e '^\s*#' -e '^\s*$' /etc/nfs.conf | expand | tr -s [:space:] | sed 's/^\s/ /g'
[general]
pipefs-directory=/run/rpc_pipefs
[exports]
[exportfs]
[gssd]
[lockd]
[mountd]
manage-gids=y
[nfsdcld]
[nfsdcltrack]
[nfsd]
[statd]
[sm-notify]
[svcgssd]
設定値
設定例は下記の通りです。本稿の例では NFSv3 を無効化しています。この場合、NFSv4 だけが有効になります。NFSv3 は利用する強い理由(例えば NFS を利用する側が NFSv3 を推奨するなど)がない限り、無効化しておくと良いでしょう。また、デフォルトの設定値の存在しないセクションは削除しています。
myadmin@ubuntu:~$ sudo cp /etc/nfs.conf /etc/nfs.conf.orig
myadmin@ubuntu:~$ sudo tee /etc/nfs.conf <<"EOF"
[general]
pipefs-directory=/run/rpc_pipefs
[mountd]
manage-gids=y
[nfsd]
vers3=n
EOF
/etc/exports
/etc/exports を設定します。
デフォルト値
デフォルト値は全ての設定がコメントアウトされています。
設定値
設定例は下記の通りです。
- /srv/nfs に対して 10.1.0.0/24, fd00::a01:0/120 から全ての操作を許可しています。ro がデフォルト値であり、明示的に rw を指定しない場合は書き込みができません。
- subtree_check は、ファイルアクセス時に共有しているディレクトリの親ディレクトリがアクセス可能な状態であるかの権限等のチェックを行います。これによりセキュリティ強度は上がりますが、少し負荷が高まります。また、リモートからファイルにアクセス中にファイル名がローカルで変更されてしまうと影響を受ける可能性があります。この環境では問題ありませんが、負荷状況などに応じて no_subtree_check への変更も検討します。
- User ID Mapping は root_squash, no_all_squash がデフォルト値となり、root でのアクセスに関しては、匿名 UID/GID として扱われます。これはセキュリティ上の推奨です。この設定は UID/GID を適切に管理している環境においては良いと思いますが、例えば Kubernetes のように、デプロイするコンテナにより、不特定な UID/GID が存在する場合は不向きです。以下の例では no_root_squash としていますが、用途に応じて適切に設定してください。
myadmin@ubuntu:~$ sudo cp /etc/exports /etc/exports.orig
myadmin@ubuntu:~$ sudo tee /etc/exports <<"EOF"
/srv/nfs 10.1.0.0/24(rw,no_root_squash,subtree_check) fd00::a01:0/120(rw,subtree_check)
EOF
以下は man exports
の内容を参考にした User ID Mapping に関する説明です。root_squash (no_root_squash), all_squash (no_all_squash) は個別に機能する設定です。
設定値 | 説明 |
---|---|
root_squash | UID/GID 0 から匿名 UID/GID へのリクエストをマップします。つまり、root で NFS サーバーにアクセスする場合、匿名 UID/GID として扱われます。ただし、bin ユーザーや staff グループなど、機密性の高い UID や GID には適用されません。これはデフォルト値です。 |
no_root_squash | root_squash の反対です。 |
all_squash | UID/GID 0 を除くすべての UID と GID を匿名ユーザーにマップします。様々なサイトで「UID/GID 0 を含む」と記載があるのですが、私の検証した結果では「UID/GID 0 を除く」が実際の挙動になりました。私の検証の正しさを含め、継続調査をしたいと思います。 |
no_all_squash | all_squash の反対です。これはデフォルト値です。 |
anonuid, anongid | これらのオプションは、匿名 UID と GID を明示的に設定します。 |
User ID Mapping
NFS ディレクトリの作成
NFS で公開するディレクトリを作成します。このディレクトリは任意ですが、システム上、重要なディレクトリは原則として含めないことを推奨します。
myadmin@ubuntu:~$ sudo mkdir -p /srv/nfs
設定の有効化
設定を有効化します。
myadmin@ubuntu:~$ sudo systemctl restart nfs-server.service && systemctl status nfs-server.service