🛸

Azureでセキュリティルールを簡単にコピーしたい

2023/11/15に公開

Azureの既存NSG(ファイアウォール)に大量のセキュリティルールを登録する必要がありました。
面倒くさいので他のNSGにあるセキュリティルールをコピーし、差分だけ修正しようと思います。

既存NSGをコピーして新規NSGを作成する方法はネットでもちらほらと紹介されているのですが、既存NSGのセキュリティルールを既存NSGに追加する方法が見つけられなかったので記事にしました。

Azure PowerShell 実行環境の作成

Azure Portal から Azure Cloud Shell を介して、ブラウザ上でコマンドを実行することも出来ますが、若干の利用料金が発生するようなので、ローカルPCにインストールします。

主にLinuxユーザが使う Azure CLI という az で始まるコマンド群もありますが、ここでは解説しません。

2024年2月29日に AzureRM PowerShell モジュールは廃止になるそうで、AzureRM から Az PowerShell への移行が進められています。
なので、AzureRM の解説もしません。

AzureRM と Az PowerShell は共存できないので、AzureRM を使っているならUninstall-AzureRmで削除しておいて下さい。

基本的には、次のコマンドでインストールできます。

Install-Module -Name Az -AllowClobber -Scope CurrentUser

ただし、環境によっては、事前に色々準備が必要だったりするので、もしDocker環境があるなら、マイクロソフトが公開しているDockerイメージを使うのがお勧めです。

最新イメージのダウンロード

docker pull mcr.microsoft.com/azure-powershell

最新イメージには、最新バージョンの PowerShell、Az PowerShell でサポートされている最新の Azure PowerShell モジュールが含まれています。

対話モードでコンテナを実行

docker run -it mcr.microsoft.com/azure-powershell pwsh

Azure に接続

Connect-AzAccountコマンドレットを使うのですが、Dockerコンテナから接続する場合は-UseDeviceAuthenticationオプションが必要です。
コンテナやSSHセッションではブラウザを自動的に起動できないためです。

WARNING: Interactive authentication is not supported in this session, please run cmdlet 'Connect-AzAccount -UseDeviceAuthentication'.

【和訳】このセッションでは対話型認証はサポートされていません。「Connect-AzAccount -UseDeviceAuthentication」コマンドレットを実行してください。

コンテナでは次のコマンドで接続します。
(コンテナでないなら-UseDeviceAuthenticationは不要)

Connect-AzAccount -UseDeviceAuthentication -Tenant テナントID -SubscriptionId サブスクリプションID

コンテナの場合、次のようなメッセージが返ってきます。

WARNING: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.

【和訳】サインインするには、ブラウザを使って https://microsoft.com/devicelogin のページを開き、コード XXXXXXXXX を入力して認証してください。

指示に従うと認証され、接続できます。
ブラウザは、シークレットモード(InPrivateウィンドウ)で起動すると誤作動が無いと思います。

セキュリティルールのコピー手順

指定NSG(ここではコピー元)のセキュリティルールをオブジェクト変数に代入します。

$rules = (Get-AzNetworkSecurityGroup -Name "src-nsg").SecurityRules

確認してみましょう。

$rules

Protocol Name                   Access Priority Direction ProvisioningState
-------- ----                   ------ -------- --------- -----------------
TCP      default-allow-rdp      Allow  1000     Inbound   Succeeded
*        DenyinternetOutBound   Allow  980      Outbound  Succeeded
TCP      AllowFOO_TCP445        Allow  902      Inbound   Succeeded
TCP      AllowFOO_TCP50023      Allow  904      Inbound   Succeeded
UDP      AllowFOO_UDP1434       Allow  903      Inbound   Succeeded
TCP      AllowBAR_TCP445        Allow  952      Inbound   Succeeded
UDP      AllowBAR_UDP1434       Allow  953      Inbound   Succeeded
TCP      AllowBAR_TCP50023      Allow  954      Inbound   Succeeded
*        AllowAzureLoadBalancer Allow  3999     Inbound   Succeeded
TCP      DenyTCPVnetInBound     Allow  4010     Inbound   Succeeded
UDP      DenyUDPVnetInBound     Allow  4020     Inbound   Succeeded
*        AllowFromBackupServer  Allow  955      Inbound   Succeeded

コピー先NSGをオブジェクト変数に代入します。

$nsg = Get-AzNetworkSecurityGroup -Name "dst-nsg"

コピー先NSGのセキュリティルールを確認します。

$nsg.SecurityRules

Protocol Name                 Access Priority Direction ProvisioningState
-------- ----                 ------ -------- --------- -----------------
TCP      default-allow-rdp    Allow  1000     Inbound   Succeeded
TCP      AllowAnyHTTPOutbound Allow  1010     Outbound  Succeeded

デフォルトのセキュリティルールが設定されていますね。

要らないので削除します。

$nsg.SecurityRules.Clear()

空になったことを確認しましょう。

$nsg.SecurityRules

コピー先NSGに、コピー元NSGのセキュリティルールを追加します。
オブジェクト変数を更新しているだけなので、まだ反映されていません。安心して下さい。

foreach ($rule in $rules) {
    $nsg.SecurityRules.Add($rule)
}

追加されたことを確認します。

$nsg.SecurityRules

Azureに反映します。

Set-AzNetworkSecurityGroup -NetworkSecurityGroup $nsg

必要に応じて、GUIの画面から修正して下さい。

Discussion