FreeBSD で NFS – (NFSサーバ設定と /etc/exports 詳解②)

NFS

FreeBSD の NFS について以前 Pukiwiki の「FreeBSD で NFS(Network File System) サーバ & クライアント」に纏めていましたが,当時 5.0 RELEASE の頃に纏めてましたのでだいぶ状況が変わってしまいました.
ですので今のバージョン 9.2-RELEASE をターゲットに改めて解説します.

前回「FreeBSD で NFS – (NFSサーバ設定と /etc/exports 詳解①)」で書いたとおり,/etc/exports 詳解の続編です.

/etc/exports 詳解

読み取り専用でマウント

読み取り専用で共有を行いたいシチュエーションはとても多いと思います.例えば,ISOイメージの共有などです.そういう場合は -ro オプションで設定することが可能です.
次の例は /usr は読み取り専用で,/pub は読み書き可能な共有を設定しています.

/usr     -ro -network 192.168.241.0 -mask 255.255.255.0
/pub     -network 192.168.241.0 -mask 255.255.255.0

指定したディレクトリ以下を任意にマウント

FreeBSD で NFS – (NFSサーバ設定と /etc/exports 詳解①)」で述べた「複数のディレクトリの共有」の場合,1行に複数のディレクトリを纏めて共有する方法を紹介しました.

/usr/src /usr/obj  -network 192.168.241.0 -mask 255.255.255.0

あまり推奨されない方法ですが,指定したディレクトリ以下のすべてのサブディレクトリを任意のマウントポイントとする方法があります.
次のように -alldirs オプションを使用します.

/usr    -alldirs -network 192.168.241.0 -mask 255.255.255.0

この設定では,/usr 以下の任意の場所を指定してマウントが可能になります.指定したディレクトリ以下全てが公開されますので,NFS を提供するネットワークにセキュリティ上の懸念が少ない場合に利用するなどの判断を行ってください.
なお,RedHat Enterprise Linux の NFS では,この動作がデフォルトのようです.

root ユーザアクセスの制御

オプションを指定しない場合,NFSクライアント上の root ユーザー(UID: 0)のアクセスは,UID/GID が -2:-2 という扱いになり,通常は nobody:nobody にマップされます.
そのため,NFS サーバ上の root が所有者のファイルは編集できません.これは,NFS v2/v3 では認証機能が殆どないため,セキュリティを担保するためです.

信頼できるネットワークやホストからの root アクセスを許可する場合は,-maproot オプションを使って明示的に許可する必要があります.
次の例は /pub に対する 192.168.241.0/24 のネットワークからの root アクセスを root ユーザーで処理する設定です.ただし,/usr には -maproot オプションをつけていないため,root アクセスは nobody にマップされたままです.

/usr    -network 192.168.241.0 -mask 255.255.255.0
/pub    -maproot=root -network 192.168.241.0 -mask 255.255.255.0

-maproot オプションには個別のユーザーアカウントを指定することができ,root アクセスの変換先を指定できます.指定方法によって,NFS アクセス時のマッピングが変化しますので注意が必要です.

-maproot=[user]

このようにユーザー名のみを指定した場合,指定されたユーザが所属するプライマリーグループが含まれます.ユーザーが所属するグループのいずれかが読み書きの権限を持つファイルに対してアクセスが可能となります.
なお,ドキュメント上ではユーザが所属する全てのグループが含まれると記載されていますが,9.2-RELEASEではそのような動作はしませんでした.

-maproot=[user]:[group1]:[group2]

このようにユーザー名とグループを指定した場合,ここで明記されたグループのみが含まれます.ユーザーおよび,指定されたグループに対する権限を持つファイルに対してのみアクセスが可能となります.

-maproot=[user]:

このように,ユーザー名のみを指定して最後をコロンで終えた場合,UID の変換は行われますが,GID の変換は行われません.そのため,指定したユーザーの UID に変換されますが,GID は 0 (wheel) のままとなります.
ドキュメントでは,この形式は指定したユーザーに関する完全な権限を区別するために利用されると記載されていますが,実際にはそのような動作とはなりませんでした.

例として,次のような環境での挙動を確認してみます.

# id seichan<br />uid=1000(seichan) gid=1000(seichan) groups=1000(seichan),10000(users)

# ls -l /pub
drwxrwxr-x  2 root     operator  512 Jan  6 10:56 .snap
-rw-r-----  1 root     wheel       0 Jan  6 10:57 file1
-rw-r-----  1 seichan  seichan     0 Jan  6 10:57 file2
-rw-r-----  1 seichan  wheel       0 Jan  6 10:57 file3
-rw-r-----  1 root     seichan     0 Jan  6 10:57 file4
-rw-r-----  1 root     users       0 Jan  6 10:58 file5
パターン1: -maproot が存在しない場合
/pub    -network 192.168.241.0 -mask 255.255.255.0

-maproot オプションが存在しない場合,NFS クライアント上の root ユーザーのアクセスは nobody ユーザーの権限で行われます.そのため,全てのファイルが Permission denied で読み取りに失敗します.

# cat file1
cat: file1: Permission denied
# cat file2
cat: file2: Permission denied
# cat file3
cat: file3: Permission denied
# cat file4
cat: file4: Permission denied
# cat file5
cat: file5: Permission denied
パターン2: -maproot=seichan の場合
/pub    -maproot=seichan -network 192.168.241.0 -mask 255.255.255.0

NFS サーバー上の seichan ユーザーおよび seichan が所属するプライマリーグループがマッピングされますので,ファイルオーナーが seichan のものもしくはグループオーナーが seichan のファイルの読み取りは可能となります.

# cat file1
cat: file1: Permission denied
# cat file2
# cat file3
# cat file4
# cat file5
cat: file5: Permission denied
パターン3: -maproot=seichan: の場合
/pub    -maproot=seichan: -network 192.168.241.0 -mask 255.255.255.0

NFS サーバー上では,ファイルオーナーが seichan である場合や,グループオーナーが wheel であるファイルについて,NFS クライアント側でのファイルアクセスが許可されます.この際、ユーザーは seichan にマップされますが、グループID(GID)は変更されず,そのまま渡されます.

# cat file1
# cat file2
# cat file3
# cat file4
cat: file4: Permission denied
# cat file5
cat: file5: Permission denied
パターン4: -maproot=seichan:seichan:users の場合
/pub    -maproot=seichan:seichan:users -network 192.168.241.0 -mask 255.255.255.0

NFS サーバー上で seichan ユーザーが所有するファイルや,グループが seichan および users であるファイルについて,NFS クライアントからの読み取りが可能となります.

# cat file1
cat: file1: Permission denied
# cat file2
# cat file3
# cat file4
# cat file5

-maproot オプションは,このように指定された値によって挙動が異なるため,個別のユーザアカウントにマップさせたい場合などには,事前に挙動を確認してからサービスをリリースするように心がけましょう.

全てのユーザアクセスの制御

先のオプションは -maproot と,root アクセス時の制御を行いましたが,NFS クライアント側のユーザアカウント及び UID にとらわれず,全てのアクセスを特定の ID にマップさせることも可能です.-mapall オプションがその機能を実現します.
-mapall オプションは -maproot オプションと同じ形式の指定が可能で,動作も同様の動作となります.

先のオプションである -maproot は、root アクセス時の制御を行いましたが,NFS クライアント側のユーザーアカウントや UID にとらわれず,全てのアクセスを特定の ID にマップさせることも可能です.
この機能を実現するのが -mapall オプションです.-mapall オプションは -maproot と同様の形式で指定が可能であり,動作も同様です.

以上,駆け足ではありましたが,/etc/exportsに関する詳細な解説でした.これは NFSv2/NFSv3 の基本的な設定に関する内容であり,今後はセキュリティやNFSv4などについても改めてまとめてみたいと考えています.

コメント

タイトルとURLをコピーしました