Share via


Azure CLI を使って仮想ネットワーク サービス エンドポイント ポリシーで Azure Storage アカウントへのデータの流出を管理する

仮想ネットワーク サービス エンドポイント ポリシーを使用すると、サービス エンドポイント経由で仮想ネットワーク内から Azure Storage アカウントにアクセス制御を適用できます。 これは、ワークロードのセキュリティ保護のために必要であり、どのストレージ アカウントが許可され、どのようなデータ流出が許可されるかが管理されます。 この記事では、次のことについて説明します。

  • 仮想ネットワークを作成し、サブネットを追加します。
  • Azure Storage のサービス エンドポイントを有効にします。
  • 2 つの Azure Storage アカウントを作成し、上記で作成したサブネットからのネットワーク アクセスを許可します。
  • いずれかのストレージ アカウントへのアクセスのみを許可するサービス エンドポイント ポリシーを作成します。
  • サブネットに仮想マシン (VM) をデプロイします。
  • サブネットから許可されているストレージ アカウントへのアクセスを確認します。
  • サブネットから許可されていないストレージ アカウントへのアクセスが拒否されていることを確認します。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事では、Azure CLI のバージョン 2.0.28 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。

仮想ネットワークの作成

仮想ネットワークを作成する前に、仮想ネットワークのリソース グループと、この記事で作成された他のすべてのリソースを作成する必要があります。 az group create を使用して、リソース グループを作成します。 次の例では、myResourceGroup という名前のリソース グループを eastus に作成します。

az group create \
  --name myResourceGroup \
  --location eastus

az network vnet create で、1 つのサブネットを含む仮想ネットワークを作成します。

az network vnet create \
  --name myVirtualNetwork \
  --resource-group myResourceGroup \
  --address-prefix 10.0.0.0/16 \
  --subnet-name Private \
  --subnet-prefix 10.0.0.0/24

サービス エンドポイントを有効にする

次の例では、Microsoft.Storage のサービス エンドポイントをサブネット Private に作成します。

az network vnet subnet create \
  --vnet-name myVirtualNetwork \
  --resource-group myResourceGroup \
  --name Private \
  --address-prefix 10.0.0.0/24 \
  --service-endpoints Microsoft.Storage

サブネットのネットワーク アクセスを制限する

az network nsg create で、ネットワーク セキュリティ グループを作成します。 次の例では、myNsgPrivate という名前のネットワーク セキュリティ グループを作成します。

az network nsg create \
  --resource-group myResourceGroup \
  --name myNsgPrivate

az network vnet subnet update を使って、ネットワーク セキュリティ グループを Private サブネットに関連付けます。 次の例では、myNsgPrivate ネットワーク セキュリティ グループを Private サブネットに関連付けます。

az network vnet subnet update \
  --vnet-name myVirtualNetwork \
  --name Private \
  --resource-group myResourceGroup \
  --network-security-group myNsgPrivate

az network nsg rule create でセキュリティ規則を作成します。 次の規則は、Azure Storage サービスに割り当てられたパブリック IP アドレスへの送信アクセスを許可します。

az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNsgPrivate \
  --name Allow-Storage-All \
  --access Allow \
  --protocol "*" \
  --direction Outbound \
  --priority 100 \
  --source-address-prefix "VirtualNetwork" \
  --source-port-range "*" \
  --destination-address-prefix "Storage" \
  --destination-port-range "*"

各ネットワーク セキュリティ グループには、さまざまな既定のセキュリティ規則が含まれています。 次の規則は、すべてのパブリック IP アドレスへの送信アクセスを許可する既定のセキュリティ規則をオーバーライドします。 destination-address-prefix "Internet" オプションは、すべてのパブリック IP アドレスへの送信アクセスを拒否します。 この規則は、優先度が高い前の規則によってオーバーライドされます。これにより、Azure Storage のパブリック IP アドレスへのアクセスが許可されます。

az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNsgPrivate \
  --name Deny-Internet-All \
  --access Deny \
  --protocol "*" \
  --direction Outbound \
  --priority 110 \
  --source-address-prefix "VirtualNetwork" \
  --source-port-range "*" \
  --destination-address-prefix "Internet" \
  --destination-port-range "*"

