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