GCPは堅牢なサービスアカウントの鍵管理機能を提供している。それは認可された適切なエンティティのみが稼働中のGCPリソースにアクセスできるようにする。
アプリ全体がGCP上で稼働している場合、サービスアカウントの鍵管理はGCP側で自動で鍵ローテーションなどを行ってくれるため容易である。しかし多くのアプリは様々な環境で実行されているので、鍵を安全に管理することが必要である。
GCPの外にあるサービスアカウントを保護する
サービスアカウントを作成する時、最小権限の規則に従っているか確認する。これはGCP外に置く置かないに関わらず全てのケースで有効な手段である。
サービスアカウントのキーはダウンロードされると、GCPのコントロール外になるので、セキュリティリスクは高くなる。そのため鍵のローテーションなどをして管理しないといけない。
ベスト・プラクティス
- ローカル環境に鍵をダウロードするなら、その鍵はプロダクションリソースへのアクセス権が与えられてないことを確認してください
- 以下のメソッドを使って鍵をローテートする。
- ServiceAccounts.keys.create()
- Replace old key with new key
- ServiceAccounts.keys.delete()
- 毎日の鍵ローテーション処理の実装し、開発者がCloudStorageから鍵ファイルをダウンロードできるようにする。
- serviceAccount.keys.list()もしくはLogs Viewerページを使って、サービスアカウントと鍵を監査する。
- Service Account ActorとService Account Userロールの権限を持つユーザを制限する。
- ローカルの開発環境のために、GOOGLE_APPLICATION_CREDENTIALSを設定する。
- 開発者が外部のソースコードリポジトリから鍵を取得するのを防ぐ。
- 定期的に外部リポジトリをスキャンし、鍵が置かれてたら是正処置を行う。
鍵のローテーション
Keyrotator(https://github.com/Googlecloudplatform/keyrotator)
はシンプルなCLIツールでPythonで記述されている。adminインスタンス上でcronジョブとして実行し、夜中に新しい鍵をCloudStorageに配置し、開発者が朝方にその鍵をダウンロードして使用する。
鍵を含むバケットのアクセスコントロールは必須である。
- リソースをシェアするためのプロジェクトを作成
- バケットを作成
- 開発者用のグループを作成
- storage.objectViewerロールを開発者グループに割り当て、バケットを読めるようにする。
※より強いコントロールするときはCloud KMSを使用する。
外部のソースコードリポジトリに鍵がコミットされるのを防ぐ
外部のソースコードリポジトリに鍵を置く代わりの手段として、GCPではプライベートなGitリポジトリを提供している。
もしくはgit-secretsを使うことによって、鍵が外部リポジトリにアップロードされるのを防ぐことができる。
外部リポジトリをスキャンする
git-secretsを補完するツールとしてtrufflehogを使用する。trufflehogはリポジトリの履歴を検索し、鍵がアップロードされたか調べることができる。