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ルール本体は変更不要になる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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
# 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
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
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 * *
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 (デフォルト拒否)
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)』を無料でプレゼントしています。こちらから無料ダウンロード。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AzureのService Principalをazコマンドで作成する方法|Linux環境変数による認証設定と権限設計の実践
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます