Googleから怪しげなメールが届いた。本文を見てみると「Google Cloud Platform または API プロジェクト(プロジェクト名)の認証情報が不正使用された可能性があります」とのこと。
ドキッとした。クラウド破産…!?
メール内の最初の方に、ここで一般公開されている、というURLが書かれていた。そこにアクセスしてみる。GitHubだった。するとたしかに僕のサイトっぽい名前のファイルがある。中身はバイナリファイルだったが、どうもここにAPIキーが含まれているらしい。
ちなみにプロジェクトはこのCrieitのプロジェクト。メールに色々と確認手順が書かれていたが、とりあえず読まずに料金がどうなっているだろうかを急いで確認してみた。今月の料金は……10円。とりあえず問題はなさそうでホッとした。が、そうこうしている間に何かしら利用されて今後料金が加算されていってしまう可能性がある。
細かくメールを見たかったがメール内にAPIキーが書かれていたので、ひとまずGCPのダッシュボードでそれが一体何のAPIキーなのかを調べてみることにした。
確認方法はGCPコンソールの「APIとサービス」→「認証情報」。ここでAPIキーの一覧を見ることができる。
問題となったのはこの画像の右下端に表示されている Browser key (auto created by Google Service)
というもの。なんとなく見覚えがある。だいたいFirebaseのプロジェクトに関連付けた時に勝手に作られているものがこんな感じだったような気がした。Browser keyということなのでそれっぽい。
とにかくどこで使っているかを確認してみることに。本番サーバーにログインし、.envを開いて検索してみた。しかし見つからない。
ということでローカル上でプロジェクトをVSCode開いて検索してみる。すると見つかった。やはりFirebaseのAPIキーだった。これは公開しないとどうしようもないのと、ちょっとした機能で使っているだけのため環境分けをするのも面倒だったので直接コミットしてある。ということでそれを見つけた。
Firebaseのプロジェクトを作ったことがある方であればよく見るものだと思うが、こういった設定。これのapiKeyというところが今回問題となったAPIキー。
僕が普段良く作っているWebアプリケーションの場合、この設定はブラウザで動作するもののため、そもそも公開しなければならない。そのため後悔自体は問題がないはず。
何が問題かというと、適切なセキュリティ設定が行われていない状態だと問題となる可能性がある。無料のSparkプランや月額制のFlameプランであればさほど問題にはならない。あるとしてもリソースを利用しつくされてサービスが止まるだけ。
問題となるのは従量制のBlazeプラン。今回のCrieitのアプリケーションはこれだった。この場合、従量制なのでいたずらで無限ループなどをされると恐らくとんでもない料金になってしまう可能性がある。とはいえ僕の場合Realtime Databaseと匿名認証を有効化していただけなのでさほど問題にはなりにくかったかもしれない。Firestoreを利用している場合は危険な可能性がある。
恐らく、SNS認証+Firestoreのセキュリティルール設定済み、であれば問題にはならないだろう。問題になりそうなのは、匿名認証+Firestoreという場合。SNS認証は認証可能なURLを設定できるため、その設定さえしておけば不正利用は難しい。しかし匿名認証はURL指定ができないため、APIキーを利用すれば誰でもアプリケーションを動かすことが出来てしまう。このパターンだとまずそう。ちなみに今回はこのパターン。
ではこの場合どうすればいいのか。メールにも書かれていた。
API キーに API キー制限を追加します(該当する場合)。
そう、先程スクショで説明した認証情報のページで、該当のAPIキーをクリックすると認証情報の設定ができる。ここでAPIキーの利用制限の設定ができる。GCPで直接自分で作ったキーの場合はできることを知っていたのだが、なんとなくFirebaseが勝手に作ったものは同じものという認識がなかったので気づかなかった。
とりあえず、リファラーの設定をしておいた。
何か間違っていたら機能が止まってしまうかもしれないが、今回は大したことのない機能のために使っているので気にせず設定した。これで一覧ページに元々出ていたアラートアイコンも消えた。
そもそもこの設定はFirebaseの方で出来た方がいいんじゃないか…と常々思っていた。わりとこのあたりの事を知らない方もいるのでは。
とにかくクラウドの利用は気をつけよう。そういえば料金アラートは設定していたので何にしろ何かあってもすぐ気づけたかもしれない。
細かく試して書いたわけではないため、もしこの記事で間違えている情報などあれば情報提供いただけるとありがたいです。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント