App Service on Linux で .htaccess を使ってアクセス制御する

備忘&ちょっとでもインターネット上に App Service on Linux の情報を流しておきたいので大した内容ではないですが書いておきます(

Front Door のバックエンドに App Service を置く場合、Front Door の IP アドレスはユーザーごとに違うわけではないため、App Service の機能としてある、IP アドレスによるアクセス制御では、アクセス元を制限することができません。
IPアドレスのレンジは公開されているため、(特定ではなく)Front Door サービスからのアクセスのみ許可、ということは可能です。以下ドキュメントより。

使用するバックエンドが、Azure Front Door のバックエンド IP アドレス空間と Azure のインフラストラクチャ サービスからのトラフィックのみを受け入れるように IP ACL 処理を構成します。 Microsoft は Azure IP 範囲およびサービス タグとの統合に向けて作業を進めていますが、現在のところ、IP 範囲は次のように参照することができます。
Front Door のIPv4 バックエンド IP 空間: 147.243.0.0/16
Front Door のIPv6 バックエンド IP 空間: 2a01:111:2050::/44
仮想化されたホスト IP アドレスを通した Azure の基本的なインフラストラクチャ サービス: 168.63.129.16 および 169.254.169.254

docs.microsoft.com


これがどういうときに問題かというと、Front Door の WAF を使って、バックエンドに App Service を置いた場合、悪意のある第三者が別の Front Door を置くことで WAF をスルー出来る可能性があります。もちろん、App Service 側のホスト名がわからないとたどり着けないのですが、可能性はゼロではありません。

こういうこと↓
f:id:mitsuki0820:20190808012943p:plain

で、どうするかというと、上のドキュメントにもある通り、X-Forwarded-Host に Front Door のホスト名がのってくるため、それをチェックする必要があります。
では、App Service on Linux ではどうするかですが、アプリ側で見なくても普通に .htaccess を置けばアクセス制御ができました。
こんな感じ。

SetEnvIf X-Forwarded-Host "www\.contoso\.com" allowed_fd
Order Deny,Allow
Deny from all
Allow from env=allowed_fd

ちょっとここで不安だったのが .htaccess でヘッダーのアクセス元チェック(要はApache のモジュール)を使うのって App Service の世界で一般的なんだろうか、ということでした。なんとなくつぶやいていたら、なんと中の方から返信いただけました。

ということで安心して使っていきます。おそらく他のモジュールも特に問題なく使えるでしょう。
ドキュメントをよく読むと、Laravel のデプロイのところでも .htaccess が書かれていました。
docs.microsoft.com

最後に phpinfo から抜いてきた Loaded Modules の一覧です。(今回は PHP アプリの話しでした)
mod_rewrite、mod_auth* も使えます。

core
mod_so
mod_watchdog
http_core
mod_log_config
mod_logio
mod_version
mod_unixd
mod_access_compat
mod_alias
mod_auth_basic
mod_authn_core
mod_authn_file
mod_authz_core
mod_authz_host
mod_authz_user
mod_autoindex
mod_deflate
mod_dir
mod_env
mod_expires
mod_filter
mod_include
mod_mime
prefork
mod_negotiation
mod_php7
mod_reqtimeout
mod_rewrite
mod_setenvif
mod_status

何でもかんでも .htaccess にするとあとで地獄を見ることになりますが、どうしてもという最後の隙間を埋める部分で使っていけそうです。