AzureのApplication Security Group(ASG)でNSGルールをグループ化する方法|IPアドレス管理を不要にするVNetセキュリティ設計の実践

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのApplication Security Group(ASG)でNSGルールをグループ化する方法|IPアドレス管理を不要にするVNetセキュリティ設計の実践
「VMを増やすたびにNSGルールのIPアドレスを手で追加しているが、これじゃ管理が追いつかない」
Azure VNetでNSGを使い始めた現場エンジニアから、よく耳にする声です。10台、20台とVMが増えていくと、送信元・宛先のIPアドレスをルールに直書きするやり方は破綻します。1台のIPが変わるだけで、関連するNSGルールを全件手動更新しなければなりません。

この記事では、Azure Application Security Group(ASG)を使ってNSGルールをVM役割別にグループ化する方法を、azコマンドの実行例と実サーバー出力を交えて解説します。Web層・AP層・DB層の3層構成を例に、IPアドレスに依存しないVNetセキュリティ設計の実践手順まで一通りカバーします。

この記事のポイント

・ASGはVM役割(Web/AP/DB)を名前でグループ化しNSGルールを簡潔に書ける
・az network asg createとaz network nic updateでNICに割り当てる
・NSGルールの--source-asgsでIPアドレスの代わりにASG名を指定できる
・VMのIP変更・台数増減があってもNSGルール本体は変更不要になる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

NSGルールがIPアドレス管理で限界を迎える問題

Azure NSG(Network Security Group)はVNetの通信を制御するファイアウォール機能です。送信元・宛先にCIDRやIPアドレスを指定してルールを定義します。

小規模なうちはシンプルでわかりやすい仕組みですが、構成が拡大すると次のような問題が出てきます。

IP直書きルールの爆発:WebサーバーVMが5台になると「10.0.1.4, 10.0.1.5, 10.0.1.6, 10.0.1.7, 10.0.1.8 からの80番を許可」のようにIPを列挙しなければなりません
VMを増やすたびに手作業が発生:新しいVMを追加するたびに、そのVMに関係するNSGルールのIPリストを全件更新する必要があります
動的IPへの対応困難:VMを一度削除して再作成すると内部IPが変わる場合があり、NSGルールが意図せず壊れます

この問題を解消するのがASG(Application Security Group)です。

ASG(Application Security Group)とは何か

ASGはVNet内のVM(正確にはVMのNIC)を論理的にグループ化するオブジェクトです。NSGルールの送信元・宛先にIPアドレスの代わりにASG名を指定できるため、「どのIPから」ではなく「どのロールから」という形でルールを定義できます。

項目 IPアドレス指定(従来) ASG指定(推奨)
ルール定義 10.0.1.4, 10.0.1.5... を列挙 web-asg という名前を指定
VM追加時の作業 NSGルールのIPリストを更新 新VMのNICをASGに追加するだけ
IP変更時の影響 NSGルールを手動修正が必要 ASG側が自動追従し影響なし
ルールの可読性 IPの意味を別途ドキュメント化が必要 web-asg→db-asg で意図が一目瞭然

ASGの制約として押さえておくべき点は2つあります。
同一リージョン制約:ASGとそのASGに割り当てるVMは同じAzureリージョンに存在している必要があります
NICへの割り当て:ASGはVMではなくNIC(ネットワークインターフェース)に割り当てます。1つのNICに複数のASGを割り当てることも可能です

ASGを使ったNSGルール設定の基本手順

実行環境:Azure CLI 2.x 以上インストール済み・Azureサブスクリプション取得済み。以下の手順はUbuntu 24.04 LTS上のAzure CLIおよびAzure Cloud Shellで動作確認しています。

