GCPのSecret Managerとberglasが便利
最近Secretの管理にGCPのSecret Managerとberglasを使っていて快適なので紹介したいと思います。
どう便利なのか
Secret ManagerはSecretと権限の管理が楽
Secret ManagerはSecretの管理を行えるGCPのサービスです。
gcloud
コマンドからSecretを作成したり
$ pbpaste | gcloud secrets create SECRET_A --replication-policy automatic --data-file=-
GoogleアカウントやGoogleグループにも権限を紐付けられるので、鍵の配布などをせずに権限の付与・無効化ができます。 Terraformで管理することもできます。
resource "google_secret_manager_secret_iam_member" "hoge" {
for_each = toset(["SECRET_A", "SECRET_B"])
project = "test-project"
secret_id = each.value
role = "roles/secretmanager.secretAccessor"
member = "user:hoge@gmail.com"
}
Secret Managerに限らない話ですが、権限を持っている人が復号されたSecretの内容を保存していた場合には、中身をローテーションなどしていない限りアクセス権限を無効化してもずっとその情報を使い続けることができることには注意が必要です。
berglasはプログラミング言語やフレームワークに依存しないで使える
berglasはCLIツールで、環境変数に特定フォーマットでSecretへの参照を入れておくと、その値をとってきてくれます。例えば FOO=sm://$PROJECT_ID/$SECRET_NAME berglas exec -- bar
を実行すると、Secret Managerから取ってきた値が環境変数 FOO
に入って bar
が実行されます。
berglasはバイナリもDockerイメージも配布されているので、簡単に使い始めることができます。
僕個人はRailsのCredentails周りの仕様変更が多すぎるのに疲れて使い始めました。複数人で開発する場合でもSecretが分散しない点もこちらの方が優れていると思いますし、今はRailsに限らずGCPを使っているプロジェクトでは基本使っています。
開発環境で利用する
Dockerを使っている場合
ポイントは以下です。
- volumeでGCPのuser credentialsを渡す
-
gcloud auth application-default login
で~/.config/gcloud/application_default_credentials.json
に生成されるものです
-
- 渡したuser credentialsをみるように環境変数
GOOGLE_APPLICATION_CREDENTIALS
を指定する
# ...
COPY /bin/berglas /bin/berglas
RUN chmod +x /bin/berglas
ENTRYPOINT ["/bin/berglas", "exec", "--"]
# CMD ["npm", "start"] など
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile.dev
environment:
- "GOOGLE_APPLICATION_CREDENTIALS=/var/application_default_credentials.json"
- SECRET_1=sm://test-project/SECRET_1 # berglasによって展開される
# ...
volumes:
- "~/.config/gcloud/application_default_credentials.json:/var/application_default_credentials.json"
# ...
Dockerを使っていない場合
berglas
がインストールされている必要があります。macOSならbrew install berglas
などでインストールできます。詳しくはberglasのREADMEを見てください。
僕は以下のように、プロジェクト固有の環境変数の設定、berglasでのSecret読み込み用のラッパースクリプトを置いて使っています。
#!/bin/bash
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/.config/gcloud/application_default_credentials.json"
export GCP_PROJECT=test-project
export FOO=bar
for name in SECRET_A SECRET_B
do
export "${name}=sm://${GCP_PROJECT}/${name}"
done
exec berglas exec -- "$@"
を置いて chmod +x bin/exec
とかをしておけば、
$ bin/exec npm start
などと使えます。
本番環境で利用する
Secret ManagerのSecret IDを直接指定できるGCPのサービスでは、それを利用すれば良いです。そうではない場合でもApplication Default Credentialsが使われるように環境を設定し、サービスアカウントに権限を付与しておけば、上の例と同じようにberglasでSecretを使うことができます。
Discussion