6.4. 設定例

6.4.1. NFS を使ってディレクトリを共有する

NFS と SELinux を使ったディレクトリの作成と共有の例を示します。 2 台のホストを使用しています。 ホスト名が nfs-srv で IP アドレスが 192.168.1.1の NFS サーバーと、 ホスト名が nfs-client で IP アドレスが 192.168.1.100 のクライアントです。 いずれのホストも同じサブネット (192.168.1.0/24) 上にあります。これは一例に過ぎません。 また、 nfs-utils パッケージがインストールされていること、 SELinux targeted ポリシーを使用していること、 SELinux は enforced モードで実行していることを前提としています。
NFS を介した全ユーザーへのアクセスが Linux ファイルパーミッションで与えられ、 ネットワークへのアクセスにも制限がない状態であっても、 SELinux の Boolean を使って適切なパーミッションを与えない限り、 SELinux で NFS ファイルシステムがマウントされないよう防ぐことができます。

6.4.1.1. サーバーのセットアップ

次のステップ 1 からステップ 10 までは NFS サーバー nfs-srv で行なってください。
  1. setsebool コマンドを実行し、 NFS ファイルシステムの読み取りと書き込みでのマウントを無効にします。
    setsebool -P nfs_export_all_rw off

    注記

    再起動後、 setsebool による変更を維持したくない場合は -P オプションを使用しないでください。
  2. rpm -q nfs-utils を実行して、 nfs-utils パッケージがインストールされているか確認します。 nfs-utils パッケージにより NFSを使用するためのサポートプログラムが提供されるため、 このパッケージは NFS サーバーおよび使用中のすべてのクライアントにインストールしてください。 このパッケージがインストールされていない場合は、 root ユーザーで yum install nfs-utils を実行してインストールしてください。
  3. root で mkdir /myshare を実行して、 NFS を使って共有するディレクトリを最上位に新規作成します。
  4. root ユーザーで touch /myshare/file1 を実行して共有エリア内に新規で空のファイルを作成します。 このファイルがクライアントによってアクセスされることになるファイルになります。
  5. 全ユーザーへのアクセスが Linux パーミッションにより完全に与えられていても、 SELinux でアクセスをブロックすることができることを確認するため、 /myshare ディレクトリに誰でもアクセスできる Linux のフルアクセス権限を与えます。
    # chmod -R 777 /myshare

    警告

    これは説明を目的とした用例に過ぎません。 実稼働のシステムにはここで示すパーミッションを使用しないでください。
  6. /etc/exports ファイルを編集して、 次の行をファイルの先頭に追加します。
    /myshare 	192.168.1.100(rw)
    
    このエントリでは、サーバー上の共有フォルダ /myshare へのフルパス、nfs-srv が共有するホストやネットワークの範囲 (この例の場合は単一ホスト nfs-client の IP アドレス 192.168.1.100)、共有パーミッションを示しています。ここでは (rw) でわかるように、読み取りと書き込みのパーミッションが与えられています。
  7. NFS に使用する TCP と UDP のポートが rpcbind により動的に割り当てられますが、ファイアウォールルールを作成する際、これが問題となる場合があります。この例では、 NFS トラフィックがファイアウォールを通過できるようにするプロセスを簡略化するため、/etc/sysconfig/nfs ファイルを編集して、MOUNTD_PORTSTATD_PORTLOCKD_TCPPORTLOCKD_UDPPORT の変数をすべてアンコメントします。ここではファイル内のポート番号の変更は必要ありません。
    着信接続がサーバーのファイアウォールを必ず通過できるようにしておきます。system-config-firewall ツールを使って行ないます。
    • NFS 用 TCP および UDP ポートの 2049
    • TCP および UDP ポートの 111 (rpcbind/sunrpc)
    • MOUNTD_PORT="port" オプションで指定された TCP および UDP ポート
    • STATD_PORT="port" オプションで指定された TCP および UDP ポート
    • LOCKD_TCPPORT="port" オプションで指定された TCP ポート
    • LOCKD_UDPPORT="port" オプションで指定された UDP ポート
  8. root ユーザーで service nfs start を実行して、 NFS および関連サービスを起動させます。
    # service nfs start
    Starting NFS services:		[  OK  ]
    Starting NFS quotas:		[  OK  ]
    Starting NFS daemon:		[  OK  ]
    Starting NFS mountd:		[  OK  ]
    
  9. root で exportfs -rv を実行し、 NFS サブシステムのエクスポートテーブルを必ず更新させます。
    # exportfs -rv
    exporting 192.168.1.100:/myshare
    
  10. root ユーザーで showmount -e を実行し、 エクスポートされたファイルシステムをすべて表示させます。
    # showmount -e
    Export list for nfs-srv:
    /myshare 192.168.1.100
    
これで、 サーバー nfs-srv192.168.1.100 での nfs-client との NFS 通信が許可されるよう設定され、 Linux ファイルシステムの全権限が有効にされました。 SELinux を無効にすると、 クライアントによるこの共有のマウントおよびフルアクセスが可能になります。 しかし、 nfs_export_all_rw Boolean を無効にしているため、 以下の出力で示すように、 クライアントは現在、 このファイルシステムをマウントすることができません。 このステップはクライアント側 (nfs-client) で行なってください。
[nfs-client]# mkdir /myshare
[nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare
mount.nfs: access denied by server while mounting 192.168.1.1:/myshare/
前述のステップ 1 で無効にした SELinux Boolean を有効にすると、 クライアント側で共有ファイルシステムのマウントが行なえるようになります。 このステップは NFS サーバー nfs-srv で行なってください。
[nfs-srv]# setsebool -P nfs_export_all_rw on
NFS デーモンを再起動します。
[nfs-srv]# service nfs restart
ここでもう一度 NFS ファイルシステムをマウントしてみます。 このステップは NFS クライアント nfs-client で行なってください。
[nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare
[nfs-client]#
[nfs-client]# ls /myshare
total 0
-rwxrwxrwx.  1 root root 0 2009-04-16 12:07 file1
[nfs-client]#
クライアント側でファイルシステムが正しくマウントされました。 この例でわかるように、 SELinux で防御性を高めることにより、Linux パーミッションでは全ユーザーに完全アクセスが与えられるよう設定されていても、SELinux のパーミッションを強制することができます。