ストレージへのアクセスを特定の Http Header の有無で制限する(Azure Front Door 連携)
はじめに
お世話になっております。PaaS Dev サポート担当の李です。
Azure ストレージアカウントではネットワーク設定機能を用いてファイアウォールで特定のIPアドレスやVNETでアクセスを制限することができ、若しくはパブリックアクセスを全て無効にしてプライベート エンドポイントでのアクセス制限を構成することも可能です。
・Azure Storage ファイアウォールおよび仮想ネットワークを構成する
・Azure Storage のプライベート エンドポイントを使用する
本記事では、これらのアクセス制御方法以外に、特定の Http Header を含めた(若しくは含めてない)リクエストを制限することでアクセス制御を行う方法について紹介いたします。但し現時点で Azure Storage 単体では 特定の Http Header をチェックする機能がないため、Azure Front Door を組み合わせる方法を紹介いたします。
Azure Front Door については、
・Azure Front Door とは
をご参照ください。
先ず Azure Front Door 側で、ストレージに送信されたリクエストの Http Header を確認し、アクセスを制限する任務を遂行するためにはクライアントからストレージアカウントに直接アクセスできず、必ず Azure Front Door を通すように構成する必要がございます。そのための構成を設定する手順を今からご案内いたします。
必要な構成は Azure Front Door のリソース作成とアクセス設定、ストレージアカウントのアクセス構成と Azure Front Door との連携となります。
ストレージアカウントへのアクセス方法を選択 - パブリック・プライベート
Azure Front Door リソースを作成する前にストレージアカウントへのアクセス方法を決める必要がございます。アクセス方法には大きく二つがあり、パブリックネットワーク経由とプライベートリンクでのアクセスがございます。これらのアクセス方法は、Azure Front Door の SKU プランを決める基準の一つになります。
Azure Front Door の SKU プランには二つがあり、スタンダードとプレミアムプランがございます。
それぞれサポートする機能の違いは以下のリンクをご覧ください
・Azure Front Door レベル間の機能の比較
各 SKU プランのコストに関しては、Azure Front Door では4つの課金要素があり
・基本料金
・Azure Front Door → Client の通信料
・Azure Front Door → Backend の通信料
・Request 数
により金額が計算されて課金されます。それぞれの詳細金額に関しては以下の価格ページをご参照ください。
・Azure Front Door の価格
パブリックアクセスをご利用頂く場合は Azure Front Door のスタンダード以上のどのプランを選んで頂いてもかまいませんが、プライベートアクセスのためのプライベートリンクの場合は現在プレミアムプランでのみサポートしており、必ずプレミアムプランで Azure Front Door リソースを作成する必要がございます。作成後でもスタンダードからプレミアムプランにスケールアップすることはできますが、プレミアムからスタンダードプランにスケールダウンする機能は提供しておりませんのでご注意ください。
それぞれのアクセス方法の設定手順と特徴は以下の内容をご確認ください。
Azure Front Door
リソースの作成(スタンダード・プレミアム共通)
以下の クイックスタートの手順をご参照頂き、Azure Front Door プロファイルを作成してください。
・クイックスタート: Azure Front Door プロファイルを作成する - Azure portal
レベル(SKU)項目に関しては上記案内した通り、アクセス方法に応じてお選びください。
エンドポイントの設定にある配信元の種類では、ストレージ(Azure BLOB)をお選び頂き、配信元のホスト名では対象のストレージアカウントをお選びください。プライベート エンドポイント設定はリソースの作成後でも可能です。
WAF ポリシーは今回 Http Header を制限するルールを設定する項目となり、新規作成で任意の名前を入力してください。
上記のように入力が終わったら、確認および作成ボタンを押下し、Azure Front Door リソースを作成してください。その他設定方法などのご不明点は、クイックスタートの手順をご参照ください。
詳細設定(一部プレミアムの追加手順あり)
Azure Front Door プロファイルリソースの作成に成功した後、フロントドア マネージャーブレードを押下すると Azure Front Door の FQDN などの情報確認や、右側のセキュリティポリシーから WAP ページに移動することができます。
初めてリソースを構築した時点では上記の通りポリシーモードが検出モードになっているため、アクセスを制限するために「防止モードに切り替える」必要がございます。
その後、画像の通りカスタム ルールブレードから新規のカスタム ルールを追加し、適宜条件を付けて追加ボタンを押下してください。設定値と一致・不一致する場合や、演算子などを用いてトラフィックを許可・拒否することができますので適宜ご活用ください。
例えば上記画像通りの設定の場合は、リクエストに
①testheaderというヘッダーがそもそも含まれていない、若しくは
②testheaderというヘッダーは含まれているが、値がtestではない場合、リクエストが拒否されます。
カスタム ルールを追加した後、必ず保存ボタンを押下してください。
※ 以下の手順はプレミアムプランでプライベート エンドポイント設定をする場合のみ必要となる手順となり、スタンダードプランでパブリックアクセスをする場合は以下の手順を省略してください。
リソース作成の段階で PEP の設定をしてない場合、上記の画像の通り Azure Front Door プロファイルの配信元グループブレード→配信元グループを選択して頂き、ホスト名を選択すると
プライベート エンドポイント設定を有効にすることができます。
これで Azure Front Door 側の設定は完了となります。
Azure ストレージアカウント
プライベートアクセス(プレミアムプラン必須。お勧め)
Azure Front Door からストレージのプライベート エンドポイント経由で通信する構成となります。
ストレージ – ネットワーク – ファイアウォールと仮想ネットワークタブでパブリックアクセスを無効にします。
前章の Azure Front Door 側の設定が完了できるまで暫くお待ち頂きますと、ストレージアカウントのプライベート エンドポイント接続タブに新しいプライベート エンドポイントが追加され、チェックボックスにチェックを入れて承認すると全ての手順は完了となります。
設定が反映されるまで数分以上時間が掛かる場合があり、しばらくお待ちください。詳細の手順は以下の記事をご参照ください。
・
Azure Front Door Premium で Private Link を使用して配信元を保護する | Microsoft Learn
これでプライベートアクセスの設定は完了です。プライベートリンクでのアクセスする場合セキュアなプライベートアクセスが可能ですが、必ず Azure Front Door のプレミアム SKU をご利用頂く必要があるため、コストの面をご検討頂く必要がございます。
パブリックアクセス(スタンダードプラン以上)
ストレージアカウントのファイアウォール (FW) で Azure Front Door からのアクセスのみを許可する形で構成することで、ストレージで Azure Front Door からの通信のみを受け入れるように構成することができます。但し、いくつかの注意事項があり、必ず全ての内容をご確認頂き、使用をご検討ください。
① ストレージアカウントの FW で Azure Front Door を許可するためには、以下のサービスタグ リストにある Azure Front Door の全ての IP を FW に登録する必要があり、
それに加えて毎週の更新により、非定期的に新しい IP アドレスが追加された場合その IP を追加する必要が生じます。
・Download Azure IP Ranges and Service Tags – Public Cloud from Official Microsoft Download Center
※ REST API では次の API を実施することで同等の情報を取得することが可能です。
・Service Tags - List - REST API (Azure Virtual Networks) | Microsoft Learn
そのため、外部サイトとなりますがアプローチとして以下のページの様に
Service Tag の REST API を用いて Bash や Azure Functions など定期実行可能なプラットフォームにて IP アドレスの変更を確認し、
ストレージアカウントの FW の構成更新を行うよう、実装を行う必要がございます。
・Using the Azure IP Service Tag API - gordon.byers.me
※ 新しい IP アドレスはまずこの JSON 上に表示されます。この表示は、実際に Azure プラットフォームで利用する少なくとも1週間以上前には追加されますので、毎週一度のチェックが必要となります。
———————— ダウンロードページの Details から引用 ——————————–
This file is updated weekly. New ranges appearing in the file will not be used in Azure for at least one week. Please download the new json file every week and perform the necessary changes at your site to correctly identify services running in Azure. These service tags can also be used to simplify the Network Security Group rules for your Azure deployments though some service tags might not be available in all clouds and regions.
———————— 引用 ここまで ——————————–
② パブリックアクセスは Azure Front Door の SKU がスタンダードプランの場合でもご利用できると申し上げましたが、 スタンダードプランの場合マルチテナント構成になっているため、他のユーザの Front Door 経由でもアクセスができてしまう可能性が存在します。 もちろん本記事のシナリオの場合は Front Door からバックエンドにリクエストを送信する際、皆様の Front Door にしか付与されないヘッダがあるので、 それを使えば他のユーザの Front Door からのアクセスはほぼブロックできるかと存じますが、皆様の固有のヘッダの中身を知られてしまうと、 第三者によるアクセスができてしまうリスクは存在します。そのため、ストレージアカウント側の認証機能である、SASやAD認証などの仕組みを 併用いただき、よりセキュアな構成を維持いただくことをお勧めいたします。
上記のような制約に基づき、セキュリティの面でも設定の手間の面でもプライベートリンクでのプライベートアクセスを推奨しておりますが、コストの面など考慮するポイントもあり、皆様のご要件に応じて適切なアクセス方法をお選び頂けますと幸いでございます。
上記のいずれの手順が全て完了した後、Azure Front Door の FQDN / {BlobPath}でアクセスして確認すると、それぞれ Header の有無によってBLOBコンテンツが表示・またはブロックされることが確認できました。
※ Azure Front Door の FQDN はフロントドア マネージャーブレードからご確認できます。)
↑Header ありの場合、BLOB が表示
↑Header 無しの場合、リクエストがブロック
既存のスタンダードプランの Azure Front Door をプレミアムにスケールアップ
Front Door プロファイルの構成ブレードで既存の Azure Front Door プロファイルのSKUをスタンダードからプレミアムプランにスケールアップすることができます。現時点でプレミアムからスタンダードプランにスケールダウンする機能は提供しておりませんのでご注意ください。
以上、Azure Front Door を用いて特定の Http Header を含めた(若しくは含めてない)リクエストを制限することでアクセス制御を行う方法についてパブリック・プライベートアクセス両方の観点で紹介いたしました。
2023 年 02 月 17 日時点の内容となります。
本記事の内容は予告なく変更される場合がございますので予めご了承ください。