次の規則は、任意の場所からサブネットへの SSH 受信トラフィックを許可します。 この規則は、インターネットからのすべての受信トラフィックを拒否する既定のセキュリティ規則をオーバーライドします。 後のステップで接続をテストできるように、サブネットへの SSH が許可されます。

az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNsgPrivate \
  --name Allow-SSH-All \
  --access Allow \
  --protocol Tcp \
  --direction Inbound \
  --priority 120 \
  --source-address-prefix "*" \
  --source-port-range "*" \
  --destination-address-prefix "VirtualNetwork" \
  --destination-port-range "22"

Azure Storage アカウントに対するネットワーク アクセスを制限する

このセクションでは、サービス エンドポイントを介して仮想ネットワーク内の特定のサブネットから Azure Storage アカウントのネットワーク アクセスを制限する手順を示します。

ストレージ アカウントの作成

az storage account create で Azure ストレージ アカウントを 2 つ作成します。

storageAcctName1="allowedstorageacc"

az storage account create \
  --name $storageAcctName1 \
  --resource-group myResourceGroup \
  --sku Standard_LRS \
  --kind StorageV2

storageAcctName2="notallowedstorageacc"

az storage account create \
  --name $storageAcctName2 \
  --resource-group myResourceGroup \
  --sku Standard_LRS \
  --kind StorageV2

ストレージ アカウントを作成した後、az storage account show-connection-string を使って、ストレージ アカウントの接続文字列を変数に取得します。 接続文字列は、後の手順でファイル共有を作成するときに使います。

saConnectionString1=$(az storage account show-connection-string \
  --name $storageAcctName1 \
  --resource-group myResourceGroup \
  --query 'connectionString' \
  --out tsv)

saConnectionString2=$(az storage account show-connection-string \
  --name $storageAcctName2 \
  --resource-group myResourceGroup \
  --query 'connectionString' \
  --out tsv)

変数の内容を表示し、出力で返された AccountKey の値を書き留めます。後の手順でこの値を使います。

echo $saConnectionString1

echo $saConnectionString2

ストレージ アカウントにファイル共有を作成する

az storage share create を使って、ストレージ アカウントにファイル共有を作成します。 後の手順では、このファイル共有をマウントして、それへのネットワーク アクセスを確認します。

az storage share create \
  --name my-file-share \
  --quota 2048 \
  --connection-string $saConnectionString1 > /dev/null

az storage share create \
  --name my-file-share \
  --quota 2048 \
  --connection-string $saConnectionString2 > /dev/null

ストレージ アカウントへのすべてのネットワーク アクセスを拒否する

既定では、ストレージ アカウントは、任意のネットワーク上のクライアントからのネットワーク接続を受け入れます。 選んだネットワークへのアクセスを制限するには、az storage account update で既定のアクションを Deny に変更します。 ネットワーク アクセスが拒否されると、ストレージ アカウントには、どのネットワークからもアクセスできなくなります。

az storage account update \
  --name $storageAcctName1 \
  --resource-group myResourceGroup \
  --default-action Deny

az storage account update \
  --name $storageAcctName2 \
  --resource-group myResourceGroup \
  --default-action Deny

仮想ネットワーク サブネットからのネットワーク アクセスを有効にする

az storage account network-rule add を使って、Private サブネットからストレージ アカウントへのネットワーク アクセスを許可します。

az storage account network-rule add \
  --resource-group myResourceGroup \
  --account-name $storageAcctName1 \
  --vnet-name myVirtualNetwork \
  --subnet Private

az storage account network-rule add \
  --resource-group myResourceGroup \
  --account-name $storageAcctName2 \
  --vnet-name myVirtualNetwork \
  --subnet Private

有効なストレージ アカウントへのアクセスを許可するポリシーを適用する

Azure サービス エンドポイント ポリシーは、Azure Storage でのみ使用できます。 そのため、この例のセットアップでは、このサブネット上の Microsoft.Storage のサービス エンドポイントを有効にします。

サービス エンドポイント ポリシーは、サービス エンドポイントに適用されます。 まず、サービス エンドポイント ポリシーを作成します。 次に、このサブネットに対して承認される Azure Storage アカウントのポリシー定義をこのポリシーのもとで作成します

サービス エンドポイント ポリシーを作成する

az network service-endpoint policy create \
  --resource-group myResourceGroup \
  --name mysepolicy \
  --location eastus

