今回はAzureのネットワークやアプリケーションにてアクセス制御を行うネットワークセキュリティグループとアプリケーションセキュリティグループについて解説します。
目次
ネットワークセキュリティグループ(NSG)とは
ネットワークセキュリティグループ(以下NSG)とは、Azureの仮想ネットワーク内のAzureリソースに対する通信の送受信をフィルターするサービスです。例えば、Azureリソースに対し、特定のサブネットの範囲のみ許可する等のフィルターを設定することができます。NSGは仮想マシンのNICや仮想ネットワーク内のサブネット単位で設定することができます。NSGは1つのNICやサブネットに対し、1つのNSGを設定することができます。

NSGには受信の規則と送信の規則があります。デフォルトでは以下のルールが設定されています。

受信のルールでは、仮想ネットワークおよびAzure Load Balancerの通信が許可されており、それ以外のルールについては全て拒否となっています。送信のルールでは、仮想ネットワークとインターネットへの全ての通信が許可されています。デフォルトの3つのルールは削除不可となっているため、最低でも3つのルールが存在することになります。
NSGのルールは、優先度の値が小さいルールから順番に判定を行い、ルールに一致したところで判定終了となります。そのため、優先度の順番によっては後続のルールが判定されないこともあるため、優先度を設定する際は注意が必要です。
NSGでは、ストレージアカウントを使用することでフローログを作成することもできます。フローログを作成することで、ネットワークグループのリソース間におけるトラフィックの分析を行うこともできます。
アプリケーションセキュリティグループ(ASG)とは
アプリケーションセキュリティグループ(以下ASG)とは、仮想マシンの役割に応じた詳細なフィルターをグループごとに設定することができます。ASGは仮想マシンのNICに対して関連付けを行います。例えば、Subnet1というサブネット内にあるVM1のNICに80ポートのみ許可するルール・ASG1を関連付け、VM2のNICに3306ポートのみ許可するルール・ASG2を関連付けるといった構成ができます。

