Azure ネットワークセキュリティグループとアプリケーションセキュリティグループについて
今回はAzure の仮想ネットワークのアクセス制御を行うネットワークセキュリティグループ (NSG) とアプリケーションセキュリティグループ (ASG) についての仕組みや作成方法について説明します。

ネットワークセキュリティグループ (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最初の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 apache2exit
動作確認
ASGのルールでApacheのトップページが表示される
curl $PUBLIC_IP
リソースのクリーンアップ
az group delete -n $RESOURCE_GROUPまとめ
- NSG はサブネットやNIC 単位でフィルターをかける時に使用する
- ASG は仮想マシン単位で詳細なフィルターをかける時に使用する
- NSG、ASG を設定する際は仮想ネットワークや仮想マシンと同じリージョンに作成する
- リージョンが一致していればリソースグループが異なってもNSG、ASG を使い回せる
