Azure Front Door + WAF の構成要素、ログまわり まとめ

# はじめに
こんにちは　Azure Front Door GAしましたね

プレビュー期間中、ほとんど触らず来たので、一通り触ってみました。
また、パブリックプレビュー中のWAF機能についても確認しました。
備忘としてDump.

間違ってたり、古かったりしたら教えてください。

[Azure Front Door Service is now generally available](https://azure.microsoft.com/ja-jp/blog/azure-front-door-service-is-now-generally-available/)
[Web application firewall at Azure Front Door service](https://azure.microsoft.com/ja-jp/blog/web-application-firewall-at-azure-front-door-service/)

# ざっくり
グローバル+L7LB+CDN+WAF(preview)なサービス

# 価格(2019/4/18時点、最新は[こちら](https://azure.microsoft.com/ja-jp/pricing/details/frontdoor/))
FrontDoorはGA済みだけど、課金は2019/05/01から開始らしい。試すなら今！

* ルーティング規則

||料金(時間)|(月)|
|---|---|---|
|最初の5ルーティング|¥3.36/時間|¥2419.2/月|
|追加のルーティング|¥1.344/時間|¥967.68/月|

* 送信(アウトバウンド)

||北米、ヨーロッパ、中東、アフリカ|アジア太平洋(日本)|南米|オーストラリア|インド|
|------|---|---|---|---|---|
|最初の10TB|¥19.040/GB|¥28/GB|¥56/GB|¥31.360/GB|¥38.080/GB|
|次の40TB|¥16.80/GB|¥24.64/GB|¥47.712/GB|¥26.88/GB|¥32.48/GB|
|次の100TB|¥14.56/GB|¥21.28/GB|¥40.32/GB|¥22.400/GB|¥27.440/GB|

* 受信(インバウンド)<br>グローバル　¥1.12/GB

# サービスの構成要素
リソースタイプ：`Microsoft.Network/Frontdoors`

## フロントエンドホスト
入口を定義する子リソース
リソースタイプ：`Microsoft.Network/Frontdoors/FrontendEndpoints`
ホスト名と証明書、セッションアフィニティを設定します。

### 既定のホスト
リソース作成時に必ず作成されます。
カスタムドメインを使用する際に向ける先でもあります。
ホスト名：`xxx.azurefd.net`
証明書は、`*.azurefd.net`のワイルドカード証明書が使用されます。

### カスタムドメインのホスト
* ホストの追加
ドメインを所持している検証が必要です。
DNSにCNAMEで`<追加したいサブドメイン>`⇒`<xxx>.azurefd.net`を登録
または、CNAMEで`afdverify.<追加したいサブドメイン>`⇒`afdverify.<xxx>.azurefd.net`を登録

* 証明書(自前の証明書を使う場合)
KeyVaultで管理する。
FrontDoorのサービスプリンシパルをAADに登録して、アクセス権を付与する。
[一覧にあるCA](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-troubleshoot-allowed-ca)以外の証明書は拒否される模様
* 証明書(フロントドア管理の証明書を使う場合)
Azure CDNと同様に、Azureが無料で発行してくれます

* セッションアフィニティ
ホスト単位で設定でき、Cookieベース
    
## バックエンドプール
出口を定義する子リソース
リソースタイプ：`Microsoft.Network/Frontdoors/BackendPools`
ホスト名、ポート、負荷分散ルール、正常性プローブを設定します。

### バックエンド
リクエストの転送先を1つ以上設定する。

* 設定項目は以下の通り
  * http/httpsのポートを指定できる
  * バックエンドホスト名（またはIP）
  * バックエンドホストヘッダー(ヘッダー値を上書きできる)
  * 優先度（アクティブ/スタンバイ）、重み（分散の加重）

### 正常性プローブ
バックエンドのヘルスチェック方法を設定する子リソース
リソースタイプ：`Microsoft.Network/Frontdoors/HealthProbeSettings`

バックエンドプールに対して紐づけるリソースで、
設定は、バックエンドプールに対して一律で適用される。

200 OKのみを正常応答と扱う仕様

* 設定項目は以下の通り
  * 送信先のパス
  * プロトコル(HTTP/HTTPS)
  * 間隔(秒)(確認頻度)

### 負荷分散
バックエンドの負荷分散ルールを設定する子リソース
リソースタイプ：`Microsoft.Network/Frontdoors/LoadBalancingSettings`

バックエンドプールに対して紐づけるリソースで、
設定は、バックエンドプールに対して一律で適用される。

サンプルサイズ、成功回数、待機時間感度を調節できる
詳しくは [負荷分散の設定](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-backend-pool#load-balancing-settings) [最低遅延に基づくトラフィック ルーティング](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-routing-methods#%E6%9C%80%E4%BD%8E%E9%81%85%E5%BB%B6%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF-%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0lowest-latencies-based-traffic-routing) を参照
    
## ルーティング規則
入口(フロントエンドホスト)と出口(バックエンドプール)を紐づけ、リクエストを振り分けるための子リソース
リソースタイプ：`Microsoft.Network/Frontdoors/RoutingRules`

FrontDoor 1リソースに対して、複数作成できる(課金単位でもある)。
設定した入口、パス、プロトコルでルーティング規則が決定され、設定した出口へ転送される。

### ルーティング規則の選択条件部分
* 設定項目は以下の通り
  * フロントエンドホスト：(複数選択)
  * プロトコル(acceptedProtocols)
      * 選択：HTTP、HTTPS、HTTPとHTTPS
  * URLパスパターン

### 適用するルーティングの設定部分

大きくは2個に分けられる。
ルートの種類：Forward/Redirect

#### Redirectの場合
* 設定項目は以下の通り
  * リダイレクトの種類(ステータスコード)：301/302/307/308
  * プロトコル：http or https or リクエストと同じ
      * ⇒フロントのプロトコルをHTTP,リダイレクト先プロトコルをHTTPSにすれば、HTTPSリダイレクタとして機能する
  * 宛先ホスト,パス,クエリ：保持 or 置換(項目全体を一括置換のみ対応)
  * 宛先フラグメント：追加のみ

#### Forwardの場合
* 設定項目は以下の通り
  * バックエンドプール
  * プロトコル：http or https or リクエストと同じ
      * HTTPを選んだ場合、SSLオフローダー的な動作となるが、パブリックなネットワークを経由するため、あまり使うことはない（か？）
  * URL rewrite
      バックエンドに転送する際のパスの書き換えのみ。
      ProxyPassReverseのような、応答の(リダイレクトとかの)ヘッダ書き換え(location)はなし

#### キャッシング設定
* 設定項目は以下の通り
  * クエリ文字：クエリ文字列を無視/一意のURLをすべてキャッシュ
  * 動的圧縮：gzip/brotli
      * [特定のMIMEのみ圧縮される](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-caching#file-compression) 
      * 1 KB 以上 8 MB 以下のみ圧縮される

##### キャッシュのTTL
[レスポンスのヘッダーを元に判定](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-caching#cache-expiration)する

* Cache-Control: s-maxage=
* Cache-Control: maxage=
* Expires:

##### キャッシュのパージ
ポータル/PowerShell/RESTAPIで実行する。
ホストやルート単位ではなくFrontDoor一括
パスベースで消去。(ワイルドカード可、大文字と小文字は区別する)

# [Geoフィルタリング](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-geo-filtering)
固有の機能ではなく、WAFのカスタムルールとして定義
IPからの国判別ってどの程度の厳密さなんでしょう…？

# Azure web application firewall for Azure Front Door
リソースタイプ：`Microsoft.Network/frontdoorwebapplicationfirewallpolicies`
frontdoorsリソースの子ではなくて、独立したリソース
OWASP CRSベース?のAzureマネージドなルールセットと、
ユーザー定義のカスタムルールを組み合わせて適用できる。

PublicPreview中で、GA時の料金は不明

ポータルからの作成時、FrontDoorとの関連がわかりにくい…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260166/cd4be9a9-17b9-f8fd-0430-c8f6d039d2aa.png" width=50%>
## 構成要素
### フロントエンドホストの関連付け
FrontDoorリソース単位ではなく、フロントエンドホスト単位でポリシーを指定できる。
また、1つのポリシーを複数のFrontDoorリソースに対しても適用できる。

### ポリシー動作の設定項目
* モード：検出 or 防止
* リダイレクト：ルールのアクションがリダイレクトの際に飛ばす先のURL
* ステータスコード、ボディ：ルールのアクションがブロックの際に返すHttpStatus＆Body

### マネージドルール
Azure側が管理するルールセット
Azure側が新しい脅威に対応し、ルールセットを追加してくれる（らしい）

ルールセットのバージョンを指定する。
現状ある、DefaultRuleSet preview-0.1はOWASP ModSecurity CRS 3.1.0ベース(っぽい)
マネージドルールセットを使用しないこともできる。

ルール毎に無効化することができて、さらにルール毎にアクションの変更ができる。

#### 指定できるなアクション
* 許可(+ログ記録))
* ブロック(+ログ記録))
* ログ
* リダイレクト(+ログ記録)

### カスタムルール
IP制限、Geoフィルタリング、そのた任意のルールが定義できます。
現時点では、ポータルから設定できません。

* 優先度：カスタムルール内で一意(?)
* 条件：いろいろ…
* アクション：許可 or ブロック or ログ or リダイレクト
詳しくは[こちら](https://docs.microsoft.com/ja-jp/azure/frontdoor/waf-front-door-custom-rules)

## 診断ログの出方
ポリシー側リソースに診断ログカテゴリなく、FrontDoor側リソースの診断設定によって、出力される。

### FrontdoorWebApplicationFirewallLog

<details><div>

|field|value|
|---|---|
|clientIP_s|<クライアントIP>|
|socketIP_s|<クライアントIP>|
|ruleName_s|DefaultRuleSet-preview-0.1-SQLI-942180|
|policy_s|wafpolicy1|
|action_s|Block|
|host_s|<カスタムホスト名>|
|requestUri_s|https://<カスタムホスト名>:443/?a=%27or1%3D1|
|TenantId|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX|
|SourceSystem|Azure|
|TimeGenerated [UTC]|2019-04-18T16:13:02.899Z|
|Tenant_s|Edge-Prod-TYO01r3|
|ResourceId|/SUBSCRIPTIONS/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/RESOURCEGROUPS/XXXXX/PROVIDERS/MICROSOFT.NETWORK/FRONTDOORS/XXXXX|
|Category|FrontdoorWebApplicationFirewallLog|
|OperationName|Microsoft.Network/FrontDoor/WebApplicationFirewallLog/Write|
|SubscriptionId|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX|
|ResourceGroup|XXXXX|
|ResourceProvider|MICROSOFT.NETWORK|
|Resource|XXXXX|
|ResourceType|FRONTDOORS|
|Type|AzureDiagnostics|
|_ResourceId|/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourcegroups/xxxxx/providers/microsoft.network/frontdoors/xxxxx|
</div></details>


### FrontdoorAccessLog

<details><div>

|field|value|
|---|---|
|trackingReference_s|0DqK4XAAAAACer7yRtp8lTIA3bqg0GcNeVFlPMDFFREdFMDQwOAA4ZTE1MmFjMy01N2JiLTQ4OTQtYWY4Mi04MWU5MTA3YWM3MzM=|
|httpMethod_s|GET|
|httpVersion_s|1.1|
|requestUri_s|https://<カスタムホスト名>:443/?a=%27or1%3D1|
|requestBytes_s|76|
|responseBytes_s|1056|
|userAgent_s|Fiddler|
|clientIp_s|<クライアントIP>|
|timeTaken_s|0.004|
|securityProtocol_s|TLS 1.2|
|routingRuleName_s|xxxxx.azurefd.net_routingrule1_0ea61f30-5ffe-49ae-8fbc-93ebb2f707ac|
|httpStatusCode_s|403|
|httpStatusDetails_s|403|
|TenantId|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX|
|SourceSystem|Azure|
|TimeGenerated [UTC]|2019-04-18T16:13:02.9Z|
|Tenant_s|Edge-Prod-TYO01r3|
|ResourceId|/SUBSCRIPTIONS/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/RESOURCEGROUPS/XXXXX/PROVIDERS/MICROSOFT.NETWORK/FRONTDOORS/XXXXX|
|Category|FrontdoorAccessLog|
|OperationName|Microsoft.Network/FrontDoor/AccessLog/Write|
|SubscriptionId|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX|
|ResourceGroup|XXXXX|
|ResourceProvider|MICROSOFT.NETWORK|
|Resource|XXXXX|
|ResourceType|FRONTDOORS|
|Type|AzureDiagnostics|
|_ResourceId|/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourcegroups/xxxxx/providers/microsoft.network/frontdoors/xxxxx|
</div></details>

trackingReference_sはアクセスログだけじゃなくWAFログにも出力してほしい。。
アクセスが多いとき、アクセスログとのJoinが難しくなる。(AppGWも同じだけど)

Application GatewayのWAFと違いとして、
Blockアクションのルールに引っかかった場合、その場で判定を打ち切るようで、最初のBlockのみ出力される。
Logアクションのルールは優先度がBlockより前だと出力される。
マネージドルール内では、Blockの場合、ルール1件分のみ出力される(…？)

# その他、気になるFeedbackとか
* [Docs バックエンドへのアクセスを Azure Front Door Service のみにロックダウンするにはどうしたらよいですか?](https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-faq#how-do-i-lock-down-the-access-to-my-backend-to-only-azure-front-door-service)
    * IPで制限する…
        * IPv4 - 147.243.0.0/16
        * IPv6 - 2a01:111:2050::/44

* WebSocketは対応していない
    
    Feedback Forums [Support WebSocket connections on Azure Front Door](https://feedback.azure.com/forums/217313-networking/suggestions/37346371-support-websocket-connections-on-azure-front-door)

* レスポンスヘッダーにキャッシュに関する値がない場合、キャッシュ出来ない件について、計画中になっている
    
    Feedback Forums [Confirguration of caching rules in Front Door](https://feedback.azure.com/forums/217313-networking/suggestions/36430705-confirguration-of-caching-rules-in-front-door)

* HTTPSリダイレクト　もう対応済み まだドキュメント化されていない（ぽい）

    Feedback Forums [Allow an HTTP to HTTPS redirect on Azure Front Door](https://feedback.azure.com/forums/217313-networking/suggestions/35784130-allow-an-http-to-https-redirect-on-azure-front-doo)

* VNET統合（却下） AFDはパブリックなサービスなので諦めろ的な

    Feedback Forums [Vnet Integration Front Door](https://feedback.azure.com/forums/217313-networking/suggestions/36232873-vnet-integration-front-door)

* ZoneApexドメイン
    
    Feedback Forums [Add Custom Apex (Naked) Domains as front end hosts for Azure Front Door Service](https://feedback.azure.com/forums/217313-networking/suggestions/35530549-add-custom-apex-naked-domains-as-front-end-hosts)
    しばやん雑記 [Azure DNS の Alias record set を CLI で管理する](https://blog.shibayan.jp/entry/20190416/1555398212)
    サービスとしては対応済み…？

* SASキーを使ったストレージアクセスが出来ない…？(よくわかってない)
    
    [Azure Front Door service is incompatible with blob storage if using Azure storage's shared key authentication method](https://feedback.azure.com/forums/217313-networking/suggestions/36616615-azure-front-door-service-is-incompatible-with-blob)

# 参考
* GitHub [Azure/azure-rest-api-specs](https://github.com/Azure/azure-rest-api-specs/tree/master/specification/frontdoor/resource-manager/Microsoft.Network/stable/2019-04-01)
    * マネージドruleの一覧は[このへん](https://github.com/Azure/azure-rest-api-specs/blob/master/specification/frontdoor/resource-manager/Microsoft.Network/preview/2019-03-01-preview/webapplicationfirewall.json#L221)
* Docs [Azure Front Door Service REST API](https://docs.microsoft.com/en-us/rest/api/frontdoor/)
* 世界のやまさ [新サービス Azure Front Door Service がリリース。グローバルL7LB, CDN, WAFの全部入り。早速使ってみた。](https://blog.nnasaki.com/entry/2018/09/26/161128)
* 技術的な何か。[Azure Front Door でカスタムホストを設定しSSLの設定をしつつGeoフィルタリングで他国からのアクセスを制限する。](http://level69.net/archives/26245)