Young Leaves

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

参考資料