この記事では、NFS Azure ファイル共有の転送中のデータを暗号化する方法について説明します。 Azure Files NFS v4.1 ボリュームは、セキュリティで保護された TLS 接続を有効にし、転送中のデータを MITM 攻撃を含む傍受から保護することで、ネットワーク セキュリティを強化します。
Overview
オープン ソース TLS ラッパーである Stunnel を使用して、Azure Files は、Kerberos を必要とせずに、AES-GCM を使用して強力な暗号化を使用して NFS クライアントと Azure Files の間の TCP ストリームを暗号化します。 これにより、データの機密性が確保され、複雑なセットアップや Active Directory などの外部認証システムが不要になります。
AZNFS ユーティリティ パッケージは、クライアントに Stunnel をインストールして設定することで、暗号化されたマウントを簡略化します。 packages.microsoft.com で使用できる AZNFS は、暗号化された接続経由で NFS クライアント要求を透過的に転送するローカルのセキュリティで保護されたエンドポイントを作成します。 主要なアーキテクチャ コンポーネントは次のとおりです。
AZNFS マウント ヘルパー: NFSv4.1 トラフィックのセキュリティで保護されたトンネルを確立する複雑さを抽象化するクライアント ユーティリティ パッケージ。
Stunnel プロセス: ローカル ポート上の NFS クライアント トラフィックをリッスンし、TLS 経由で安全に Azure Files NFS サーバーに転送するストレージ アカウントごとのクライアント プロセス。
AZNFS ウォッチドッグ: AZNFS パッケージはバックグラウンド ジョブを実行します。これにより、stunnel プロセスが実行され、終了したトンネルが自動的に再起動され、関連付けられているすべての NFS マウントがマウント解除された後に未使用のプロセスがクリーンアップされます。
Important
AZNFS でサポートされている Linux ディストリビューションは次のとおりです。
- Ubuntu (18.04 LTS、20.04 LTS、22.04 LTS、24.04 LTS)
- Centos7、Centos8
- RedHat7、RedHat8、RedHat9
- Rocky8、Rocky9
- SUSE (SLES 15)
- Oracle Linux
- Alma Linux
サポートされているリージョン
EiT は、ニュージーランド北部、西ヨーロッパ、韓国中部を除く Azure Premium Files をサポートするすべてのリージョンで一般公開 (GA) になりました。 これらの残りのリージョンは現在プレビューを実行しています。 プレビュー リージョンで EiT を使用するには、以下の手順に従ってサブスクリプションを登録する必要があります。
プレビューに登録する (GA リージョンでは必要ありません)
プレビュー リージョン (ニュージーランド北部、西ヨーロッパ、韓国中部) でストレージ アカウントと NFS 共有の転送中の暗号化を有効にするには、プレビューに登録する必要があります。 GA リージョンでは登録は必要ありません。
プレビュー機能の下にある "Azure NFS ファイル共有の転送中の暗号化" を検索して、Azure portal 経由で登録します。
詳細については、「 Azure サブスクリプションでプレビュー機能を設定する」を参照してください。
転送中の暗号化を適用する
ストレージ アカウントで [安全な転送が必要] 設定を有効にすると、ストレージ アカウント内の NFS ボリュームに対するすべてのマウントが確実に暗号化されます。 EiT は、新規および既存のストレージ アカウントと NFS Azure ファイル共有の両方で有効にすることができます。 EiT を有効にするための追加コストはありません。
ただし、同じストレージ アカウント上の TLS 接続と TLS 以外の接続の間で柔軟性を維持したいユーザーの場合は、 セキュリティで保護された転送 設定をオフのままにする必要があります。
NFS 共有の転送中のデータを暗号化する
AZURE portal または Azure CLI を使用して、NFS Azure ファイル共有の転送中のデータを暗号化できます。
Azure portal を使用して NFS 共有の転送中のデータを暗号化する
Azure portal には、AZNFS マウント ヘルパー パッケージをインストールするための、選択した Linux ディストリビューションに合わせて調整された、すぐに使用できるステップ バイ ステップのインストール スクリプトが用意されています。 インストールが完了したら、提供された AZNFS マウント スクリプトを使用して NFS 共有を安全にマウントし、クライアントとサーバーの間で暗号化された伝送チャネルを確立できます。
同じストレージ アカウントに TLS 接続と非 TLS 接続を持つ柔軟性を維持したいユーザーは、 セキュリティで保護された転送に必要な 設定が無効のままであることを確認する必要があります。
Azure CLI を使用して NFS 共有の転送中のデータを暗号化する
転送中のデータを暗号化するには、次の手順に従います。
- 必要な AZNFS マウント ヘルパー パッケージがクライアントにインストールされていることを確認します。
- TLS 暗号化を使用して NFS ファイル共有をマウントします。
- データの暗号化が成功したことを確認します。
手順 1: AZNFS マウント ヘルパー パッケージのインストールを確認する
AZNFS マウント ヘルパー パッケージがクライアントにインストールされているかどうかを確認するには、次のコマンドを実行します。
systemctl is-active --quiet aznfswatchdog && echo -e "\nAZNFS mounthelper is installed! \n"
パッケージがインストールされている場合は、 AZNFS mounthelper is installed!
というメッセージが表示されます。 インストールされていない場合は、適切なコマンドを使用して、クライアントに AZNFS マウント ヘルパー パッケージをインストールする必要があります。
curl -sSL -O https://packages.microsoft.com/config/$(source /etc/os-release && echo "$ID/$VERSION_ID")/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install aznfs
手順 2: NFS ファイル共有をマウントする
TLS 暗号化を使用して NFS ファイル共有をマウントするには:
- クライアントにディレクトリを作成します。
sudo mkdir -p /mount/<storage-account-name>/<share-name>
- 次のコマンドレットを使用して NFS 共有をマウントします。
<storage-account-name>
をストレージ アカウントの名前に置き換え、<share-name>
をファイル共有の名前に置き換えます。
sudo mount -t aznfs <storage-account-name>.file.core.windows.net:/<storage-account-name>/<share-name> /mount/<storage-account-name>/<share-name> -o vers=4,minorversion=1,sec=sys,nconnect=4
TLS 暗号化なしで NFS 共有をマウントするには:
sudo mount -t aznfs <storage-account-name>.file.core.windows.net:/<storage-account-name>/<share-name> /mount/<storage-account-name>/<share-name> -o vers=4,minorversion=1,sec=sys,nconnect=4,notls
再起動時に共有を 自動的にマウントするには、次の行を追加して、 /etc/fstab
ファイルにエントリを作成します。
<storage-account-name>.file.core.windows.net:/<storage-account-name>/<container-name> /nfsdata aznfs defaults,sec=sys,vers=4.1,nolock,proto=tcp,nofail,_netdev 0 2
Note
mount コマンドを実行する前に、環境変数AZURE_ENDPOINT_OVERRIDEが設定されていることを確認します。 これは、非パブリック Azure クラウド リージョンでファイル共有をマウントする場合、またはカスタム DNS 構成を使用する場合に必要です。
たとえば、Azure China Cloud の場合: export AZURE_ENDPOINT_OVERRIDE="chinacloudapi.cn"
手順 3: 転送中のデータ暗号化が成功したことを確認する
コマンド df -Th
を実行します。
これは、クライアントが外部ネットワークではなく、ローカル ポート 127.0.0.1 を介して接続されていることを示します。 stunnel プロセスは、NFS クライアントからの受信 NFS トラフィックを 127.0.0.1 (localhost) でリッスンします。 その後、Stunnel はこのトラフィック をインターセプト し、 TLS 経由で Azure 上の Azure Files NFS サーバーに安全に転送します。
NFS サーバーへのトラフィックが暗号化されているかどうかを確認するには、 tcpdump
コマンドを使用してポート 2049 でパケットをキャプチャします。
sudo tcpdump -i any port 2049 -w nfs_traffic.pcap
Wireshark でキャプチャを開くと、ペイロードは読み取り可能なテキストではなく "アプリケーション データ" として表示されます。
Note
仮想マシンから同じサーバー エンドポイントへのすべてのトラフィックは、1 つの接続を使用します。 AZNFS マウント ヘルパーを使用すると、そのサーバーに共有をマウントするときに、TLS 構成と TLS 以外の構成を混在させないようにすることができます。 この規則は、同じストレージ アカウントの共有と、同じ IP アドレスに解決される異なるストレージ アカウントの共有に適用されます。
Troubleshooting
TLS (notls) 以外のマウント操作は 、同じサーバーへの以前 の TLS で暗号化された マウントが正常に完了する前に終了した場合に失敗する可能性があります。 aznfswatchdog サービスはタイムアウト後に古いエントリを自動的にクリーンアップしますが、クリーンアップが完了する前に新しい TLS 以外のマウントを試みると失敗する可能性があります。
この問題を解決するには、クリーン オプションを使用して共有を再マウントします。これにより、古いエントリがすぐにクリアされます。
sudo mount -t aznfs <storage-account-name>.file.core.windows.net:/<storage-account-name>/<share-name> /mount/<storage-account-name>/<share-name> -o vers=4,minorversion=1,sec=sys,nconnect=4,notls,clean
VM が カスタム ドメインに参加している場合は、DNS で定義されている /etc/fstab
のファイル共有にカスタム DNS FQDN または短い名前を使用します。 ホスト名の解決を確認するには、 nslookup <hostname>
コマンドと getent host <hostname>
コマンドを使用して確認します。 mount コマンドを実行する前に、環境変数 AZURE_ENDPOINT_OVERRIDE
が設定されていることを確認します。
マウントの問題が引き続き発生する場合は、ログ ファイルでトラブルシューティングの詳細を確認してください。
- マウント ヘルパーとウォッチドッグ ログ:
/opt/microsoft/aznfs/data/aznfs.log
- Stunnel のログ:
/etc/stunnel/microsoft/aznfs/nfsv4_fileShare/logs