[小ネタ] Amazon CloudFrontのより詳細なジオロケーションヘッダでAWSのデータセンターについて情報が得られないか確認してみた

先日アップデートされたAmazon CloudFrontの詳細なジオロケーションヘッダを使うことで、AWSデータセンターの地理的情報が少しでも得られるのではと思い確認してみました。結果として国別コード以外の地理情報は得ることができませんでした。
2020.07.26

はじめに

清水です。先ほど以下のエントリにて、Amazon CloudFrontでアクセス元の都市名や郵便番号、緯度経度情報などがカスタムヘッダとして取得できるようになったアップデートをまとめました。

その中でふと、「アクセス元についておおよそでも位置情報がわかるのであれば、AWSデータセンターの場所についての情報も得られるのでは……?」という考えが頭をよぎりました。これまで東京などリージョン名のみしか公表されていなかったAWSデータセンター、おおよそでも地理的情報が得られると少し楽しくなりますよね。ということでやってみました。そして結果を先に述べますと、CloudFrontのジオロケーションヘッダではAWSデータセンターの場所についての情報はほとんど得られませんでした。

東京リージョンのEC2からCloudFrontにアクセスしてジオロケーションヘッダを確認してみる

AWS環境をアクセス元としてCloudFrontにアクセスする、ということで、Linux環境のEC2インスタンスを起動し、curlコマンドを実行する方法で確認してみました。

アクセスするCloudFrontディストリビューションについては、以下エントリで作成したものをそのまま使用します。(通常のプロバイダ経由などでは、ジオロケーションヘッダでアクセス元の地理情報が得られる、という状況です。)

アクセス先のCloudFrontディストリビューションのオリジンについても、上記エントリの通り、EC2インスタンス内にApache+PHPを稼働させていています。今回アクセス元はEC2(Linux)、クライアントはcurlコマンドとなるので、出力をhtmlではなくプレーンテキストで行うPHPコード(index_text.php)を用意しました。すべてのヘッダを出力する、という点は変わりません。

index_text.php

<?php

foreach (getallheaders() as $name => $value) {
    echo "$name: $value\n";
}

?>

実際に東京リージョン(AZ IDはapne1-az4)にEC2インスタンスを起動、curlコマンドでhttps://[CloudFrontドメイン]/index_text.phpにアクセスしてみます。結果は以下のようになりました。

[ec2-user@ip-10-82-21-146 ~]$ curl https://dXXXXXXXXXXXXd.cloudfront.net/index_text.php
Host: dXXXXXXXXXXXXd.cloudfront.net
User-Agent: curl/7.61.1
X-Amz-Cf-Id: CIzkRqCHtdpCDPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
Connection: Keep-Alive
Via: 2.0 6b386e52XXXXXXXXXXXXXXXX551c1d13.cloudfront.net (CloudFront)
X-Forwarded-For: 18.XXX.XXX.XXX
Accept: */*
CloudFront-Viewer-Country: JP

CloudFront-Viewer-Country(これは先日のアップデートで追加された機能ではなく、従来からある国別コードが得られるカスタムヘッダですね)については、CloudFrontによりカスタムヘッダが付与されていますが、今回のアップデートで追加された都市名や郵便番号、緯度経度情報などについてはそもそもCloudFrontからカスタムヘッダが付与されない、という結果になりました。(なお、CloudFront-Viewer-Countryの値JPについては、東京リージョンなので日本という点は合致していますね。)

オレゴンリージョンのEC2からCloudFrontにアクセスしてジオロケーションヘッダを確認してみる

東京リージョンのEC2では国別コード以外のジオロケーションヘッダは取得することができませんでした。念のため別リージョンのEC2でも同様の結果になるか確認しておきましょう。オレゴンリージョン(AZ IDはusw2-az1)にEC2インスタンスを起動し、東京リージョンと同様の確認を行ってみました。結果は以下の通り、東京リージョンと同様にCloudFront-Viewer-Country以外の地理情報について、カスタムヘッダから得ることはできませんでした。なおCloudFront-Viewer-Countryの値USはオレゴンリージョンなので合致しますね。(CloudFront-Viewer-Countryで国を判別する、ということは問題なさそうです。)

[ec2-user@ip-10-6-21-86 ~]$ curl https://dXXXXXXXXXXXXd.cloudfront.net/index_tex
t.php
Host: dXXXXXXXXXXXXd.cloudfront.net
User-Agent: curl/7.61.1
X-Amz-Cf-Id: r_mzdCq-BJ6vf6XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
Connection: Keep-Alive
Via: 2.0 7514e5e2XXXXXXXXXXXXXXXX4ecc67e1.cloudfront.net (CloudFront)
X-Forwarded-For: 34.XXX.XXX.XXX
Accept: */*
CloudFront-Viewer-Country: US

ElasticGate経由でCloudFrontにアクセスしてジオロケーションヘッダを確認してみる

クラスメソッドにはElasticGateというVPN+プロキシ環境があり、どこからでも固定されたグローバルIPでの通信が可能です。この固定されたグローバルIPはAWSをハブとして構成されており、IP自体もAWS(東京リージョン)のものとなっています。詳細は以下エントリをご参照ください。

東京リージョン、オレゴンリージョンのEC2、それぞれからcurlコマンド経由で確認した限りでは、CloudFront-Viewer-Country以外の地理的情報がまったく得られませんでしたが、このElasticGate経由でも念のため確認しておきましょう。MacからVPNを張り、プロキシ経由としたChromeでの確認となります。

結果は以下の通り、東京リージョン、オレゴンリージョンのEC2同様、CloudFront-Viewer-Country以外のジオロケーションについての情報は一切表示されない(CloudFrontでカスタムヘッダが付与されない)という結果になりました。

まとめ

Amazon CloudFrontで追加されたより詳細なジオロケーションヘッダを利用して、AWSデータセンターの地理的情報が得られないか確認してみました。結果としては国別コード以上の情報は得られない、ということになりました。AWSのデータセンターの場所は従来から非公開となっており、それがセキュリティの一要素でもあったかと思います。そのためCloudFrontのジオロケーション機能を用いてもそもそも具体的な場所はわからないだろうな、けど何かしら推測するのにつながる情報が出てくればおもしろい(妄想が広がる)な、などとは思っていましたが、結果としては国以上の詳細な情報が一切ない、という残念な結果となってしまいました。とはいえ、場所を秘匿するという点が徹底されていることを垣間見ることもできました。