私は、いくつかの簡単な変更を加えることで、もう少し安全で安全なものにすることができる、広く開かれた NFS サーバーを数多く見てきました。これは簡単で、物事をもう少し安全にするためのガイドです。これは決して NFS を保護するための完全なガイドではありませんが、多大な努力をしなくても物事をもう少し安全にすることができます。別のレベルに進むには、NFSv4 と Kerberos の実装を検討します。
エクスポートの基本オプションには次のものがあります:
- no_all_squash :このオプションは、すべてのスカッシュを無効にします。
- 前 :このオプションは、NFS サーバーが NFS ボリュームで読み取り要求と書き込み要求の両方を使用できるようにします。
- ろ :このオプションは、NFS サーバーが NFS ボリュームで読み取り専用要求を使用できるようにします。
- 同期 :このオプションを使用すると、変更が安定したストレージにコミットされた後にのみ、NFS サーバーがリクエストに応答できるようになります。
- 非同期 :このオプションにより、NFS サーバーは NFS プロトコルに違反し、変更が安定したストレージにコミットされる前にリクエストに応答できます。
- 安全 :このオプションでは、リクエストがインターネット ポートで発信されている必要があります。
- 不安 :このオプションは、一部またはすべてのポートを受け入れます。
- wdelay :このオプションを使用すると、NFS サーバーは、別の関連する書き込み要求が進行中であるか、すぐに到着する可能性があると疑われる場合に、ディスクへの書き込み要求のコミットを遅らせることができます。
- no_wdelay :このオプションを使用すると、NFS サーバーは、1 回の操作で複数の書き込み要求をディスクにコミットできるようになります。この機能によりパフォーマンスが向上しますが、NFS サーバーが多数の小さな要求を受信すると、この動作がパフォーマンスの低下につながる可能性があります。 async も設定されている場合、このオプションは効果がないことに注意してください。
- subtree_check :このオプションは、サブツリーのチェックを有効にします。
- no_subtree_check :このオプションはサブツリーのチェックを無効にします。これには暗黙のセキュリティ上の問題がありますが、信頼性を向上させることができます。
- anonuid=UID :これらのオプションは、匿名アカウントの uid と gid を明示的に設定します。これは、すべてのリクエストを 1 人のユーザーからのものとして表示したい場合に便利です。
- anongid=GID :このオプションは anonuid=UID を無効にします。
root_squash とは
root_squash は、クライアントの root ユーザーが root として NFS サーバーにアクセスし、ファイルを作成できるようにします。技術的に言えば、このオプションは NFS にクライアントのルートを匿名 ID に強制的に変更させ、事実上、あるシステムのルート アカウントの所有権が別のシステムに移行するのを防ぐことでセキュリティを強化します。これは、NFS サーバーでルート ファイルシステムをホストしている場合 (特にディスクレス クライアントの場合) に必要です。これを念頭に置いて、選択したホストに (控えめに) 使用できますが、結果を認識していない限り、no_root_squash を使用しないでください。
SUID と NFS
suid は、ユーザーがファイルを実行したときに、ファイルの所有者の権限をユーザーが引き受ける方法です。なぜ私はこれを気にするのですか?ユーザーがファイルを NFS ボリュームにコピーし、ファイルの suid ビットを有効にしてから、NFS サーバーまたはクライアントでそれを実行し、そのプロセスで自分自身を効果的にルートに昇格させることができたとしたらどうでしょうか?
リスクを示す例を次に示します。
NFS サーバーのホスト名はサーバー、NFS クライアントのホスト名はクライアントです。サンプル ネットワークのサブネットは 192.168.1.0/24 です。この例では、OS のメジャー バージョンが一致している限り、両方のシステムが同じ OS バージョン (つまり、両方が RHEL 7、または両方が SLES 12) を実行していることも前提としています。
1. NFS サーバーで一時ディレクトリ (/export/test) を作成し、次のオプションでエクスポートします (192.168.1.0/255.255.255.0 を独自のネットワーク/ネットマスクに置き換えます):
server# vi /etc/exports /export/test 192.168.1.0/255.255.255.0(no_root_squash,insecure,rw)
2. NFS サーバーを再起動します。これは、Linux のフレーバーによってさまざまです..
RHEL:
server# systemctl restart nfs
スース:
server# systemctl restart nfsserver
3. クライアント マシンで、エクスポートをマウントします。
client# mkdir /mnt/nfstest client# mount -t nfs server:/export/test /mnt/nfstest
4. クライアントで root ユーザーとして vi バイナリを NFS マウントにコピーします。
client# which vi —— output ——— /usr/bin/vi
client# cp /usr/bin/vi /mnt/nfstest
5. コピーしたバイナリに suid ビットを設定します。
client# chmod u+s /mnt/nfstest/vi
6. 非特権ユーザーとして nfs サーバーに SSH 接続します。非特権ユーザーとして、サーバー上のエクスポートされたマウントにある vi を実行します。
server$ /export/test/vi /etc/passwd
7. パスワード ファイルで非特権アカウントを見つけ、UID を 0 に変更し、保存してログアウトし、非特権ユーザーとして再度ログインします。ユーザーは root になりました。
クライアントでも同じことができます。通常のユーザーとして NFS マウントから vi を実行すると、ホスト上の任意のファイルを指すことができ、root として編集できるようになります。考えられるあらゆるバイナリで動作します。
これを回避するには?
1. まず、export ディレクトリから vi ファイルを削除します:)。次に、root_squash を有効にします。 NFS エクスポートで。サーバーで /etc/exports を再度編集し、no_root_squash を root_squash に変更します。
server# vi /etc/exports /export/test 192.168.1.0/255.255.255.0(root_squash,insecure,rw)
2. NFS サーバーを再起動し、クライアントにファイルシステムを再マウントします:
server# systemctl restart nfs
client# umount /mnt/test client# mount -t nfs server:/export/test /mnt/nfstest
3. クライアントから、root として NFS マウントにいくつかのファイルを作成し、権限を確認します。
client# touch /mnt/nfstest/{test1,test2,test3}
/export/test に設定されたパーミッションに応じて、パーミッションが拒否されるか、ディレクトリが誰でも書き込み可能である場合、ファイルのパーミッションは次のようになります:
-rw-r--r-- 1 65534 65534 0 Nov 6 2015 test1 -rw-r--r-- 1 65534 65534 0 Nov 6 2015 test2 -rw-r--r-- 1 65534 65534 0 Nov 6 2015 test3
root_squash は、ルート UID を匿名ユーザーの uid に再マッピングしています。この uid は exports ファイルで設定可能です。詳細については man /etc/exports を参照してください。 vi コマンドを (許可されている場合) クライアントの root として nfs ボリュームに再度コピーし、上記の手順を繰り返します (/etc/passwd で vi を実行してサーバーに ssh します)。今回は、ファイルを保存する権限がありません。権限は非特権アカウントに昇格されます。
これはもう少し安全ですが、まだ完了していません。実行できるもう 1 つの手順は、nosuid オプションを使用して、エクスポートされたファイルシステムを NFS サーバーにマウントすることです。
server# vi /etc/fstab
4. /export/ のマウント ポイントを見つけて、オプション列のデフォルトを次のように変更します。
/dev/mapper/sys_vg-export_lv /export ext3 defaults 0 0 /dev/mapper/sys_vg-export_lv /export ext3 nosuid 0 0
5. マウントを再マウントします:
server# mount -o remount /export
6. vi ファイルをマウントにダンプし、suid ビットを設定し、非特権アカウントに切り替えて、再試行します。
server# cp /usr/bin/vi /export/test; chmod u+s /export/test/vi
server# su - someuser server$ /export/test/vi /etc/passwd
渡されたファイルに変更を加えた後、変更を保存することはできません。
7. 非特権ユーザーとしてクライアントにジャンプし、同じことを試してください:
client$ /export/test/vi /etc/passwd
それでも機能しますが、クライアントも nosuid オプションで再マウントする必要があります:
client# mount -t nfs -o nosuid server:/export/test /mnt/nfstest
非特権アカウントで再度テストすると、失敗するはずです。
マウント ポイントで指定できる他のオプションがいくつかあり、それらから実行できるものをさらに制限します。noexec (実行可能ファイルなし)、nodev (デバイス ファイルなし) を確認してください。さらにセキュリティが必要な場合は、Kerberos と NFSv4 を調べてください。