LPIC level2 リベンジ!! 第4日 『NFSサーバの設定』 | kyontra日記

LPIC level2 リベンジ!! 第4日 『NFSサーバの設定』

ちょっと日にちが空いてしまいました。すいません。

本日から「主題209:ファイルとサービスの共有」対策をお送りします。
今回を入れて多分4回くらい(NFSサーバ2回、Sambaサーバ2回)になると思います。

まず今回は「NFSサーバの設定」についてです。


NFS(Network File System)はネットワーク越しにファイルのマウントを実現する仕組みです。
NFSクライアント(NFSサーバを利用する側)はNFSサーバ上のディスクリソースを、あたかもローカルシステムかのように扱うことができます。

NFSはもともとサン・マイクロシステムズが開発した技術であり、性能の安定性という点ではSolarisが優位な気がしますが、LinuxのNFSサーバも十分利用できると思います。


◇NFSサーバの導入◇

CentOSでNFSサーバを利用する場合はyumコマンドでnfs-utilsをインストールします。
# yum install nfs-utils

インストールが完了したらサービスを開始します。同時にchkconfigから自動起動もONにしておくと、次回からOS起動と同時にサービスが立ち上がってくれます。また、NFSサーバを立ち上げるためにはportmapサービスが起動している必要があるようですので、合わせて起動しておきます。
# chkconfig portmap on
# chkconfig nfs on
# /etc/init.d/portmap start
portmap を起動中: [ OK ]
# /etc/init.d/nfs start
NFS サービスを起動中: [ OK ]
NFS クォータを起動中: [ OK ]
NFS デーモンを起動中: [ OK ]
NFS mountd を起動中: [ OK ]


◇NFSサーバの設定◇

NFSサーバの設定ファイルは/etc/exportsです。
/etc/exportsには公開するディレクトリ名公開するクライアント、(オプション)の順で記述します。
以下は今回作成した設定ファイルの内容です。
/etc/exports
/share1   192.168.19.0/255.255.255.0(rw)
/share2 192.168.19.0/255.255.255.0(rw)
/share3 192.168.19.0/255.255.255.0(rw)
どの行も192.168.19.0のネットワークにあるクライアントからの接続に対して読み書きの許可を与える設定です。/etc/exportsを修正したらexportfsコマンドを実行して、設定を反映させます。
# exportfs -ar

またエクスポートさせるディレクトリの権限・所有者は以下のようになっています。
# ls -Ald /share*
drwxr-xr-x 2 root root 4096 1月 18 21:50 /share1
drwxr-xr-x 2 kyontora kyontora 4096 1月 18 21:50 /share2
drwxrwxrwx 2 root root 4096 1月 18 21:51 /share3

さて、この状態でNFSクライアントからの接続を行ってみます。(今回はNFSサーバとNFSクライアントを同一マシンとして作業を行いました。)
NFSサーバがどのディレクトリをエクスポートしているかは、showmountコマンドを使用して確認することができます。
# showmount -e 192.168.19.219
Export list for 192.168.19.219:
/share3 192.168.19.0/255.255.255.0
/share2 192.168.19.0/255.255.255.0
/share1 192.168.19.0/255.255.255.0

NFSリソースのマウントは通常のマウントと同様にmountコマンドで行います。オプションは「-t nfs」とします。(/etc/fstabに記述すれば、OS起動時に自動でマウントしてくれます)
# mount -t nfs 192.168.19.219:/share1 /mnt1
# mount -t nfs 192.168.19.219:/share2 /mnt2
# mount -t nfs 192.168.19.219:/share3 /mnt3

コマンド実行後、dfコマンドでマウントしていることを確認します。
# df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/hda1 7609680 2052896 5164000 29% /
tmpfs 127720 0 127720 0% /dev/shm
192.168.19.219:/share1
7609696 2052896 5164000 29% /mnt1
192.168.19.219:/share2
7609696 2052896 5164000 29% /mnt2
192.168.19.219:/share3
7609696 2052896 5164000 29% /mnt3

マウントが完了したので、実際にマウントしたディレクトリに読み書きの操作を行ってみます。
都合上、ユーザをkyontoraに切り替えておきます。
# su - kyontorar
$

さて、ここで問題です。ユーザkyontoraで/mnt1、/mnt2、/mnt3へファイル作成操作を行った場合に失敗するディレクトリが一つあります。それはどれでしょうか?

