🔑

Google Cloudのサービスアカウントキーの管理方法考察

に公開

大前提として、サービスアカウントキーは他の代替手段が使えない場合のみに使います。

サービスアカウントキーをアプリケーションで読み込む場合以下2パターンが考えられます。

  • 環境変数に直接サービスアカウントキーを設定する
  • キーファイル自体はコンテナのボリュームマウントなどで配置して、環境変数にはそのパスを指定する。

Google Cloudが記載しているベストプラクティスにもパスを環境変数に入れるべきという情報は見当たりませんでした。
https://docs.cloud.google.com/iam/docs/best-practices-for-managing-service-account-keys?hl=ja

一方で、Google CloudのADCがデフォルトで認証情報を探す場所をみると、GOOGLE_APPLICATION_CREDENTIALSという環境変数に指定された、サービスアカウントキーなどのJSONファイルのパスを参照しています。
このことからGoogle的には環境変数にパスを入れることを推奨しているのかもしれません。
https://docs.cloud.google.com/docs/authentication/application-default-credentials?hl=ja

また、サービスアカウントキーは基本的に使用を避けるべきという表現はよく目にしており、それはサービスアカウントキーは流出してしまうとGCPリソースへの広範な操作が可能になるため、パスワードなどの単一のサービスなどにアクセス可能になるような機密情報よりも影響度が大きく、セキュリティリスクが高いためなのかなと思われました。

また、サービスアカウントキーは-----BEGIN PRIVATE KEY-----のような決まった文字列を含んでいるため、ログ出力などの何らかの形で環境変数に直接設定したサービスアカウントキーの情報が意図せず流出したときに、攻撃者から取得されやすいのかもと思いました。
一方で同様のケースにおいて、環境変数にパスを指定した場合はパスの情報が出力されるだけなので、環境変数にキーを直接設定する場合と比べて安全性が高いのかなと思いました。

明示的な理由はわかりませんでしたが、環境変数にはパスを指定して実体のデータはコンテナにマウントすることで、サービスアカウントキーのセキュリティリスクをできるだけ低減できそうな方法を取るほうが良さそうに感じました。

Discussion