Product SiteDocumentation Site

11.4. NFS ファイルサーバ

NFS (Network File System) はネットワークを介したファイルシステムへのリモートアクセスをつかさどるプロトコルです。すべての Unix システムは NFS プロトコルを取り扱うことが可能です。一方で Windows システムを参加させる場合、代わりに Samba を使わなければいけません。
NFS はとても役に立つツールです。しかし、歴史的に言えば NFS には数多くの制約があり、NFS プロトコルのバージョン 4 になってほとんどの制約がなくなりました。制約がなくなったことによる欠点として、NFS の最新版では認証や暗号化などの基本的なセキュリティ機能を有効化するよう設定するのがさらに難しくなったという点が挙げられます。なぜなら、NFS の最新版ではこれらの機能は Kerberos に依存しているからです。認証や暗号化機能を有効化しない場合、NFS プロトコルを使うのは信用できるローカルネットワークだけに留めるべきです。なぜなら、ネットワークを流れるデータは暗号化されませんし (スニファを使えば内容を傍受することが可能ですし)、アクセス権はクライアントの IP アドレスに基づいて決定されるからです (IP アドレスはなりすまし可能です)。

11.4.1. NFS の安全確保

Kerberos に基づくセキュリティ機能を使わない場合、NFS の利用を許可されたマシンだけが種々の要求された RPC サーバに接続できるような制限を加えることが不可欠です。なぜなら、NFS の基本的なプロトコルはネットワークから受け取った情報を信頼するからです。ファイアウォールは外部のマシンが内部のマシンのように振る舞うことを避けるために IP なりすましをブロックし、NFS 共有にアクセスするように意図されたマシンだけが適切なポートにアクセスするように制限しなければいけません。
NFS プロトコルの古いバージョンでは他の RPC サービスが必要で、この RPC サービスは動的に割り当てられたポートを使います。幸いなことに、NFS バージョン 4 ではポート 2049 番 (NFS 用) と 111 番 (portmapper 用) が固定されており、そのため簡単にポートにファイアウォールをかませることが可能です。

11.4.2. NFS サーバ

NFS サーバは Linux カーネルの一部です。そして Debian の提供するカーネルでは、NFS サーバをカーネルモジュールとしてビルドしています。NFS サーバを起動時に自動的に実行するには、nfs-kernel-server パッケージをインストールしてください。このパッケージには、対応する起動スクリプトが含まれます。
NFS サーバの設定ファイル /etc/exports には、ネットワークを介して利用できるようにする (エクスポートされる) ディレクトリをリストします。各 NFS 共有について、リストされたマシンだけがアクセスを許可されます。よりきめ細かなアクセス制御を行うには、いくつかのオプションを使います。/etc/exports ファイルの構文はとても単純です。
/directory/to/share machine1(option1,option2,...) machine2(...) ...
NFSv4 では、すべてのエクスポートされるディレクトリは一つの基準ディレクトリの下位に属さなければいけません。また、その基準ディレクトリは必ずエクスポートされ、オプション fsid=0 または fsid=root で識別されなければいけません。これらの点に注意してください。
各マシンは DNS 名か IP アドレスのどちらか一方を使って識別されます。マシン群全体を指定するには、*.falcot.com などの構文を使うか 192.168.0.0/255.255.255.0192.168.0.0/24 などの IP アドレス範囲を使います。
ディレクトリはデフォルトで (または ro オプションを使えば) 読み込み専用として利用できるようにされます。rw オプションを使えば読み書きアクセスが許可されます。典型的に NFS クライアントは root だけが使えるポート (言い換えれば、1024 番よりも低い番号のポート) から接続します。高いポート番号を使うクライアントからの接続を受け入れるには、insecure オプションを使います (secure オプションは暗黙的に有効化されていますが、明示する必要があればオプションを明示することも可能です)。
デフォルトの状態では、サーバが NFS 問い合わせに応答するのは、現在のディスク操作が完了した (sync オプション) 後です。これを無効化するには、async オプションを使います。非同期書き込みを使うことで、性能はほんの少し向上しますが、信頼性は低下します。なぜなら、書き込み確認とディスクへの実際の書き込みの間にサーバがクラッシュした場合に、データを損失する危険性があるからです。デフォルト値が sync に変更されたのは最近なので (NFS バージョンによってデフォルト値が違うので)、明確に sync オプションを設定することを推奨します。
NFS クライアントがファイルシステムに root 権限でアクセスすることを許可しないために、サーバは root ユーザからのすべての問い合わせを nobody ユーザからの問い合わせとして処理します。この挙動は root_squash オプションを使った場合の挙動に対応し、root_squash オプションはデフォルトで有効化されています。no_root_squash オプションを使うことで、この挙動は無効化されますが、no_root_squash オプションは危険であり管理されない環境で使うべきではありません。anonuid=uidanongid=gid オプションを使うことで、UID/GID 65534 (これは nobody ユーザと nogroup グループに対応します) の代わりに使う別の偽ユーザを指定することが可能です。
NFSv4 では sec オプションを追加してセキュリティレベルを指定することが可能です。デフォルト設定の sec=sys は特別なセキュリティ機能を有効化しません。sec=krb5 は認証機能だけを有効化します。sec=krb5i は認証と整合性保護機能を有効化します。sec=krb5p はすべての機能、すなわち認証、整合性保護、プライバシー保護機能 (データ暗号化機能を含みます) を有効化します。これらを使うには、Kerberos サービスを動作させる必要があります (Kerberos サービスについては本書で解説されていません)。
他のオプションも利用できます。オプションは exports(5) マニュアルページで説明されています。

11.4.3. NFS クライアント

他のファイルシステムと同様、NFS 共有をシステムの階層構造に統合するにはマウント作業が必要です。NFS 共有ファイルシステムは特殊なので、mount コマンドと /etc/fstab ファイルにいくつかの調整を行うパラメータを含める必要があります。

例 11.22 mount コマンドを用いた手作業によるマウント

# mount -t nfs4 -o rw,nosuid arrakis.internal.falcot.com:/shared /srv/shared

例 11.23 /etc/fstab ファイルの NFS エントリ

arrakis.internal.falcot.com:/shared /srv/shared nfs4 rw,nosuid 0 0
上の例で示したエントリを使うことで、システム起動時に arrakis サーバの /shared/ NFS ディレクトリがローカルの /srv/shared/ ディレクトリにマウントされます。ここでは読み書きアクセスを要求しています (このため rw パラメータを追加しています)。nosuid オプションは一種の保護手段で、共有ディレクトリに保存されているプログラムに設定された setuid または setgid ビットを無効化します。文書を保存するだけの目的で NFS 共有を使っている場合、noexec オプションを追加することを推奨します。これは共有ディレクトリに含まれるプログラムの実行を避けるものです。NFS サーバ上では shared ディレクトリは NFSv4 ルートエクスポート (たとえば /export/shared) の下位に属すディレクトリであり、最上位ディレクトリではありません。この点に注意してください。
nfs(5) マニュアルページでは、すべてのオプションをについて詳しく説明されています。