Azure CLI を使用して仮想ネットワーク サービス エンドポイントで PaaS リソースへのネットワーク アクセスを制限する

仮想ネットワーク サービス エンドポイントを使うと、一部の Azure サービス リソースへのネットワーク アクセスを、仮想ネットワーク サブネットに制限できます。 また、リソースに対するインターネット アクセスを排除することもできます。 サービス エンドポイントにより、使用している仮想ネットワークからサポートされている Azure サービスへの直接接続が提供されるため、ご自身の仮想ネットワークのプライベート アドレス スペースを使用して、Azure サービスにアクセスできるようになります。 サービス エンドポイントを介して Azure リソースに送信されるトラフィックは、常に Microsoft Azure のバックボーン ネットワーク上に留まります。 この記事では、次のことについて説明します。

  • 1 つのサブネットを含む仮想ネットワークを作成する
  • サブネットを追加し、サービス エンドポイントを有効にする
  • Azure リソースを作成し、サブネットからのみネットワーク アクセスできるようにする
  • 各サブネットに仮想マシン (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 Public \
  --subnet-prefix 10.0.0.0/24

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

サービス エンドポイントをサポートするサービスについてのみ、サービス エンドポイントを有効にできます。 az network vnet list-endpoint-services を使って、Azure の場所で使えるサービス エンドポイント対応のサービスを表示します。 次の例では、eastus リージョンで使える、サービス エンドポイント対応サービスの一覧が返されます。 返されるサービスの一覧は、サービス エンドポイント対応の Azure サービスが増えるにつれて、時間の経過と共に大きくなります。

az network vnet list-endpoint-services \
  --location eastus \
  --out table

az network vnet subnet create を使って、追加のサブネットを仮想ネットワークに作成します。 次の例では、Microsoft.Storage のサービス エンドポイントをサブネットに作成します。

az network vnet subnet create \
  --vnet-name myVirtualNetwork \
  --resource-group myResourceGroup \
  --name Private \
  --address-prefix 10.0.1.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 サービスを介して作成されたリソースへのネットワーク アクセスを制限するために必要な手順は、サービスによって異なります。 各サービスの具体的な手順については、それぞれのサービスのドキュメントをご覧ください。 この記事の残りの部分では、例として、Azure ストレージ アカウントのネットワーク アクセスを制限する手順を示します。

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

az storage account create で Azure ストレージ アカウントを作成します。 <replace-with-your-unique-storage-account-name> を Azure 全体における一意の名前 (3 から 24 文字で、数字と小文字のみを使用) に置き換えます。

storageAcctName="<replace-with-your-unique-storage-account-name>"

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

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

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

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

echo $saConnectionString

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

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

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

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

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

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

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

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

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

仮想マシンを作成する

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

最初の仮想マシンを作成する

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

az vm create \
  --resource-group myResourceGroup \
  --name myVmPublic \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Public \
  --generate-ssh-keys

VM の作成には数分かかります。 VM が作成されると、Azure CLI によって次の例のような情報が表示されます。

{
  "fqdns": "",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVmPublic",
  "location": "eastus",
  "macAddress": "00-0D-3A-23-9A-49",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "13.90.242.231",
  "resourceGroup": "myResourceGroup"
}

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

2 番目の仮想マシンを作成する

az vm create \
  --resource-group myResourceGroup \
  --name myVmPrivate \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Private \
  --generate-ssh-keys

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

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

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

ssh <publicIpAddress>

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

sudo mkdir /mnt/MyAzureFileShare

作成したディレクトリに Azure のファイル共有をマウントします。 次のコマンドを実行する前に、<storage-account-name> をアカウント名に置き換え、<storage-account-key> を「ストレージ アカウントの作成」で取得したキーに置き換えます。

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

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

VM から他のパブリック IP アドレスへの送信接続がないことを確認します。

ping bing.com -c 4

応答はありません。これは、Private サブネットに関連付けられているネットワーク セキュリティ グループでは、Azure Storage サービスに割り当てられているアドレス以外のパブリック IP アドレスへの発信アクセスが許可されていないためです。

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

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

次のコマンドを使って、myVmPublic VM との SSH セッションを作成します。 <publicIpAddress>myVmPublic VM のパブリック IP アドレスに置き換えます。

ssh <publicIpAddress>

マウント ポイント用のディレクトリを作成します。

sudo mkdir /mnt/MyAzureFileShare

作成したディレクトリに Azure ファイル共有のマウントを試みます。 この記事では、最新バージョンの Ubuntu を展開してあるものとします。 以前のバージョンの Ubuntu を使っている場合は、「Linux でのマウント」でファイル共有のマウントに関する追加説明を参照してください。 次のコマンドを実行する前に、<storage-account-name> をアカウント名に置き換え、<storage-account-key> を「ストレージ アカウントの作成」で取得したキーに置き換えます。

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

myVmPublic VM が Public サブネットに展開されているため、アクセスは拒否されて、mount error(13): Permission denied エラーを受け取ります。 Public サブネットでは、Azure Storage に対してサービス エンドポイントが有効になっていません。ストレージ アカウントが許可しているのは Public サブネットからではなく、Private サブネットからのネットワーク アクセスです。

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

お使いのコンピューターから、az storage share list を使って、ストレージ アカウントの共有の表示を試みます。 <account-name> をストレージ アカウント名に置き換え、<account-key> を「ストレージ アカウントの作成」で取得したキーに置き換えます。

az storage share list \
  --account-name <account-name> \
  --account-key <account-key>

アクセスが拒否され、"This request is not authorized to perform this operation (この要求には、この操作を実行する権限がありません) " というエラーが発生します。これは、使っているコンピューターが MyVirtualNetwork 仮想ネットワークの Private サブネットにないためです。

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

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

az group delete --name myResourceGroup --yes

次のステップ

この記事では、仮想ネットワーク サブネットのサービス エンドポイントを有効にしました。 複数の Azure サービスでデプロイされているリソースに対して、サービス エンドポイントを有効にできることを学習しました。 Azure ストレージ アカウントを作成し、そのストレージ アカウントへのネットワーク アクセスを、仮想ネットワーク サブネット内のリソースだけに制限しました。 サービス エンドポイントの詳細については、サービス エンドポイントの概要サブネットの管理に関するページをご覧ください。

アカウントに複数の仮想ネットワークがある場合は、各仮想ネットワーク内のリソースが相互に通信できるように、2 つの仮想ネットワークを接続することもできます。 方法については、仮想ネットワークの接続に関するページをご覧ください。