GitHubドメイン認証がうまくいかない
会社でGitHubを利用するときは組織のドメイン認証を行い、トップ画面に"Verified"マークを表示させることが多いと思います。
GitHubのドメイン認証を行うときは指定のTXTレコードを追加しますが、CloudFrontを使っているときには注意が必要です。
たとえばwww.example.com
のドメイン認証を行うとします。このサイトはCloudFrontで配信しており、CloudFrontのドメイン(d***.cloudfront.net
)がCNAMEで指定されているとします。
このドメインを認証する場合、GitHubのドキュメントにあるように_github-challenge-***-org.www.example.com
のTXTレコードを作成します。
編集したゾーンをデプロイすると、手元の環境で_github-challenge-***-org.www.example.com
のTXTレコードが返ってくるようになりました。これで問題なく完了と思っていたのですが、このドメインの認証は失敗してしまいました。
CloudFrontドメインの仕様
CloudFrontディストリビューションを作成すると、自動的にd***.cloudfront.net
ドメインが設定されます。このドメインにはA、AAAA、SOA、NSレコードが設定(このうちAAAAレコードは無効化可能)されています。このため、www.example.com
のCNAMEにd***.cloudfront.net
を指定すると、www.example.com
が暗黙的なRoute53ゾーンに委任されます。このゾーンは編集できないCloudFront専用のゾーンです。
> doggo d***.cloudfront.net SOA NAME TYPE CLASS TTL ADDRESS NAMESERVER d***.cloudfront.net. SOA IN 60s ns-***.awsdns-***.net. [fe80::f0fe:***]:53 awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 > doggo d***.cloudfront.net NS NAME TYPE CLASS TTL ADDRESS NAMESERVER d***.cloudfront.net. NS IN 172800s ns-***.awsdns-***.org. [fe80::f0fe:***]:53 d***.cloudfront.net. NS IN 172800s ns-***.awsdns-***.co.uk. [fe80::f0fe:***]:53 d***.cloudfront.net. NS IN 172800s ns-***.awsdns-***.com. [fe80::f0fe:***]:53 d***.cloudfront.net. NS IN 172800s ns-***.awsdns-***.net. [fe80::f0fe:***]:53
このCNAMEにNSが設定される実装はあまり一般的ではなく、カケハシで使っているCNAME設定型ホスティングサービスではCloudFrontのみです。
GitHubのドメイン認証の仕様
GitHubのドメイン認証は対象ドメインのNSレコードに指定されているDNSサーバが使われます。www.example.com
であれば、
www.example.com
のNSレコードを解決www.example.com
のNSレコードがなければ、その上位のドメインのNSを検索する(この場合はexample.com
)- 返ってきたNSレコードから
_github-challenge-***-org.www.example.com
のTXTレコードを検索する
CloudFrontのドメインをCNAMEに設定している場合NSレコードが追加されるので、GitHubのドメイン認証リクエストがこのNSレコードを使ってしまいます。このNSで指定される暗黙のRoute53ゾーンには認証用TXTレコードはないのでドメイン認証は成功しません。
手元PCから_github-challenge-***-org.www.example.com
のTXTレコードを検索すると、example.com
のNSでTXTレコードを検索します。www.example.com
のNSは使わないため、この現象は発生しません。そのため、設定できているのになぜか失敗するように見えます。
解決方法
CloudFrontのドメインがNSを返さなくなればベストですが、ドキュメントを探してもNSを削除する方法がありませんでした。そのためCNAMEを使わずRoute53に委任し、ALIASレコードを使う必要があります。
example.com
がすでにRoute53を使っているドメインなら、CNAMEをAレコードのALIASに差し替えれば完了です。クライアントの名前解決回数が1回減るので一石二鳥です。Route53を使っていなければ、Route53で新しくwww.example.com
ゾーンを作成し、ドメインを委任することになります。www.example.com
以下に別のレコードがある場合は、既存のDNSサーバからRoute53に忘れずにレコードをコピーします。
先述の通り、CloudFrontのドメインは標準でAAAAレコードも設定されます。単純にCNAMEをAレコードに変更しただけだとAAAAレコードが消えてしまい、IPv6で接続できなくなります。AAAAレコードが消えてもIPv4経由で引き続き利用できることがほとんどですが、意図しない設定変更なのは変わりありません。CNAMEと同じ挙動にするためにはAAAAレコードにもALIASの設定が必要です。
まとめ
CloudFrontで公開しているWebサイトをGitHub組織の認証済みURLに設定するときは、CNAMEを使わずRoute53のALIASレコードを使うようにしましょう。 (担当 松浦)