Azure ネットワークセキュリティグループとアプリケーションセキュリティグループについて

投稿者: | 2022-02-23

今回は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を使い回せる

参考資料