Azureでセキュリティルールを簡単にコピーしたい
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