Note
Basic、Standard、Enterprise プランは、2025 年 3 月中旬以降非推奨になり、廃止期間は 3 年間です。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の廃止のお知らせ」を参照してください。
Standard 従量課金と専用プランは、2024 年 9 月 30 日以降に非推奨になり、6 か月後に完全にシャットダウンされます。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の Standard 従量課金および専用プランを Azure Container Apps に移行する」を参照してください。
この記事の適用対象:✅ Java ✅ C#
この記事の適用対象:✅ Basic/Standard ✅ Enterprise
この記事では、Palo Alto ファイアウォールで Azure Spring Apps を使用する方法について説明します。
現在のデプロイに Palo Alto ファイアウォールが含まれている場合は、この記事で説明されているように、Azure Spring Apps デプロイから Azure Firewall を省略し、代わりに Palo Alto を使用できます。
ルールやワイルドカードなどの構成情報は、Git リポジトリの CSV ファイルに保持する必要があります。 この記事では、オートメーションを使用してこれらのファイルを Palo Alto に適用する方法について説明します。 Palo Alto に適用される構成を理解するには、「VNET での Azure Spring Apps の実行に関するお客様の責任」を参照してください。
Note
この記事では、REST API の使用について説明する際に、ユーザーの裁量に任されている名前と値を示すために PowerShell 変数構文を使用しています。 すべての手順で同じ値を使用してください。
Palo Alto で TLS/SSL 証明書を構成したら、次の例のすべての Palo Alto REST API 呼び出しから -SkipCertificateCheck
引数を削除します。
この記事は、Palo Alto REST API のリファレンスとしては使用しないでください。 すべての例は、デモンストレーションのみを目的としています。 正式な API の詳細については、Palo Alto のドキュメントの「PAN-OS REST API」を参照してください。
前提条件
- Azure サブスクリプション。 サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
- Palo Alto のデプロイ。 デプロイがない場合は、Palo Alto を Azure Marketplace からプロビジョニングすることができます。
- PowerShell
- Azure CLI
Palo Alto を構成する
まず、Palo Alto VM-Series ファイアウォールを構成します。 詳細な手順については、Azure Marketplace からの VM-Series ファイアウォールのデプロイ (ソリューション テンプレート) に関するページを参照してください。 ここでは、VM-Series ファイアウォールをプロビジョニングし、Trust
および UnTrust
サブネットの両方と関連するネットワーク インターフェイス カードを構成する方法について説明します。 一貫性を維持するため、このファイアウォールは参照アーキテクチャの Hub
仮想ネットワークのアドレス空間に作成する必要があり ます。
Azure の参照アーキテクチャ ガイドでは、Azure でこのファイアウォールをデプロイするためのいくつかの技術設計モデルについて説明しています。
この記事の残りの部分では、次の 2 つの事前構成済みのネットワーク ゾーンがあることを前提としています。
-
Trust
。Azure Spring Apps 仮想ネットワークとピアリングされた仮想ネットワークに接続されているインターフェイスが含まれています。 -
UnTrust
。VM-Series デプロイ ガイドで既に作成済みのパブリック インターネットへのインターフェイスが含まれています。
CSV ファイルを準備する
次に、3 つの CSV ファイルを作成します。
1 つ目のファイルに AzureSpringAppsServices.csv という名前を付けます。 このファイルには、Azure Spring Apps 用のイングレス ポートが含まれている必要があります。 次の例の値は、デモ目的でのみ提供されています。 必要なすべての値については、「仮想ネットワークでの Azure Spring Apps の実行に関するお客様の責任」の「Azure Global に必要なネットワーク規則」セクションを参照してください。
name,protocol,port,tag
ASC_1194,udp,1194,AzureSpringApps
ASC_443,tcp,443,AzureSpringApps
ASC_9000,tcp,9000,AzureSpringApps
ASC_445,tcp,445,AzureSpringApps
ASC_123,udp,123,AzureSpringApps
2 つ目のファイルに AzureSpringAppsUrlCategories.csv という名前を付けます。 このファイルには、Azure Spring Apps からのエグレスに使用できるアドレス (ワイルドカードを含む) が含まれている必要があります。 次の例の値は、デモ目的でのみ提供されています。 最新の値については、「仮想ネットワークでの Azure Spring Apps の実行に関するお客様の責任」の「Azure Global に必要な FQDN とアプリケーションの規則」セクションを参照してください。
name,description
*.azmk8s.io,
mcr.microsoft.com,
*.cdn.mscr.io,
*.data.mcr.microsoft.com,
management.azure.com,
*.microsoftonline.com,
*.microsoft.com,
packages.microsoft.com,
acs-mirror.azureedge.net,
mscrl.microsoft.com,
crl.microsoft.com,
crl3.digicert.com
3 つ目のファイルに AzureMonitorAddresses.csv という名前を付けます。 このファイルには、Azure Monitor を使用している場合に Azure Monitor でメトリックと監視に使用できるようにするために、すべてのアドレスと IP 範囲を含める必要があります。 次の例の値は、デモ目的でのみ提供されています。 最新の値については、「Azure Monitor で使用される IP アドレス」を参照してください。
name,type,address,tag
40.114.241.141,ip-netmask,40.114.241.141/32,AzureMonitor
104.45.136.42,ip-netmask,104.45.136.42/32,AzureMonitor
40.84.189.107,ip-netmask,40.84.189.107/32,AzureMonitor
168.63.242.221,ip-netmask,168.63.242.221/32,AzureMonitor
52.167.221.184,ip-netmask,52.167.221.184/32,AzureMonitor
live.applicationinsights.azure.com,fqdn,live.applicationinsights.azure.com,AzureMonitor
rt.applicationinsights.microsoft.com,fqdn,rt.applicationinsights.microsoft.com,AzureMonitor
rt.services.visualstudio.com,fqdn,rt.services.visualstudio.com,AzureMonitor
Palo Alto に対して認証する
次に、Palo Alto に対して認証を行い、API キーを取得する必要があります。 詳細については、Palo Alto のドキュメントの API キーの取得に関するページを参照してください。
次の例では、PowerShell を使用して認証を行い、この記事の後半で使用する要求ヘッダーを生成します。
$username=<username for PaloAlto>
$password=<password for PaloAlto>
$authResponse = irm "https://${PaloAltoIpAddress}/api/?type=keygen&user=${username}&password=${password}" -SkipCertificateCheck
$paloAltoHeaders = @{'X-PAN-KEY' = $authResponse.response.result.key; 'Content-Type' = 'application/json' }
既存のサービスを削除する
前の構成を試みた場合は、これらの構成をリセットし、セキュリティ規則とサービス グループを削除する必要があります。
次の例に示すように、セキュリティ規則 REST API を使用してセキュリティ規則を削除します。
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Policies/SecurityRules?location=vsys&vsys=vsys1&name=${paloAltoSecurityPolicyName}"
Invoke-RestMethod -Method Delete -Uri $url -Headers $paloAltoHeaders -SkipCertificateCheck
次の例に示すように、サービス グループを削除します。
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Objects/ServiceGroups?location=vsys&vsys=vsys1&name=${paloAltoServiceGroupName}"
Invoke-RestMethod -Method Delete -Uri $url -Headers $paloAltoHeaders -SkipCertificateCheck
次の例に示すように、(AzureSpringAppsServices.csv で定義されているように) 各 Palo Alto サービスを削除します。
Get-Content .\AzureSpringAppsServices.csv | ConvertFrom-Csv | select name | ForEach-Object {
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Objects/Services?location=vsys&vsys=vsys1&name=${_}"
Invoke-RestMethod -Method Delete -Uri $url -Headers $paloAltoHeaders -SkipCertificateCheck
}
サービスとサービス グループを作成する
前に作成した AzureSpringAppsServices.csv ファイルに基づいてサービスの作成を自動化するには、次の例を使用します。
# Define a function to create and submit a Palo Alto service creation request
function New-PaloAltoService {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[PSCustomObject]
$ServiceObject
)
PROCESS {
$requestBody = @{
'entry' = @{
'@name' = $ServiceObject.name
'protocol' = @{
$ServiceObject.protocol = @{
'port' = $ServiceObject.port
'override' = @{
'no' = @{}
}
}
}
'tag' = @{
'member' = @($ServiceObject.tag)
}
}
}
# Some rules in the CSV may need to conain source ports or descriptions. If these are present, populate them in the request
if ($ServiceObject.description) {
$requestBody.entry.description = $ServiceObject.description
}
if ($ServiceObject.'source-port') {
$requestBody.entry.protocol."$($ServiceObject.protocol)".'source-port' = $ServiceObject.'source-port'
}
# Send the request
$name = $requestBody.entry.'@name'
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Objects/Services?location=vsys&vsys=vsys1&name=${name}"
Invoke-RestMethod -Method Post -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders -Body (ConvertTo-Json -WarningAction Ignore $requestBody -Depth 9) -Verbose
}
}
# Now invoke that function for every row in AzureSpringAppsServices.csv
Get-Content ./AzureSpringAppsServices.csv | ConvertFrom-Csv | New-PaloAltoService
次に、次の例に示すように、これらのサービスのサービス グループを作成します。
# Create a function to consume service definitions and submit a service group creation request
function New-PaloAltoServiceGroup {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[PSCustomObject[]]
$RuleData,
[Parameter(Mandatory = $true)]
[string]
$ServiceGroupName
)
begin {
[array] $names = @()
}
process {
$names += $RuleData.name
}
end {
$requestBody = @{ 'entry' = [ordered] @{
'@name' = $ServiceGroupName
'members' = @{ 'member' = $names }
'tag' = @{ 'member' = 'AzureSpringApps' }
}
}
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Objects/ServiceGroups?location=vsys&vsys=vsys1&name=${ServiceGroupName}"
Invoke-RestMethod -Method Post -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders -Body (ConvertTo-Json $requestBody) -Verbose
}
}
# Run that function for all services in AzureSpringAppsServices.csv.
Get-Content ./AzureSpringAppsServices.csv | ConvertFrom-Csv | New-PaloAltoServiceGroup -ServiceGroupName 'AzureSpringApps_SG'
カスタム URL カテゴリを作成する
次に、次の例に示すように、サービス グループのカスタム URL カテゴリを、Azure Spring Apps からのエグレスを有効にするように定義します。
# Read Service entries from CSV to enter into Palo Alto
$csvImport = Get-Content ${PSScriptRoot}/AzureSpringAppsUrls.csv | ConvertFrom-Csv
# Convert name column of CSV to add to the Custom URL Group in Palo Alto
$requestBody = @{ 'entry' = [ordered] @{
'@name' = 'AzureSpringApps_SG'
'list' = @{ 'member' = $csvImport.name }
'type' = 'URL List'
}
} | ConvertTo-Json -Depth 9
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Objects/CustomURLCategories?location=vsys&vsys=vsys1&name=AzureSpringApps_SG"
try {
$existingObject = Invoke-RestMethod -Method Get -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders
Invoke-RestMethod -Method Delete -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders
}
catch {
}
Invoke-RestMethod -Method Post -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders -Body $requestBody -Verbose
セキュリティ規則を作成する
次に、JSON ファイルを作成してセキュリティ規則を含めます。 このファイルに Securityrule. json という名前を付けて、次の内容を追加します。 2 つのゾーン Trust
および UnTrust
の名前は、「Palo Alto を構成する」セクションで前に説明したゾーン名と一致します。
service/member
エントリには、前の手順で作成したサービス グループの名前が含まれています。
{
"entry": [
{
"@name": "AzureSpringAppsRule",
"@location": "vsys",
"@vsys": "vsys1",
"to": {
"member": [
"UnTrust"
]
},
"from": {
"member": [
"Trust"
]
},
"source-user": {
"member": [
"any"
]
},
"application": {
"member": [
"any"
]
},
"service": {
"member": [
"AzureSpringApps_SG"
]
},
"hip-profiles": {
"member": [
"any"
]
},
"action": "allow",
"category": {
"member": [
"any"
]
},
"source": {
"member": [
"any"
]
},
"destination": {
"member": [
"any"
]
}
}
]
}
ここで、次の例に示すように、この規則を Palo Alto に適用します。
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Policies/SecurityRules?location=vsys&vsys=vsys1&name=AzureSpringAppsRule"
# Delete the rule if it already exists
try {
$getResult = Invoke-RestMethod -Headers $paloAltoHeaders -Method Get -SkipCertificateCheck -Uri $url -Verbose
if ($getResult.'@status' -eq 'success') {
Invoke-RestMethod -Method Delete -Headers $paloAltoHeaders -SkipCertificateCheck -Uri $url
}
}
catch {}
# Create the rule from the JSON file
Invoke-WebRequest -Uri $url -Method Post -Headers $paloAltoHeaders -Body (Get-Content SecurityRule.json) -SkipCertificateCheck
Azure Monitor アドレスを作成する
次に、AzureMonitorAddresses.csv ファイルを使用して、Palo Alto でアドレス オブジェクトを定義します。 次の例のコードでは、このタスクを自動化する方法を示します。
Get-Content ./AzureMonitorAddresses.csv | ConvertFrom-Csv | ForEach-Object {
$requestBody = @{ 'entry' = [ordered]@{
'@name' = $_.name
$_.type = $_.address
'tag' = @{ 'member' = @($_.tag) }
}
}
$name = $requestBody.entry.'@name'
$url = "https://${PaloAltoIpAddress}/restapi/v9.1/Objects/Addresses?location=vsys&vsys=vsys1&name=${name}"
# Delete the address if it already exists
try {
Invoke-RestMethod -Method Delete -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders
}
catch {
}
# Create the address
Invoke-RestMethod -Method Post -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders -Body (ConvertTo-Json -WarningAction Ignore $requestBody -Depth 3) -Verbose
}
変更を Palo Alto にコミットする
上記の変更がアクティブになるように、その一部をコミットする必要があります。 これは次の REST API 呼び出しで行うことができます。
$url = "https://${PaloAltoIpAddress}/api/?type=commit&cmd=<commit></commit>"
Invoke-RestMethod -Method Get -Uri $url -SkipCertificateCheck -Headers $paloAltoHeaders
Azure Spring Apps サブネットのセキュリティ規則を構成する
次に、Palo Alto からのトラフィックが Azure Spring Apps にアクセスできるように、ネットワーク セキュリティ規則を追加します。 次の例では、参照アーキテクチャによって作成されたスポーク ネットワーク セキュリティ グループ (NSG) (nsg-spokeapp
および nsg-spokeruntime
) を参照します。
PowerShell ウィンドウで次の Azure CLI コマンドを実行して、これらの NSG のそれぞれに必要なネットワーク セキュリティ規則を作成します。ここで、$PaloAltoAddressPrefix
は、Palo Alto のプライベート IP の Classless Inter-Domain Routing (CIDR) アドレスです。
az network nsg rule create `
--resource-group $ResourceGroupName `
--name 'allow-palo-alto' `
--nsg-name 'nsg-spokeapp' `
--access Allow `
--source-address-prefixes $PaloAltoAddressPrefix `
--priority 1000
az network nsg rule create `
--resource-group $ResourceGroupName `
--name 'allow-palo-alto' `
--nsg-name 'nsg-spokeruntime' `
--access Allow `
--source-address-prefixes $PaloAltoAddressPrefix `
--priority 1000
次ホップを構成する
Palo Alto を構成したら、発信インターネット アクセスの次ホップとして Palo Alto を持つように Azure Spring Apps を構成します。 この構成には、PowerShell ウィンドウで次の Azure CLI コマンドを使用できます。 次の変数の値を指定してください。
-
$AppResourceGroupName
: Azure Spring Apps を含むリソース グループの名前。 -
$AzureSpringAppsServiceSubnetRouteTableName
: Azure Spring Apps サービス/ランタイム サブネット ルート テーブルの名前。 参照アーキテクチャでは、これはrt-spokeruntime
に設定されます。 -
$AzureSpringAppsAppSubnetRouteTableName
: Azure Spring Apps アプリのサブネット ルート テーブルの名前。 参照アーキテクチャでは、これはrt-spokeapp
に設定されます。
az network route-table route create `
--resource-group ${AppResourceGroupName} `
--name default `
--route-table-name ${AzureSpringAppsServiceSubnetRouteTableName} `
--address-prefix 0.0.0.0/0 `
--next-hop-type VirtualAppliance `
--next-hop-ip-address ${PaloAltoIpAddress} `
--verbose
az network route-table route create `
--resource-group ${AppResourceGroupName} `
--name default `
--route-table-name ${AzureSpringAppsAppSubnetRouteTableName} `
--address-prefix 0.0.0.0/0 `
--next-hop-type VirtualAppliance `
--next-hop-ip-address ${PaloAltoIpAddress} `
--verbose
これで構成は完了です。