この記事は Google の Developer Advocate である Angela Yu による Google Maps Platform Blog の記事 " Google Maps Platform best practices: Securing API keys when using Static Maps and Street View APIs" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。



Google Maps Platform では、API キーをオープンな環境へ公表しなければならない場合でも、不正使用から API キーを守るために、複数レイヤにわたるセキュリティ措置を提供しています。この記事では、クレジットカードの利用に例えて、Google Maps Platform における様々なセキュリティ機能の仕組みを説明します。API キーをお財布の中のクレジットカードに記載されたカード番号だと考えてみてください。

クレジットカード番号と同じように、API キーを保護しよう

Maps Static API および Street View Static API は、カスタマイズされた地図または、ストリートビューのパノラマを公開するための、最も単純かつ効率の良い方法です。これらの API を使えば、どのようなウェブページにも、Google Maps Platform によってホスティングされているソース URL を伴う画像として、静的な地図やストリートビューの画像を追加できます。また、Google Maps Platform 使用状況に応じて適用される、1か月 $200 ドル分の無料クレジット の枠内で、最大 10 万件までの静的地図、または 28,000 件の静的なストリートビューの読み込みを提供できます。

ただし静的画像の API を使用するには、APIキーを誰でも閲覧可能なコードの中に含める必要があります。



グレートバリアーリーフのヘロン島で撮影された Google ストリートビューの水中写真。Street View Static API を使って埋め込んだ場合、このように表示されます。


上記のようなストリートビュー画像を、 Street View Static APIを使って、ご自身のウェブページに埋め込むには、下記の URL に設定された src 属性を持つ <img> タグをコードに埋め込む必要があります。ただし、以下のように、ウェブページのソースコードを閲覧したすべての人に、URL の一部として、API キーが見えてしまうことになります:


https://maps.googleapis.com/maps/api/streetview?location=-23.4427738,151.9276581&size=600x400&heading=75&key=AIzaSyCnltht8tNqkjMoAI-p2WzVVuT0DDl5iyI...


少し不安に感じますか?クレジットカードに例えると、泥棒にクレジットカード番号を盗まれてネットで好きなだけ買物をされてしまうように、誰かに自分の API キーをコピーされて、Google Maps Platform で好きなだけ API コールをされる恐れがあります。そこで、意図する用途以外に API キー使われることを防ぐために、API キーを保護する必要があるのです。



API キーを制限しよう

API キーは、特定の HTTP リファラからしか使えない、ということを Google Maps Platform に設定することで、用途制限をかけることができます(参考記事)。これは、クレジットカードを特定の小売チェーン店でしか使えないようにことと同様です。しかし、それでもまだ、誰かに一か所の店舗で大量に使われてしまうリスクは防ぎきれません。

さらなるセキュリティ措置として、この API キーが Street View Static API の呼び出しにしか使えないようにする制限をかけることもできます。すなわち、このクレジットカードは書籍を買うためにしか使えない、と制限をかけるのに似ています。こうすることで、悪意ある第三者にとって、クレジットカードの利用価値は大きく下がります。

あなただけが生成可能なデジタル署名

ホスティングされた画像の領域では、デジタル署名を追加することを推奨しています。これは、特定の書籍の購入をする際に、指紋認証を用いることに似ています。

デジタル署名された URL を生成するには、 API リクエストと API キーを、Google Cloud コンソールが管理する URL 署名シークレットと組み合わせる必要があります。署名シークレットとは、指紋のように、個人しか持っていないものであり、リクエストされる URL とは書籍の ISBN コードのようなものです。つまり、指紋と ISBN の数学的組み合わせに基づいてデジタル署名が生成されます。これは、あなたが公に共有できるものです。例えば、皆さんがご自身のクレジットカードを使って、特定の書籍購入を許可すると伝えているのと同等です(この場合、 API キーを使って特定の静的画像読み込みを許可していることになります)。




Google Cloud コンソールにおいて URL にデジタル署名を行っている画面のスクリーンショット


Google Cloud コンソールを使ってデジタル署名を生成できます (Maps Static API および Street View Static API に関する手順はこちら)。または、デジタル署名を作成するために独自のサーバ側アプリケーションのコードを書くこともできます(文書の中にサンプルコードを記載しています)。デジタル署名は、皆さんの URL に添付されます。以下が、前掲のストリートビュー画像を読み込むために使える、署名された URL です。


https://maps.googleapis.com/maps/api/streetview?location=-23.4427738,151.9276581&size=600x400&heading=75&key=AIzaSyCnltht8tNqkjMoAI-p2WzVVuT0DDl5iyI&signature=Qt0k0Nrh8t6VFlEz2sdtIz__sPw=


サインされていない要求を制限する

静的な画像の URL にデジタル署名を追加する作業が済んだら、Maps Static API または Street View Static API へのキーを使ったデジタル署名を伴わないリクエスト件数の許容限界数をプロジェクトの中で低くすることで、さらにアカウントの安全度を強化できます。



この動画では、Google Cloud コンソールで量的制限値を管理する方法を示しています。Maps Static API と Street View Static API の量的上限値設定のページに関して、署名ありのリクエストの量的上限値、署名なしのリスクエストの量的上限値を管理する部分が、それぞれに設けられています。初期設定として、これら API を使ったプロジェクトは、1 日あたり 最大 25,000 件の署名なしリクエストを受付可能です。皆さんが API キーを使ってデジタル署名を伴った静的画像の URL のみを使用可能としたい場合は、この量的上限値を 0 に変更してください。



API キー、アプリケーション制限、API 制限、デジタル署名、量的上限値という 5 つのセキュリティ階層を設けることで、Google Maps Platform の認証情報を想定外に使用されてしまうのを防ぐことができます。ここで、前掲のストリートビュー画像を公開するために、5 つすべてを使用しました。したがって、たとえこの API キーが誰でも閲覧可能であっても、本ブログ上で、デジタル署名された要求先 URL によって、当該の Street View Static API を呼び出すためにしか使用できません。この特定のストリートビュー画像用の URL に基づいて、 1 つのデジタル署名しか作成していないため、この署名は他のどのストリートビュー画像に対しても機能しません。パノラマ画像のなかで向きを変えて別の角度から見ることさえできません。


クレジットカードの例えを最後まで当てはめるなら、次のようになります。クレジットカード番号を公開しましたが、同時に、クレジットカード会社に、そのクレジットカード番号は、パウエルズという書店からミゲル・ド・セルバンテス・サアヴェドラ Miguel de Cervantes Saavedra 作のペーパーバック書籍、『ドンキホーテ Don Quixote』を購入するためにのみ使うよう、指示を出したようなものなのです。 "El que lee mucho y anda mucho, ve mucho y sabe mucho."(よく読み、よく歩く人は、多くの事を見聞きし、多くの事を知る―「ドンキホーテ」からの引用)


Google Maps Platform に関する詳しい情報はこちらをご覧ください。ご質問やご意見はページ右上の「お問い合わせ」より承っております。


Posted by 丸山 智康 (Tomoyasu Maruyama) - Google Maps テクニカルアカウントマネージャ