サクッと検証用Azure Firewall Premiumを構築

# この記事について
- Azure Virtual Desktop(AVD)のインターネットブレークアウトで使える
- まずはどんなものか、サクッと検証環境を作るための情報

# なぜAVDで求められているのか
Azure上の仮想デスクトップから直接インターネットにアクセスさせる、いわゆるインターネットブレイクアウトを構成する際、セキュリティの観点からアクセスを制御したりログを取りたいことがよくあります。
Azure Firewall Premiumは、単純なIPアドレス、FQDN、ポートのようなフィルターだけではなく、HTTPS暗号化された通信も対象とし、怪しいふるまいを検知したり、WebアクセスをURL単位/カテゴリーでフィルターすることが可能になり、より細かくユーザーの活動や意図しないアクセスを記録、制限することが可能になります。

# 環境構築
MicrosoftのdocsにあるARMテンプレートを使えば10分程度で検証環境ができます。東日本リージョンへのデプロイも問題ありません。
https://docs.microsoft.com/ja-jp/azure/firewall/premium-deploy

以下、このdocsの補足です。
### ログ分析 (Log Analytics) ワークスペース
Security Centerがデフォルトで作っているワークスペースを使っても問題ありません。なければ、新規にワークスペースを作って設定します。

### インターナルWebサーバー
IDPSをテストするためインターナルWebサーバーを構築するように記載がありますが、不要です。
代わりに、既存のアプリケーションルールにHTTP(ポート:80)を加えます。
![Policy-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/d33f8cac-fc0c-aaa5-7da2-28c9506bddb5.png)

この環境をもとに

```shell
curl -A "BlackSun" http://www.azure.com/
```
や

```shell
curl --ssl-no-revoke -A "BlackSun" https://www.azure.com/
```
を実行します。

# ログの確認
ログは、Azure Firewall Premiumのブレードを開いて、ログを選び、クエリを発行することで確認できます。
IDPSは**`Network rule log data`**、URLフィルタリングやWebカテゴリは**`Application rule log data`**を選択し、そのクエリを実行することで確認できます。
![Log-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/d80fc08c-46fe-1ae9-2837-7c7aa6bb1542.png)
![Log-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/74db32fe-5d40-5f2c-2c5b-a76f1e46584d.png)
**`Network rule log data`**で生成されるクエリでは、2021年7月20日現在、IDPSのログが表示されません。下記のフィルタを記載するか、`OperationName`のフィルタを削除することで表示されるようになります。

```
OperationName == "AzureFirewallIDSLog"
```

クエリは編集可能ですので、見たい範囲を絞ったり、形式を変えたりすることもできます。
また、クエリ結果をCSVにエクスポートしてExcelで見たり、監査のために一定期間保持するようなことも可能です。
![Log-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/a7e6a73c-f48c-ebdf-ff59-e509178eb7f5.png)
さらに[Power BIで見たり](https://docs.microsoft.com/ja-jp/azure/firewall/firewall-diagnostics#view-and-analyze-the-activity-log)、[Azure Monitorのブック](https://docs.microsoft.com/ja-jp/azure/firewall/firewall-workbook)もあります。

# ユーザーエクスペリエンス
アクセスがブロックされると、Microsoft Edgeの場合はこのように表示されます。HTTPSとHTTPで異なっていることがわかります。
![User-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/285a6244-a783-64ba-8f9a-f4b702adb887.png)

シグネチャでDeny(拒否)を設定したルールに合致した場合はパケットが落とされるので、ユーザー側はタイムアウトとして経験する形になると思います。

Azure Firewall Premiumによって生成される証明書は、下記のようになります。
EdgeのCertificate Informationには3つしか写っていませんが、この上にRoot CA(Self Signed Root CA)があり、証明書ストアにはこれが信頼している証明機関として登録されています。
![User-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/5731a037-e0d4-9e3e-281c-c477f16c566a.png)

# AVD視点での考察
## Premiumだからのポイント
TLS Inspectionを使うことで、Webカテゴリによるアプリケーションルールで、`https://www.google.com`がSearch Engineとしてカテゴライズされ、`https://www.google.com/news`がNewsとしてカテゴライズされるようになります。
![category-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/feb87adb-e1b6-55b4-603c-2151841383e9.png)
![category-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/43ffd594-b6c0-4b7f-db14-ab1561801ef4.png)
Googleのニュースサイトを表示するには、`www.google.com/news`(News)から`news.google.com`(Search Engine)にリダイレクトされるので、両方のWebカテゴリを許可する必要があります。

## クライアントOSを使うためのルール設定
AVDで必要となるルールは[こちら](https://docs.microsoft.com/ja-jp/azure/firewall/protect-windows-virtual-desktop#host-pool-outbound-access-to-windows-virtual-desktop)に解説があります。
しかし、ここで使ったARMテンプレートからのデプロイで、アプリケーションルールにプライオリティ100のルールがセットされますが、KMSを通すためのルールはネットワークルールで追加する必要があるものの、ネットワークルールはアプリケーションルールより先に評価するため若い番号のプライオリティを設定しなければいけないにもかかわらず、プライオリティ100が最低という仕様のため追加できません。このため、既存のルールのプライオリティを1ケタ上げるなど変更する必要があります。なお、これはこのARMテンプレートを使ったからであって、製品仕様的な問題ではありません。
![Rule-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/03421e27-0df3-4258-e4c9-f8f6a70a9c79.png)

# 注意
2021年7月20日現在、既知の課題が[こちら](https://docs.microsoft.com/ja-jp/azure/firewall/premium-features#known-issues)に記載されています。特に、IDPSでログに記録されるアドレスが、特定条件下で正しくないことには注意が必要です。
その他、ログが記録されるまでに20分以上かかる場合があるようです。

# Tips
## 環境の再構築
検証環境を削除し同じリソースグループ名で再構築しようとすると、最初に作成した環境のKey Valultが論理削除されてAzure上に残っているため、同じ名前のKey Vaultがあるということでデプロイに失敗します。このため、同じ環境を再デプロイする場合は、以前のKey Vaultを完全削除する必要があります。

- 削除したKey Vaultのリストアップ

```shell
az keyvault list-deleted
```

- 完全削除(パージ)

```shell
az keyvault purge -n fw-quick-<name>
```