ASGはNSGと違いデフォルトで設定されているルールはありません。また、ルールの優先度の判定もNSGと同様に優先度の値が小さいルールから判定し、ルールに一致したところで判定終了となります。NSGと違う点としては、ASGのルールはNICに関連付けられたホストにのみフィルターが動作するため、特定の仮想マシンに対し、より詳細なフィルターを設定することができます。
ネットワークセキュリティグループの設定
今回はAzureのCloud Shellを使用し、仮想ネットワーク内のサブネットで80番ポートの接続を拒否するルール作成まで行います。Cloud Shellにつきましては事前に準備しておいてください。
NSGを作成する際に1点注意することがあります。NSGは仮想ネットワークと同じリージョンに作成する必要があります。仮想ネットワークとNSGのリージョンが同じであれば、リソースグループの異なるNSGをサブネットに関連付けることができます。
リソースグループの作成から動作確認、リソースのクリーンアップまでは以下のコマンドで実施します。
# 変数定義
RESOURCE_GROUP="test-rg1"
VNET_NAME="test-vnet1"
SUBNET_NAME="subnet1"
NIC_NAME="test-nic1"
PUBIP_NAME="test-pubip1"
VM_NAME="test-vm1"
VM_USER="azureuser"
NSG_VM_NAME="test-nsg1"
NSG_SUB_NAME="test-nsg2"
NSG_SSH_RULE_NAME="ssh_allow"
NSG_HTTP_RULE_NAME="http_allow"
LOCATION="japaneast"
# リソースグループを作成
az group create -g $RESOURCE_GROUP -l $LOCATION
# 仮想ネットワークおよびサブネットの作成
az network vnet create -n $VNET_NAME \
-g $RESOURCE_GROUP \
-l $LOCATION \
--address-prefixes 10.10.0.0/16 \
--subnet-name $SUBNET_NAME \
--subnet-prefixes 10.10.10.0/24
# VM用NSGを作成
az network nsg create -n $NSG_VM_NAME \
-g $RESOURCE_GROUP
# サブネット用NSGを作成
az network nsg create -n $NSG_SUB_NAME \
-g $RESOURCE_GROUP
# VM用NSGにSSH接続許可のルールを作成
# 今回は接続元を任意に設定しているが、業務等では接続元を制限すること
az network nsg rule create -n $NSG_SSH_RULE_NAME \
-g $RESOURCE_GROUP \
--nsg-name $NSG_VM_NAME \
--priority 100 \
--source-address-prefixes '*' \
--destination-port 22 \
--access Allow \
--protocol Tcp \
--description "Allow ports 22."
# VM用NSGにHTTP接続許可のルールを作成
az network nsg rule create -n $NSG_RULE_NAME \
-g $RESOURCE_GROUP \
--nsg-name $NSG_VM_NAME \
--priority 200 \
--source-address-prefixes Internet \
--destination-port 80 \
--access Allow \
--protocol Tcp \
--description "Allow ports 80."
# サブネット用NSGにHTTP接続拒否のルールを作成
az network nsg rule create -n $NSG_RULE_NAME \
-g $RESOURCE_GROUP \
--nsg-name $NSG_SUB_NAME \
--priority 100 \
--source-address-prefixes Internet \
--destination-port 80 \
--access Deny \
--protocol Tcp \
--description "Allow ports 80."
# VM用のPublicIPアドレスを作成
az network public-ip create -n $PUBIP_NAME \
-g $RESOURCE_GROUP
# VM用のNICを作成
# 事前にNICを作成しないとVM作成時に自動作成される
az network nic create -n $NIC_NAME \
-g $RESOURCE_GROUP \
--vnet-name $VNET_NAME \
--subnet $SUBNET_NAME \
--network-security-group $NSG_VM_NAME \
--public-ip-address $PUBIP_NAME
# 仮想マシンの作成
az vm create --name $VM_NAME \
--resource-group $RESOURCE_GROUP \
--image UbuntuLTS \
--nics $NIC_NAME \
--admin-username $VM_USER \
--generate-ssh-keys
# Public IPアドレスを変数に格納
PUBLIC_IP=`az vm show -g $RESOURCE_GROUP -n $VM_NAME --show-detail --query publicIps -o tsv`
# VMに接続
ssh $VM_USER@$PUBLIC_IP
# VM内操作
# Apacheをインストールし、SSH接続を終了
sudo apt install -y apache2
exit
# Apacheのアクセス確認
# VM側のNSGによりApacheのトップページが表示される
curl $PUBLIC_IP
# サブネットにHTTP拒否ルールのNSGを関連付ける
az network vnet subnet update -n $SUBNET_NAME \
-g $RESOURCE_GROUP \
--vnet-name $VNET_NAME \
--nsg $NSG_SUB_NAME
# Apacheのアクセス確認
# サブネット側のNSGによりHTTP接続できなくなる
curl $PUBLIC_IP
# リソースのクリーンアップ
az group delete -n $RESOURCE_GROUP
最初のcurlコマンドでは、UbuntuのApacheトップページが表示されますが、サブネットにNSGを関連付けた後は接続できない状態となります。
アプリケーションセキュリティグループの設定
ASGもNSG同様にAzureのCloud Shellを使用し、仮想マシンに関連付けたASGに対して80番ポートの接続を許可するルールを作成します。
ASGを作成する際は、NSG同様に仮想マシンと同じリージョンである必要があります。リージョンが一致していれば、リソースグループが異なるASGを構成することができます。
リソースグループの作成から動作確認、リソースのクリーンアップまでは以下のコマンドで実施します。
# 変数定義
RESOURCE_GROUP="test-rg1"
VNET_NAME="test-vnet1"
SUBNET_NAME="subnet1"
NIC_NAME="test-nic1"
PUBIP_NAME="test-pubip1"
VM_NAME="test-vm1"
VM_USER="azureuser"
NSG_VM_NAME="test-nsg1"
NSG_SSH_RULE_NAME="ssh_allow"
ASG_NAME="test-asg1"
ASG_HTTP_RULE_NAME="http_allow"
LOCATION="japaneast"
# リソースグループを作成
az group create -g $RESOURCE_GROUP -l $LOCATION
# 仮想ネットワークおよびサブネットの作成
az network vnet create -n $VNET_NAME \
-g $RESOURCE_GROUP \
-l $LOCATION \
--address-prefixes 10.20.0.0/16 \
--subnet-name $SUBNET_NAME \
--subnet-prefixes 10.20.10.0/24
# NIC用NSGを作成
az network nsg create -n $NSG_VM_NAME \
-g $RESOURCE_GROUP
# VM用のPublicIPアドレスを作成
az network public-ip create -n $PUBIP_NAME \
-g $RESOURCE_GROUP
# VM用NSGにSSH接続許可のルールを作成
# 今回は接続元を任意にしているが、業務等では接続元を制限すること
az network nsg rule create -n $NSG_SSH_RULE_NAME \
-g $RESOURCE_GROUP \
--nsg-name $NSG_VM_NAME \
--priority 100 \
--source-address-prefixes '*' \
--destination-port 22 \
--access Allow \
--protocol Tcp \
--description "Allow ports 22."
# ASGを作成
az network asg create -n $ASG_NAME \
-g $RESOURCE_GROUP \
--l $LOCATION
# HTTP接続を許可するASGのルールを作成
az network nsg rule create -n $ASG_HTTP_RULE_NAME \
--nsg-name $NSG_VM_NAME \
-g $RESOURCE_GROUP \
--priority 400 \
--destination-asgs $ASG_NAME \
--destination-port 80 \
--access Allow \
--protocol Tcp \
--description "Allow ports 80."
# VM用のNICを作成
az network nic create -n $NIC_NAME \
-g $RESOURCE_GROUP \
--vnet-name $VNET_NAME \
--subnet $SUBNET_NAME \
--network-security-group $NSG_VM_NAME \
--application-security-groups $ASG_NAME \
--public-ip-address $PUBIP_NAME
# 仮想マシンの作成
az vm create --name $VM_NAME \
--resource-group $RESOURCE_GROUP \
--image UbuntuLTS \
--nics $NIC_NAME \
--admin-username $VM_USER \
--generate-ssh-keys
# Public IPアドレスを変数に格納
PUBLIC_IP=`az vm show -g $RESOURCE_GROUP -n $VM_NAME --show-detail --query publicIps -o tsv`
# VMに接続
ssh $VM_USER@$PUBLIC_IP
# Apacheをインストールし、SSH接続を終了
sudo apt install -y apache2
exit
# 動作確認
# ASGのルールでApacheのトップページが表示される
curl $PUBLIC_IP
# リソースのクリーンアップ
az group delete -n $RESOURCE_GROUP
まとめ
- NSGはサブネットやNIC単位でフィルターをかける時に使用する
- ASGは仮想マシン単位で詳細なフィルターをかける時に使用する
- NSG、ASGを設定する際は仮想ネットワークや仮想マシンと同じリージョンに作成する
- リージョンが一致していればリソースグループが異なってもNSG、ASGを使い回せる
参考資料
・ネットワーク セキュリティ グループ
https://docs.microsoft.com/ja-jp/azure/virtual-network/network-security-groups-overview
・アプリケーション セキュリティ グループ
https://docs.microsoft.com/ja-jp/azure/virtual-network/application-security-groups
・az network nsg rule
https://docs.microsoft.com/en-us/cli/azure/network/nsg/rule?view=azure-cli-latest
・az network asg
https://docs.microsoft.com/ja-jp/cli/azure/network/asg?view=azure-cli-latest