🔐

GCPのSecret Managerとberglasが便利

2022/05/11に公開

最近Secretの管理にGCPのSecret Managerberglasを使っていて快適なので紹介したいと思います。

どう便利なのか

Secret ManagerはSecretと権限の管理が楽

Secret ManagerはSecretの管理を行えるGCPのサービスです。

gcloud コマンドからSecretを作成したり

$ pbpaste | gcloud secrets create SECRET_A --replication-policy automatic --data-file=-

GoogleアカウントやGoogleグループにも権限を紐付けられるので、鍵の配布などをせずに権限の付与・無効化ができます。 Terraformで管理することもできます。

hoge@gmail.com にSECRET_A, SECRET_Bのアクセス権限が付与されている
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を使っている場合

ポイントは以下です。

  1. volumeでGCPのuser credentialsを渡す
    • gcloud auth application-default login~/.config/gcloud/application_default_credentials.json に生成されるものです
  2. 渡したuser credentialsをみるように環境変数 GOOGLE_APPLICATION_CREDENTIALS を指定する
Dockerfile.dev
# ...

COPY --from=asia-docker.pkg.dev/berglas/berglas/berglas:latest /bin/berglas /bin/berglas
RUN chmod +x /bin/berglas

ENTRYPOINT ["/bin/berglas", "exec", "--"]
# CMD ["npm", "start"] など
docker-compose.yaml
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/exec
#!/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