ASGを使った実践ハンズオンはAzureハンズオン学習コース(https://azure.linuxmaster.jp/)でも体系的に学べます。

1. リソースグループとVNetの作成

作業用リソースグループとVNetを用意します。すでに存在する場合はスキップして構いません。

# リソースグループの作成 az group create \ --name rg-asg-demo \ --location japaneast # VNetとサブネットの作成(10.0.0.0/16 の中に 3層分のサブネットを切る) az network vnet create \ --resource-group rg-asg-demo \ --name vnet-asg-demo \ --address-prefix 10.0.0.0/16 \ --subnet-name snet-app \ --subnet-prefix 10.0.1.0/24

2. ASGを作成する

Webサーバー用・APサーバー用・DBサーバー用の3つのASGを作成します。

# Webサーバー用ASG az network asg create \ --resource-group rg-asg-demo \ --name web-asg # APサーバー用ASG az network asg create \ --resource-group rg-asg-demo \ --name app-asg # DBサーバー用ASG az network asg create \ --resource-group rg-asg-demo \ --name db-asg

作成確認:

az network asg list --resource-group rg-asg-demo --output table Name Location ResourceGroup ProvisioningState ------- ---------- --------------- ------------------- app-asg japaneast rg-asg-demo Succeeded db-asg japaneast rg-asg-demo Succeeded web-asg japaneast rg-asg-demo Succeeded

3. Linux VMのNICにASGを割り当てる

既存VMのNICにASGを割り当てる方法と、VM作成時にASGを指定する方法の両方を紹介します。

まずNIC名を確認します。

# VMに紐付いているNICの名前を確認する az vm show \ --resource-group rg-asg-demo \ --name vm-web01 \ --query "networkProfile.networkInterfaces[0].id" \ --output tsv /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-asg-demo/providers/Microsoft.Network/networkInterfaces/vm-web01VMNic

NIC名が確認できたら、そのNICにASGを割り当てます。

# vm-web01 のNICを web-asg に割り当てる az network nic update \ --resource-group rg-asg-demo \ --name vm-web01VMNic \ --application-security-groups web-asg # vm-app01 のNICを app-asg に割り当てる az network nic update \ --resource-group rg-asg-demo \ --name vm-app01VMNic \ --application-security-groups app-asg # vm-db01 のNICを db-asg に割り当てる az network nic update \ --resource-group rg-asg-demo \ --name vm-db01VMNic \ --application-security-groups db-asg

新規VM作成時にASGを一緒に指定する場合は、az vm create--asgs オプションを追加します。

# VM作成と同時にASGを割り当てる例(Webサーバー追加) az vm create \ --resource-group rg-asg-demo \ --name vm-web02 \ --image Ubuntu2204 \ --vnet-name vnet-asg-demo \ --subnet snet-app \ --asgs web-asg \ --generate-ssh-keys \ --public-ip-address "" \ --size Standard_B1s

このコマンド1行で、VMのNICが自動的に web-asg に紐付きます。IPアドレスが何になっても、web-asgのメンバーとして正しくNSGルールが適用されます。

4. NSGを作成してASGを参照するルールを定義する

NSGを作成し、IPアドレスの代わりにASG名でルールを定義します。

# NSGの作成 az network nsg create \ --resource-group rg-asg-demo \ --name nsg-asg-demo # ルール1: インターネットからweb-asgへのHTTPS通信を許可 az network nsg rule create \ --resource-group rg-asg-demo \ --nsg-name nsg-asg-demo \ --name allow-https-to-web \ --priority 100 \ --direction Inbound \ --source-address-prefixes Internet \ --destination-asgs web-asg \ --destination-port-ranges 443 \ --protocol Tcp \ --access Allow # ルール2: web-asgからapp-asgへの8080番通信を許可 az network nsg rule create \ --resource-group rg-asg-demo \ --nsg-name nsg-asg-demo \ --name allow-web-to-app \ --priority 200 \ --direction Inbound \ --source-asgs web-asg \ --destination-asgs app-asg \ --destination-port-ranges 8080 \ --protocol Tcp \ --access Allow # ルール3: app-asgからdb-asgへのMySQL通信を許可 az network nsg rule create \ --resource-group rg-asg-demo \ --nsg-name nsg-asg-demo \ --name allow-app-to-db \ --priority 300 \ --direction Inbound \ --source-asgs app-asg \ --destination-asgs db-asg \ --destination-port-ranges 3306 \ --protocol Tcp \ --access Allow

ルール一覧の確認:

az network nsg rule list \ --resource-group rg-asg-demo \ --nsg-name nsg-asg-demo \ --output table Name Priority Direction Access Protocol SourcePortRanges DestinationPortRanges SourceAddressPrefixes DestinationAddressPrefixes ------------------- -------- --------- ------ -------- ---------------- --------------------- --------------------- -------------------------- allow-app-to-db 300 Inbound Allow Tcp * 3306 * * allow-https-to-web 100 Inbound Allow Tcp * 443 Internet * allow-web-to-app 200 Inbound Allow Tcp * 8080 * *

SourceAddressPrefixes と DestinationAddressPrefixes が * と表示されるのは、実際にはASG参照が別フィールドに格納されているためです。az network nsg rule show で詳細を確認すると sourceApplicationSecurityGroups にASGのリソースIDが入っています。

最後にNSGをサブネットに紐付けます。

# NSGをサブネットに関連付ける az network vnet subnet update \ --resource-group rg-asg-demo \ --vnet-name vnet-asg-demo \ --name snet-app \ --network-security-group nsg-asg-demo

実践例:Web・AP・DB 3層構成でのASG設計

本番環境でよく使われる3層構成(Webフロント・アプリケーション・データベース)を想定したASG設計の全体像を整理します。

この構成では、インターネットからはWebサーバーだけが見える形にします。APサーバーとDBサーバーはプライベートサブネット側に配置し、直接のインターネットアクセスを遮断します。

# 実際の通信フロー Internet → web-asg(443) → app-asg(8080) → db-asg(3306) # ASGルール設計の読み方 ルール名 優先度 送信元 宛先 ポート allow-https-to-web 100 Internet web-asg 443/tcp allow-web-to-app 200 web-asg app-asg 8080/tcp allow-app-to-db 300 app-asg db-asg 3306/tcp DenyAllInbound 4096 (デフォルト拒否)

この設計の強みはWebサーバーを追加しても「vm-web03 のNICをweb-asgに加えるだけ」でNSGルールが即座に適用される点です。NSGルールのIPリストを手動更新する手間がなくなります。

ASGメンバーの一覧確認はNIC側で行います。

# web-asgに属しているNICを確認する az network nic list \ --resource-group rg-asg-demo \ --query "[?applicationSecurityGroups[?contains(id,'web-asg')]].{NIC:name, VM:virtualMachine.id}" \ --output table NIC VM --------------- ----------------------------------------------------------- vm-web01VMNic .../virtualMachines/vm-web01 vm-web02VMNic .../virtualMachines/vm-web02

トラブルシュート:ASGが効かない時の確認手順

「ASGをNSGルールに指定したが通信が拒否される」

最初に確認するのはNICへのASG割り当て状況です。NSGルールでASG名を参照していても、対象VMのNICがそのASGに割り当たっていなければルールは適用されません。

# NICのASG割り当て状況を確認する az network nic show \ --resource-group rg-asg-demo \ --name vm-web01VMNic \ --query "applicationSecurityGroups[].id" \ --output tsv # 何も出力されない場合 → ASGが未割り当て # 以下のコマンドで割り当てを追加する az network nic update \ --resource-group rg-asg-demo \ --name vm-web01VMNic \ --application-security-groups web-asg

「az network nic update でASGを追加したら既存のASGが消えた」

注意--application-security-groups は上書き動作です。複数のASGを1つのNICに割り当てたい場合はスペース区切りで列挙します。

# web-asg と monitoring-asg の両方を割り当てる場合(スペース区切りで列挙) az network nic update \ --resource-group rg-asg-demo \ --name vm-web01VMNic \ --application-security-groups web-asg monitoring-asg

「異なるリージョンのVMにASGを割り当てようとするとエラーが出る」

ASGとVMのリージョンが一致していない場合に発生するエラーです。

# エラー例 (InvalidParameter) The applicationSecurityGroup is in different location than the networkInterface. # 確認方法:VMとASGのリージョンを突き合わせる az vm show --resource-group rg-asg-demo --name vm-web01 \ --query "location" --output tsv # → japaneast az network asg show --resource-group rg-asg-demo --name web-asg \ --query "location" --output tsv # → japanwest ← ここが食い違っているとエラー # 対処:同一リージョンにASGを再作成してVMリージョンと一致させる

「Network Watcherで通信テストするとNSGのどのルールが適用されているか確認したい」

Network Watcher の IP Flow Verify(IPフロー確認)はASGを含むルールの評価順序を可視化できます。どのNSGルールが通信を許可・拒否したかを確認する際に使います。

az network watcher test-ip-flow \ --resource-group rg-asg-demo \ --vm vm-web01 \ --direction Inbound \ --protocol Tcp \ --local 10.0.1.4:443 \ --remote 203.0.113.1:54321 Access RuleName -------- ------------------- Allow allow-https-to-web

本記事のまとめ

やりたいこと コマンド
ASGを作成する az network asg create --resource-group rg --name web-asg
VMのNICにASGを割り当てる az network nic update --name nic --application-security-groups web-asg
VM作成時にASGを指定する az vm create --asgs web-asg
NSGルールでASGを宛先指定する az network nsg rule create --destination-asgs web-asg
NSGルールでASGを送信元指定する az network nsg rule create --source-asgs app-asg
ASGメンバーのNICを確認する az network nic list --query "[?applicationSecurityGroups...]"
通信テスト(IPフロー確認) az network watcher test-ip-flow --vm vm-web01

VMが数台の段階ではIPアドレスの直書きでもなんとかなります。しかし構成が拡大してスケールアウトが当たり前になる環境では、ASGを最初から設計に組み込んでおくと後から大きく楽になります。「このVMはWebロール」という意図をNSGルール自体に持たせることで、設計書なしでもルールの意図が一目でわかる構成になります。

AzureのVNet・NSG・ASG設計スキルも、Linuxサーバー構築の「型」から体系的に理解できます

azコマンドを動かせるだけでなく、「なぜこのネットワーク設計にするか」を説明できるかどうかで現場での信頼が変わります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Azureハンズオン学習コースでは実機を使った演習で即戦力スキルを習得できます。

「Linuxの基礎から体系的に学びたい」という方には、『Linuxサーバー構築入門マニュアル(図解60P)』を無料でプレゼントしています。こちらから無料ダウンロード

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。