Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.7. NFS のセキュア化

NFS は、多数の既知のホストと、ファイルシステム全体を透過的に共有する場合に適しています。ただし、使いやすさがある反面、さまざまなセキュリティー問題を伴います。サーバーで NFS ファイルシステムをエクスポートする場合や、クライアントにマウントする際に、NFS セキュリティーリスクを最小限に抑え、サーバーのデータを保護するには、以下のセクションを検討してください。

8.7.1. AUTH_SYS とエクスポート制御による NFS セキュリティー保護

従来より、NFS ではエクスポートしたファイルへのアクセスを制御するために 2 種類のオプションを提供しています。
最初に、サーバーが、IP アドレスまたはホスト名で、どのファイルシステムをマウントするかを制限します。
2 つ目は、ローカルユーザーと同じ方法で、サーバーが NFS クライアント上のユーザーに対してファイルシステムの権限を強制するオプションです。従来は、AUTH_SYS ( AUTH_UNIXとも呼ばれます)を使用してこれを行い、クライアントに依存し、ユーザーの UID と GID を示していました。つまり、悪意のあるクライアントや誤って設定されたクライアントがこれを誤用し、ファイルへのアクセスを許可すべきではないユーザーに対して、ファイルへのアクセスを簡単に与えてしまうことができるため注意が必要です。
こうしたリスクを抑えるため、管理者によって共通のユーザーおよびグループ ID へのユーザー権限が取り消されたり、読み取り専用のアクセスに制限されたりすることがよくあります。ただし、このソリューションにより、NFS 共有が元々想定されている方法では使用されなくなります。
また、NFS ファイルシステムをエクスポートしているシステムで使用している DNS サーバーのコントロールが攻撃者に奪われると、特定のホスト名または完全修飾ドメイン名に関連付けられているシステムが、未承認のマシンに向かう可能性があります。この時、NFS マウントには、これ以上の安全確保を目的としたユーザー名やパスワード情報の交換が行われないため、この未承認のマシンが NFS 共有のマウントを許可されたシステムに なってしまいます
NFS 経由でディレクトリーのエクスポートを行う際にワイルドカードを使用する場合は慎重に行ってください。ワイルドカードの対象が予定よりも広い範囲のシステムを対象とする可能性があります。
また、TCP ラッパーを使用して rpcbind[1] サービスへのアクセスを制限することもできます。iptables でルールを作成すると、rpcbindrpc.mountd、および rpc.nfsd が使用するポートへのアクセスを制限することもできます。
NFS および rpcbind のセキュリティー保護に関する詳細は、man iptables を参照してください。

8.7.2. AUTH_GSSを使用した NFS 保護

NFSv4 は、RPCSEC_GSS と Kerberos バージョン 5 GSS-API の実装を義務付けることで、NFS のセキュリティーに革命を起こしました。ただし、RPCSEC_GSS や Kerberos のメカニズムは、NFS のいずれのバージョンでも利用できます。FIPS モードでは、FIPS が許可するアルゴリズムのみを使用できます。
AUTH_SYS とは異なり、RPCSEC_GSS Kerberos メカニズムでは、サーバーは、どのユーザーがそのファイルにアクセスしているかを正確に表すことをクライアントに依存しません。代わりに、暗号を使用してサーバーにユーザーを認証し、悪意のあるクライアントがそのユーザーの Kerberos 認証情報を持たずにユーザーになりすますことがないようにします。RPCSEC_GSS Kerberos メカニズムを使用することが、マウントを保護する最も簡単な方法になります。Kerberos の設定後は、追加の設定が不要になるためです。

Kerberos の設定

NFSv4 Kerberos 対応サーバーを設定する前に、Kerberos Key Distribution Centre (KDC) をインストールして設定する必要があります。Kerberos はネットワーク認証システムであり、対称暗号化と、信頼できるサードパーティー (KDC) を使用してクライアントとサーバーが相互に認証できるようにします。Red Hat では、Kerberos の設定に Identity Management (IdM) を使用することを推奨します。

手順8.3 RPCSEC_GSS を使用するための IdM 用の NFS サーバーとクライアントの設定

    • NFS サーバー側で nfs/hostname.domain@REALM プリンシパルを作成します。
    • サーバーとクライアント側の両方に、host/hostname.domain@REALM を作成します。
      注記
      ホスト名 は、NFS サーバーのホスト名 と同じでなければなりません。
    • クライアントとサーバーのキータブに、対応する鍵を追加します。
    手順は、Red Hat Enterprise Linux 7 Linux Domain Identity, Authentication, and Policy GuideAdding and Editing Service Entries and Keytabs and Setting up a Kerberos-aware NFS Server のセクションを参照してください。
  1. サーバーで、sec= オプションを使用して、希望するセキュリティーフレーバーを有効にします。すべてのセキュリティーフレーバーと非暗号化マウントを有効にするには、以下のコマンドを実行します。
    /export *(sec=sys:krb5:krb5i:krb5p)
    
    sec= オプションで使用する有効なセキュリティーフレーバーは次のとおりです。
    • sys: 暗号化の保護なし(デフォルト)
    • krb5: 認証のみ
    • krb5i: 整合性保護
    • krb5p: プライバシー保護
  2. クライアント側で、sec=krb5 (または設定に応じて sec=krb5i、または sec=krb5p )をマウントオプションに追加します。
    # mount -o sec=krb5 server:/export /mnt
    
    NFS クライアントの設定方法の詳細は、Red Hat Enterprise Linux 7 Linux Domain Identity, Authentication, and Policy GuideSetting up a Kerberos-aware NFS Client セクションを参照してください。

関連情報

8.7.2.1. NFSv4 による NFS のセキュリティー保護

NFSv4 には、Microsoft Windows NT モデルの機能や幅広い導入の経緯があるため、POSIX モデルではなく、Microsoft Windows NT モデルをベースとした ACL サポートが含まれます。
NFSv4 のもう 1 つの重要なセキュリティー機能は、ファイルシステムのマウントに MOUNT プロトコルを使用することを削除することです。MOUNT プロトコルは、プロトコルがファイルを処理する方法が原因でセキュリティーリスクを示しました。

8.7.3. ファイル権限

リモートホストにより NFS ファイルシステムを読み取りまたは読み書きとしてマウントした場合は、パーティションが、各共有ファイルに対する唯一の保護となります。同じユーザー ID 値を共有している 2 つのユーザーが同じ NFS ファイルシステムをマウントすると、それらのユーザーはファイルを相互に変更することができます。さらに、クライアントシステムで root としてログインしているユーザーは、su - コマンドを使用して、NFS 共有のあるファイルにアクセスできます。
デフォルトでは、アクセス制御リスト (ACL) は、Red Hat Enterprise Linux では NFS が対応しています。Red Hat は、この機能を有効な状態にしておくことを推奨しています。
デフォルトでは、NFS がファイルシステムをエクスポートする際に、root squashing を使用します。これにより、ローカルマシンで root ユーザーとして NFS 共有にアクセスするユーザーのユーザー ID が nobody に設定されます。root squashing は、デフォルトのオプション root_squash で制御されます。このオプションの詳細については、/etc/exports 設定ファイル」 を参照してください。できる限りこの root squash 機能は無効にしないでください。
NFS 共有を読み取り専用としてエクスポートする場合は、all_squash オプションの使用を検討してください。このオプションでは、エクスポートしたファイルシステムにアクセスするすべてのユーザーが、nfsnobody ユーザーのユーザー ID を取得します。