正解は/mnt1です。解説をする前にまずはコマンドの結果を載せておきます。
$ touch /mnt1/test1.txt
touch: cannot touch `/mnt1/test1.txt': 許可がありません
$ touch /mnt2/test2.txt
$ touch /mnt3/test3.txt

エラー内容からわかるように、失敗の原因は権限です。では、権限のどこに問題があるかを見てみましょう。
作成に成功したものについて、作成されたファイルの権限はつぎのようになっています。
-rw-rw-r-- 1 kyontora kyontora 0  1月 18 22:18 /mnt2/test2.txt
-rw-rw-r-- 1 kyontora kyontora 0 1月 18 22:18 /mnt3/test3.txt

今回、NFSサーバとNFSクライアントが同じホスト上であったのでわかりずらいかも知れませんが、NFSクライアント上のユーザkyontoraがファイルを作成したのはNFSサーバ上のディレクトリです。にもかかわらず、作成されたファイルのオーナーはNFSクライアントのユーザです。
次回以降で紹介するSambaは作成されたファイルのオーナーはSambaサーバ上のユーザになりますが、NFSではNFSクライアントのユーザ(UID)で作成されることに注意してください。つまり、NFSサーバでリソースをエクスポートする場合、エクスポートするディレクトリにはNFSクライアントが使用するユーザ(UID)に対して権限をつけてやる必要があります。
今回の例では/mnt3はディレクトリの権限を777にしてあるのですべてのユーザ(UID)に対して書き込み権限があり、/mnt2は権限は755ですが、ディレクトリのオーナーをkyontora(NFSクライアントのユーザと同じUID)にしていたので書き込みが可能でした。

さて、ではNFSクライアントがrootユーザで接続してきた場合にはNFSサーバ上でもrootユーザとしてファイル操作が行われるのでしょうか?
NFSクライアントのユーザをrootとして、再度マウントしたディレクトリに書き込みテストをしてみます。
# touch /mnt1/test1_2.txt
touch: cannot touch `/mnt1/test1_2.txt': 許可がありません
# touch /mnt2/test2_2.txt
touch: cannot touch `/mnt2/test2_2.txt': 許可がありません
# touch /mnt3/test3_2.txt

なんと、/mnt3しか書き込みに成功しませんでした。/mnt1も/mnt2もrootユーザに対して書き込み権限があるのですが、なぜ失敗したのでしょうか?
作成に成功したファイルの属性を確認すると、実はrootユーザとして作成していなかったことがわかります。
-rw-r--r-- 1 nfsnobody nfsnobody 0  1月 18 22:46 /mnt3/test3_2.txt

実はNFSクライアントがrootユーザとしてNFSサーバへアクセスした場合、root権限を許可することはセキュリティ上危険であるという考えの下、匿名ユーザ権限として操作を行っていたのです。(これはNFSサーバのオプションの規定値であり、オプションによってはroot権限のまま操作を行うことも可能です。)

/etc/exportsのオプションの一部を紹介しておきます。
オプション説明
ro読み込み専用でエクスポートします。(規定値設定)
rw読み書き許可を与えエクスポートします。
root_squashNFSクライアントからrootでアクセスされた場合に匿名ユーザとしてファイル操作を行います。(規定値設定)
no_root_squashNFSクライアントからrootでアクセスされた場合にrootとしてファイル操作を行います。
all_squashすべてのユーザでのアクセスを匿名ユーザとしてファイル操作を行います。
no_all_squashすべてのユーザのアクセスをそのままのユーザ(UID)としてファイル操作を行います。
anonuid=nnすべてのユーザのアクセスをUID=nnとしてファイル操作を行います。
anongid=nnすべてのユーザのアクセスをGID=nnとしてファイル操作を行います。

/etc/exportsのオプションは複数設定することができます。また、ひとつの公開ディレクトリに対して異なるクライアントに対して別々のオプションを設定することも可能です。
/share1   192.168.19.0/255.255.255.0(rw)
/share2 192.168.19.0/255.255.255.0(rw)
/share3 192.168.19.0/255.255.255.0(rw)
/share4 192.168.20.1(rw) 192.168.20.2(rw, no_root_squash)



次回はNFSクライアントのマウントオプションについてちょこっと紹介してから、LPICオリジナル練習問題を掲載します。


それから、やっぱり試験日を延期しました。。
1月は都合がつかなそうなので2月予定です。