許可されているストレージ アカウントのリソース URI を変数に保存します。 以下のコマンドを実行する前に、<your-subscription-id> をご自身のサブスクリプション ID の実際の値に置き換えます。

$serviceResourceId="/subscriptions/<your-subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/allowedstorageacc"

上記の Azure Storage アカウントを許可するためのポリシー定義を作成し、サービス エンドポイント ポリシーに追加します。

az network service-endpoint policy-definition create \
  --resource-group myResourceGroup \
  --policy-name mysepolicy \
  --name mypolicydefinition \
  --service "Microsoft.Storage" \
  --service-resources $serviceResourceId

仮想ネットワーク サブネットを更新して、前の手順で作成したサービス エンドポイント ポリシーに関連付けます。

az network vnet subnet update \
  --vnet-name myVirtualNetwork \
  --resource-group myResourceGroup \
  --name Private \
  --service-endpoints Microsoft.Storage \
  --service-endpoint-policy mysepolicy

Azure Storage アカウントへのアクセス制限を検証する

仮想マシンの作成

ストレージ アカウントへのネットワーク アクセスをテストするには、サブネットに VM をデプロイします。

az vm create を使用して、Private サブネット内に VM を作成します。 既定のキーの場所にまだ SSH キーが存在しない場合は、コマンドを使って SSH キーを作成します。 特定のキーのセットを使用するには、--ssh-key-value オプションを使用します。

az vm create \
  --resource-group myResourceGroup \
  --name myVmPrivate \
  --image <SKU linux image> \
  --vnet-name myVirtualNetwork \
  --subnet Private \
  --generate-ssh-keys

VM の作成には数分かかります。 作成された後、返された出力の publicIpAddress を書き留めておきます。 このアドレスは、後の手順で、インターネットから VM にアクセスするときに使います。

ストレージ アカウントへのアクセスを確認する

myVmPrivate VM に SSH で接続します。 <publicIpAddress>myVmPrivate VM のパブリック IP アドレスに置き換えます。

ssh <publicIpAddress>

マウント ポイントのフォルダーを作成します。

sudo mkdir /mnt/MyAzureFileShare1

作成したディレクトリに Azure のファイル共有をマウントします。 以下のコマンドを実行する前に、<storage-account-key>$saConnectionString1 からの AccountKey の値に置き換えます。

sudo mount --types cifs //allowedstorageacc.file.core.windows.net/my-file-share /mnt/MyAzureFileShare1 --options vers=3.0,username=allowedstorageacc,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino

user@myVmPrivate:~$ というプロンプトが表示されます。 Azure ファイル共有は /mnt/MyAzureFileShare に正常にマウントされました。

ストレージ アカウントへのアクセスが拒否されたことを確認する

同じ VM myVmPrivate から、マウント ポイントのディレクトリを作成します。

sudo mkdir /mnt/MyAzureFileShare2

ストレージ アカウント notallowedstorageacc から、作成したディレクトリに Azure ファイル共有をマウントしてみます。 この記事では、最新バージョンの Linux ディストリビューションを展開してあるものとします。 以前のバージョンの Linux ディストリビューションを使っている場合は、「Linux でのマウント」でファイル共有のマウントに関する追加説明を参照してください。

以下のコマンドを実行する前に、<storage-account-key>$saConnectionString2 からの AccountKey の値に置き換えます。

sudo mount --types cifs //notallowedstorageacc.file.core.windows.net/my-file-share /mnt/MyAzureFileShare2 --options vers=3.0,username=notallowedstorageacc,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino

アクセスが拒否され、mount error(13): Permission denied エラーが発生します。このストレージ アカウントは、サブネットに適用したサービス エンドポイント ポリシーの許可リストに含まれていないためです。

myVmPublic VM への SSH セッションを終了します。

リソースをクリーンアップする

不要になったら、az group delete を使用して、リソース グループとそのグループに含まれているすべてのリソースを削除します。

az group delete --name myResourceGroup --yes

次のステップ

この記事では、Azure 仮想ネットワーク サービス エンドポイントのサービス エンドポイント ポリシーを Azure Storage に適用しました。 Azure Storage アカウントを作成し、ネットワーク アクセスを、仮想ネットワーク サブネットの特定のストレージ アカウントだけに制限 (つまり、他は拒否) しました。 サービス エンドポイント ポリシーの詳細については、サービス エンドポイント ポリシーの概要に関する記事を参照してください。