【Azure】NSGのセキュリティ規則設定をCSVで効率化
趣旨
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 }
Discussion