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
で行なってください。
setsebool
コマンドを実行し、 NFS ファイルシステムの読み取りと書き込みでのマウントを無効にします。setsebool -P nfs_export_all_rw off
注記
再起動後、setsebool
による変更を維持したくない場合は-P
オプションを使用しないでください。rpm -q nfs-utils
を実行して、 nfs-utils パッケージがインストールされているか確認します。 nfs-utils パッケージにより NFSを使用するためのサポートプログラムが提供されるため、 このパッケージは NFS サーバーおよび使用中のすべてのクライアントにインストールしてください。 このパッケージがインストールされていない場合は、 root ユーザーでyum install nfs-utils
を実行してインストールしてください。- root で
mkdir /myshare
を実行して、 NFS を使って共有するディレクトリを最上位に新規作成します。 - root ユーザーで
touch /myshare/file1
を実行して共有エリア内に新規で空のファイルを作成します。 このファイルがクライアントによってアクセスされることになるファイルになります。 - 全ユーザーへのアクセスが Linux パーミッションにより完全に与えられていても、 SELinux でアクセスをブロックすることができることを確認するため、
/myshare
ディレクトリに誰でもアクセスできる Linux のフルアクセス権限を与えます。# chmod -R 777 /myshare
警告
これは説明を目的とした用例に過ぎません。 実稼働のシステムにはここで示すパーミッションを使用しないでください。 /etc/exports
ファイルを編集して、 次の行をファイルの先頭に追加します。/myshare 192.168.1.100(rw)
このエントリでは、サーバー上の共有フォルダ/myshare
へのフルパス、nfs-srv
が共有するホストやネットワークの範囲 (この例の場合は単一ホストnfs-client
の IP アドレス192.168.1.100
)、共有パーミッションを示しています。ここでは(rw)
でわかるように、読み取りと書き込みのパーミッションが与えられています。- NFS に使用する TCP と UDP のポートが rpcbind により動的に割り当てられますが、ファイアウォールルールを作成する際、これが問題となる場合があります。この例では、 NFS トラフィックがファイアウォールを通過できるようにするプロセスを簡略化するため、/etc/sysconfig/nfs ファイルを編集して、
MOUNTD_PORT
、STATD_PORT
、LOCKD_TCPPORT
、LOCKD_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 ポート
- root ユーザーで
service nfs start
を実行して、 NFS および関連サービスを起動させます。# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ]
- root で
exportfs -rv
を実行し、 NFS サブシステムのエクスポートテーブルを必ず更新させます。# exportfs -rv exporting 192.168.1.100:/myshare
- root ユーザーで
showmount -e
を実行し、 エクスポートされたファイルシステムをすべて表示させます。# showmount -e Export list for nfs-srv: /myshare 192.168.1.100
これで、 サーバー
nfs-srv
は 192.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 のパーミッションを強制することができます。