🛠️

【Azure】NSGのセキュリティ規則設定をCSVで効率化

2021/09/28に公開

趣旨

Azure NSG(ネットワークセキュリティグループ)のセキュリティ規則を、CSVで一気に追加/削除する方法を紹介します。
大量の通信要件を追加する場合や、複数のグループへの変更を適用する場合は、こちらの方法が参考になるかと思います。

使用するサービス/ツール

  • Azure CLI
  • PowerShell

前提

  • 端末にAzure CLI[1]をインストールしており、Powershellから操作可能なこと。
     ※Azure PowerShellのやり方は掲載しておりません。
  • 対象のセキュリティグループが存在していること

1. CSVファイルの作成

1-1. フォーマットの作成

まずフォーマットを作成します。
下記の値をExcelの一列目に記載し、CSVファイルとして保存します。

ResourceGroup NSGName Name Access Protocol Direction Priority SourceAddressPrefix SourcePortRange DestinationAddressPrefix DestinationPortRange

1-2. パラメータシートの作成

1.で作成したフォーマットに、希望の通信要件を追記していきます。
各項目ごとの記載ルールは下記の通りに認識しておりますが、詳細はコマンドリファレンスをご確認ください。

項目 ルール
ResourceGroup 対象のリソースグループ名を指定
NSGName 対象のネットワークセキュリティグループ名を指定
Name 設定する規則名を指定
Access Allow か Deny を指定
Protocol TCP, UDP, ICMP, * のいずれかを指定
Direction Inbound か Outbound を指定
Priority 100 (最高優先度) と 4096 (最も低い優先度)の間 から指定
SourceAddressPrefix 送信元IPアドレス等を指定(Any : *). カンマ区切りで複数指定可能.
SourcePortRange 送信元ポートを指定(Any : *). カンマ区切りで複数指定可能.
DestinationAddressPrefix 宛先IPアドレスを指定(Any : *). カンマ区切りで複数指定可能.
DestinationPortRange 宛先ポートを指定(Any : *). カンマ区切りで複数指定可能.

※記入例
「NSG1」と「NSG2」というグループに対し、10.0.0.0/32と20.0.0.0/32からのicmpを許可する規則「ICMP」と、10.0.0.0/32と20.0.0.0/32へのhttpとhttpsを拒否する規則「HTTP_HTTPS」を設定しています。

ResourceGroup NSGName Name Access Protocol Direction Priority SourceAddressPrefix SourcePortRange DestinationAddressPrefix DestinationPortRange
RG NSG1 ICMP Allow ICMP Inbound 100 10.0.0.0/32,20.0.0.0/32 * VirtualNetwork *
RG NSG2 HTTP_HTTPS Deny TCP Outbound 100 VirtualNetwork * 10.0.0.0/32,20.0.0.0/32 80,443

ここまで記載出来たら、フォーマットとは別のCSVファイルとして保存します。
ホームディレクトリ配下に置いておくと楽ですね。


2. コマンドラインで設定

2-1. ログイン

Powershellを立ち上げて、ログインします。

> az login

2-2. CSV取り込み

環境変数「CSV」を定義し、作成したCSVファイル(パラメータシート)を取り込み、内容を確認します。
本記事では、作成したパラメータシートを「test_azure.csv」として保存しています。
※コマンドを実行するディレクトリにCSVファイルがない場合は、ディレクトリを移動するか、パスを指定する必要があります。

# 環境変数に取り込み
> $CSV = Import-CSV test_azure.csv -Encoding UTF8

# 内容確認
> $CSV

ResourceGroup        : RG
NSGNAME              : NSG1
~~
ResourceGroup        : RG
NSGNAME              : NSG2
~~
DestinationPortRange : 80,443

2-3. 事前コンフィグの取得

変更前の設定内容をテキストファイル等で取得したい場合は、下記コマンドを実行します。
ここでは、「before.txt」に対象の「NSG1」と「NSG2」の設定内容をテーブル形式で出力しています。

# 「Sort-Object NSGName -Unique」によって、グループ名の重複排除を行っていますので、同じグループの設定内容が出力されることはありません。
> $CSV | Sort-Object NSGName -Unique | foreach{
az network nsg rule list --output table `
--resource-group $_.ResourceGroup `
--nsg-name $_.NSGName `
| tee before.txt -a }

# 下記のようなテーブル形式で、それぞれのセキュリティグループの設定が出力されます。
> cat before.txt
Name       ResourceGroup  Priority     SorcePortRanges   ~~
---------- -------------- ------------ ----------------- ~~
Rule1      RG             110           *
Rule2      RG             120           20
~~         ~~             ~~            ~~

2-4. 規則の追加

環境変数「CSV」に取り込んだ内容を追加していきます。
下記コマンドを実行します。
※そのままコピペで大丈夫です

> $CSV | foreach{
az network nsg rule create `
--resoure-group $_.ResourceGroup `
--nsg-name $_.NSGName `
--name $_.Name `
--priority $_.Priority `
--access $_.Access `
--destination-address-prefixes ($_.DestinationAddressPrefix -split ",") ` 
--destination-port-ranges ($_.DestinationPortRange -split ",") `
--direction $_.Direction `
--protocol $_.Protocol `
--source-address-prefixes ($_.SourceAddressPrefix -split ",") `
--source-port-ranges ($_.SourcePortRange -split ",") `
}

# Start ⇒ Runnning ⇒ JSON形式の設定内容が表示されればOK

2-5. 規則の削除

環境変数「CSV」に取り込んだ内容を削除します。
下記コマンドを実行します。

> $CSV | foreach{
az network nsg rule delete `
--resoure-group $_.ResourceGroup `
--nsg-name $_.NSGName `
--name $_.Name `
}

# 下記が表示されればOK
{
    "Return": true
}

2-6. 事後確認

作業通りに設定されているか確認します。方法の指定はありません。
WebUIで直接確認するか、「3. 事前コンフィグの取得」の要領と同じく、別ファイルに出力し、diffツールで比較する方法も考えれます。
※例 「after.txt」へ出力

> $CSV | Sort-Object NSGName -Unique | foreach{
az network nsg rule list --output table `
--resource-group $_.ResourceGroup `
--nsg-name $_.NSGName `
| tee after.txt -a }

3. 終わりに

脚注
  1. Windows での Azure CLI のインストール ↩︎

Discussion