BerglasはGoogleが先日公開した、GCP向けの新しいシークレット管理ツールです。
内部的にはCloud KMSとCloud Storageが使われているみたいですね。
GKE、Cloud Functions、Cloud Build、Cloud Run等から比較的簡単に、登録した秘匿情報を取得することができそうです。
セットアップ
gloudコマンドの導入や、アカウントの認証などは完了している前提で進めます。
BerglasはGoのパッケージとして動作するので、まずはこちらをインストールします(Goの環境構築に関しての説明は省きます)。
go get github.com/GoogleCloudPlatform/berglas/...
go install github.com/GoogleCloudPlatform/berglas
また、公式のDockerImageも公開されているようなので、普段Goを使わない場合はこちらを利用した方が良いかもしれません。
docker pull gcr.io/berglas/berglas:latest
Berglasを使いたいプロジェクトで、必要なAPIを有効化します。
gcloud services enable --project プロジェクトID \
cloudkms.googleapis.com \
storage-api.googleapis.com \
storage-component.googleapis.com
Berglasの初期化処理を行います。シークレット情報はGCSに保管されるので、新しく作成されるGCSのbucket名を指定します。
berglas bootstrap --project プロジェクトID --bucket bucket名
最低限のセットアップはこれだけですね。
Cloud Buildのサンプル
Cloud buildを使ったサンプルを試してみます。作るのは、Berglasで登録したシークレットをCloud build内で標準出力するだけのものです。
secretの登録
シークレット情報を登録します。何らかのAPIキーを想定した、api-keyと言うkeyで登録してみます(bucket-name
とproject-id
の部分は適宜置き換えて下さい)。
berglas create bucket-name/api-key 登録したいシークレット --key projects/project-id/locations/global/keyRings/berglas/cryptoKeys/berglas-key
Successfully created secret: api-key
と表示されれば、登録完了です。
サービスアカウントへの権限付与
登録したシークレットを読み込むためには、各サービスアカウントやユーザーに紐付ける必要があります。今回はCloud Buildで使いたいので、Cloud Buildのサービスアカウントに紐付けました。
berglas grant bucket-name/api-key --member serviceAccount:CloudBuildのサービスアカウントアドレス
cloudbuild.yamlの作成
cloudbuild.yamlを書いていきます。
steps:
- id: berglas
name: gcr.io/berglas/berglas
env:
- API_KEY=berglas://bucket-name/api-key?destination=/secrets/api-key
args: ["exec", "--local", "--", "/bin/sh"]
volumes:
- name: secrets
path: /secrets
- name: 'ubuntu'
args: ['cat', '/secrets/api-key']
volumes:
- name: secrets
path: /secrets
berglas
ステップとubuntu
のステップでボリュームを共有し、共有ボリューム以下にシークレット情報を書き出したファイルを出力すると言う構成です。ちょっと回りくどいのでもっと簡単な方法で実現したいですね。
cloudbuildにあげてみて、登録したシークレット情報が出力されれば成功です。
gcloud builds submit --project project-id
実行結果
~中略~
Finished Step #1
PUSH
DONE
Step #1: 登録したシークレット
他の環境での実行に関して
GKEとの統合
GKEに立てたPod内から利用することもできるようですが、準備が若干大変そうです。GKEに関しては今の所k8sのsecretで間に合ってるので、今回は検証しませんでした。
Cloud Functions
Functionsに関しては、今の所Goしかサポートしていないようです。
Cloud Run
最近追加されたCloud Runに関しても、早速対応しています。Go、Node、Python、Rubyのサンプルがありました。
最後に
イメージ的にはCloud KMSのラッパーと言った感じなのでしょうか(KMSについてそれほど詳しくない・・・)。
個人的にGKEだとsecretリソースで割りと間に合ってる感じですが、Cloud BuildやCloud Runで比較的簡単に秘匿情報が扱えれば便利かも?