しばやん雑記

Azure Serverless とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure App Service へのカスタムドメイン追加方法が変更されているので注意

何気なく Azure Portal から App Service を開いてみると、カスタムドメインのブレードに見慣れぬ Custom Domain Verification ID という項目が増えていました。

一昨日ぐらいまでは出ていなかったので、本当に最近追加されたようです。タイミング的に Build 2020 向けという感じがありますが、新機能という雰囲気はありません。

f:id:shiba-yan:20200515162437p:plain

Azure Portal からカスタムドメインを追加する際には、新しいドメイン検証 ID を使うようなメッセージが出てくるので、それに従って作業すれば追加できます。

ドキュメントも先月にひっそりと更新されていました。既にチュートリアルはドメイン検証 ID を使う方法に書き直されているので、新規の人は迷うことはないでしょう。

ちなみにこれまでとの差分は、以下のコミットを見ると分かりやすいです。結構罠っぽいです。

まとめると以下のようになります。App Service Team Blog などで詳細が出てくるのを期待していますが、これまでの傾向からすると望み薄です。

  • これまで
    • A レコードを使う場合のみ同名の TXT レコードを作成する
    • 値は App Service のデフォルトホスト名を追加する
  • これから
    • A / CNAME レコードともに asuid から始める TXT レコードを作成する
    • 値は(恐らく)サブスクリプション単位で発行されるドメイン検証 ID を追加する

とりあえず実際に追加して試しておきました。とはいえ大した内容ではないのでサクッと終わります。

まずは Azure Portal から始めるのが分かりやすいので、シンプルに追加したいカスタムドメインを入力して検証します。するとエラーになって必要なレコードの情報が表示されます。

f:id:shiba-yan:20200515162451p:plain

今回は CNAME を使っていたので、CNAME と検証用の TXT レコードの作成を指示されます。

ドメイン検証 ID も載っているので適当にコピーして、それぞれの DNS レコードを作成します。Azure DNS の場合は以下のような形で TXT レコードを作成します。

f:id:shiba-yan:20200515162459p:plain

Azure DNS を使っている場合は確認が早いので、レコード作成後にもう一度カスタムドメインの追加を行うと、すんなりと検証が通るようになります。これで追加が完了です。

f:id:shiba-yan:20200515162634p:plain

ドキュメント化されていた記憶はないですが、昔から 1 度所有を確認したドメインに対するサブドメインの追加は、検証用のレコード無しで行えるようになっています。今回も asuid を大量に作る必要はないです。

そして既に追加済みのドメインに対して変更する必要はないので、そのままの設定のまま使い続けることが出来ます。ただし新しくドメインを追加する際に、Terraform などの IaC や Azure CLI などを使っていると検証エラーになって悩む可能性が高そうです。

f:id:shiba-yan:20200515164627j:plain:w550

告知無く変えるのはいい加減やめてほしいと思いますが、何か事情があるのかもしれません。とはいえ動いていた方法が急に動かなくなるのは困るので、こういう変更はマジでやめてほしい。

今回のドメイン検証 ID はサブスクリプション単位になっているようなので、App Service の移行時や IaC を使って作り直すようなシチュエーションで役に立つ気がしました。

とても重要な追記 (2020/05/21)

Build 2020 の Ask the App Service Team のセッションで今回の変更を何故行ったか聞いたところ、セキュリティ的な観点でドメイン検証 ID を使うように変更したと回答がありました。

具体的には以下のようなシチュエーションを防ぐためらしいです。

  1. これまでは App Service のホスト名を TXT レコードにセットしていた
  2. App Service は既存のアプリが削除された後に、同じ名前で再度作成することが出来る
  3. ドメインの TXT レコードが放置されている場合、第三者がドメインを乗っ取ることが出来る

App Service は同じ Scale unit に当たった場合は Inbound IP Address も変わらないですし、CNAME を使っていた場合は簡単にドメインの乗っ取りが可能になってしまいます。

それをサブスクリプション単位で変わるドメイン検証 ID を使うことで、第三者がカスタムドメインを設定することを回避できるということのようです。それ以外にも攻撃を避けるためには、使い終わったドメインのレコードはちゃんと削除しておきましょう。