Azure App Serviceの「高度なツールサイト」には、SSHなど開発やデバッグに役立つ便利で強力なツールが備わっている。しかし、それ故に誤って使うとトラブルの発生の危険性があるので、アクセスを制限して保護したいところだ。そこで、発信元(ソース)のIPアドレスで「高度なツールサイト」へのアクセスを制限する方法を紹介する。
対象:Azure App Service(Web App)、Bicep
Azureの「App Service」でコンテンツやAPIなどをホストする本サイト(メインサイト)を生成すると、「高度なツールサイト」(「scm」「kudu」とも呼ばれる)という開発に役立つサイトが併設される。Linuxインスタンスの場合、SSHやBashでログインしてファイル操作や設定ファイルの直接編集などができる。またログのダウンロードやデプロイの状況確認なども可能だ。
ただ、デフォルトではAzureの管理者アカウントによる認証さえ済ませれば簡単にアクセスできてしまう。メインサイトのシステムを直接操作できるのだから、アクセス元(発信元)でも制限を掛けたい、と思ったことはないだろうか? あるいは何らかの脆弱性診断の結果、制限の強化を推奨されたことはないだろうか?
そこで本Tech TIPSでは、「高度なツールサイト」を保護する幾つかの機能から、比較的手軽に設定しやすい「ソース(クライアント)IPアドレスによる制限」について説明する。まずはハードルの低いAzureポータルでの設定手順を説明し、その上で、リソーステンプレートによってデプロイ時に設定する方法を説明しよう。対象の言語はBicepとする。
また、App Serviceで実装するWebサイト(メインサイト)は広く一般に公開していることを前提としている。仮想ネットワークなどに配置したサイトは想定していない。
Azureポータルの場合、App ServiceのソースIPアドレス制限は「ネットワーク」の「受信トラフィック」欄にある[アクセス制限]で設定する。
高度なツールサイトの場合、デフォルトは「拒否」としつつ、リモートからアクセスできる必要がある拠点のIPアドレスのみ「許可」すればよいだろう。そのために[一致しないルールのアクション]では[拒否]を選択しつつ、各規則の[アクション]では[許可]を選択する。
[メインサイトルールを使用する]チェックボックスにチェックを入れて「オン」にすると、メインサイトすなわちコンテンツやAPIのある本サイトと、「高度なツールサイト」に同じ制限が適用される。うっかり一方のサイトだけに合わせて設定すると、他方のサイトで悪影響が生じる場合があるので注意しよう。本Tech TIPSの解説では、これを「オフ」にすることを前提としている。
IPv4アドレスで制限を掛ける場合は、上記画面の「規則の追加」ブレードの[種類]を「IPv4」にしてから、CIDR表記でIPアドレス枠を「IPアドレスブロック」欄に記入する必要がある。
「HTTPヘッダーのフィルター設定」以下の設定項目は、Azure Front Doorなどのネットワークサービスと併用する際、リクエストヘッダなどIPアドレス以外で制限を掛けるのに利用する。ソース(クライアント)IPアドレスだけで制限するなら、空欄のままでよい。
リソーステンプレートでソースIPアドレスの制限を加えるには、「Microsoft.Web/sites/config」というリソースの「properties. scmIpSecurityRestrictions*」を設定する。
param location string = resourceGroup().location
param siteName string // App Serviceの名前
// 「高度なツールサイト」のソースIPアドレス制限
var scmIpSecurityRestrictionsDefaultAction = 'Deny' // デフォルトで拒否(許可するIPは明示)
var scmIpSecurityRestrictionsUseMain = false // メインサイトとIP制限設定を共用しない
var scmIpSecurityRestrictions = [
{
action: 'Allow' // 許可。拒否するなら「Deny」
tag: 'Default' // IPアドレスを指定するなら「Default」。サービスタグなら「ServiceTag」
ipAddress: '203.0.113.128/28' // 対象のIPアドレス。16個のIPアドレスの例
priority: 1000 // 小さいほど優先順位が高い=先に処理される
name: 'CorpHeadquarter' // この規則の名前
description: '本社 ISPその1' // 説明
}
{
action: 'Allow'
tag: 'Default'
ipAddress: '198.51.100.11/32' // 単一のIPアドレス
priority: 1100
name: 'CorpBranch1'
description: '支社1'
}
]
// リソース生成: App Serviceのサイト本体
resource webApp 'Microsoft.Web/sites@2022-09-01' = {
name: siteName
location: location
properties: { /* ……<省略>…… */ }
}
// リソース生成: App ServiceのWeb設定
resource webAppConfig 'Microsoft.Web/sites/config@2022-09-01' = {
parent: webApp
name: 'web' // 必ず「web」を指定
properties: {
// ……<省略>……
scmIpSecurityRestrictionsDefaultAction: scmIpSecurityRestrictionsDefaultAction
scmIpSecurityRestrictionsUseMain: scmIpSecurityRestrictionsUseMain
scmIpSecurityRestrictions: scmIpSecurityRestrictions
// ……<省略>……
}
}
ソースIPアドレス制限設定の実体は、「scmIpSecurityRestrictions」の配列に格納している各要素である。
高度なツールサイトの場合、デフォルトは「拒否」としつつ、リモートからアクセスできる必要がある拠点のIPアドレスのみ「許可」すればよいだろう。そのために「scmIpSecurityRestrictionsDefaultAction」を「Deny」としつつ、各IPアドレスの指定のところでは「action: 'Allow'」、すなわち許可としている。
このアクセス制限機能では、IPアドレス以外でも制限を掛けられる。そのため、IPアドレスで制限を掛けるには、それを明確にするために、「tag」を「Default」にする必要がある。そのとき「ipAddress」にはIPアドレスをCIDR表記で記載する(サブネットマスクを別のキーで指定する方法もある。詳細は「Microsoft.Web/sites/config」の「IpSecurityRestriction」を参照)。
IPアドレス以外の例としては、Azure Front Door(リバースプロキシ/CDN/WAF)からのアクセスを許可/拒否する場合、「tag」を「ServiceTag」としつつ、「ipAddress」に「AzureFrontDoor.Backend」と指定する必要がある。
Azure App Serviceには、本Tech TIPSで説明したソースIPアドレス制限の他にも、受信/送信トラフィックを防御するための機能が用意されている。詳細は以下の関連リンクにあるMicrosoft Learnの各ページを参照していただきたい。
■関連リンク
Copyright© Digital Advantage Corp. All Rights Reserved.