Posted at

GCPの新しいシークレット管理ツール、Berglasを使ってみる

BerglasはGoogleが先日公開した、GCP向けの新しいシークレット管理ツールです。

https://github.com/GoogleCloudPlatform/berglas

内部的には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-nameproject-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で間に合ってるので、今回は検証しませんでした。

https://github.com/GoogleCloudPlatform/berglas/tree/master/examples/kubernetes


Cloud Functions

Functionsに関しては、今の所Goしかサポートしていないようです。

https://github.com/GoogleCloudPlatform/berglas/tree/master/examples/cloudfunctions/go


Cloud Run

最近追加されたCloud Runに関しても、早速対応しています。Go、Node、Python、Rubyのサンプルがありました。

https://github.com/GoogleCloudPlatform/berglas/tree/master/examples/cloudrun


最後に

イメージ的にはCloud KMSのラッパーと言った感じなのでしょうか(KMSについてそれほど詳しくない・・・)。

個人的にGKEだとsecretリソースで割りと間に合ってる感じですが、Cloud BuildやCloud Runで比較的簡単に秘匿情報が扱えれば便利かも?