LoginSignup
13
6

More than 3 years have passed since last update.

CloudRunで使用する秘匿情報をberglasで管理する

Last updated at Posted at 2019-05-01

概要

SecretManagerが発表されたため、今後はSecretManagerが標準になると思われます。
SecretManagerを使ってみた記事は下記に記載。

CloudRunの秘匿情報をSecretManagerで扱ってみる

CloudRunでは環境変数くらいしかないため(Kubernetesのsecretに該当するものがない)、DB接続情報とか秘匿情報を安全に管理するためにberglasを使用しました。

berglasの特徴

  • サーバーレス環境などで使用する秘匿情報(DB接続情報など)を安全に管理するためのツール。
  • KMSとCloudStrageを使用して、暗号化した情報をストレージ管理する。
  • 管理している情報は環境変数から読み込むことができる。
  • 令和初日時点でバージョンは0.1.0

令和2年でもうバージョンが0.5.1まで上がっていたので、資料を更新。

公式ドキュメント

https://github.com/GoogleCloudPlatform/berglas

インストール

公式サイトからバイナリをインストール(2020/2/2)

公式サイトのReadme.mdにWindows/Linuxのバイナリへのリンクがあります。
Macはbrewでのインストールが記載されています。

ソースコード、Dockerからのインストール

Goがインストールされている場合

go get github.com/GoogleCloudPlatform/berglas/...
go install github.com/GoogleCloudPlatform/berglas

Dockerがインストールされている場合

docker pull gcr.io/berglas/berglas:latest

GoもDockerもインストールされていない場合

どっちかいれましょう。
(CloudRunをやる時点でDockerは必須ですし)

初期設定

クレデンシャルの発行

gcloud auth application-default login

プロジェクトIDとCloudStrageのバケット名を設定

バケットのロケーション設定を追加(2020/2/2)

export PROJECT_ID=<プロジェクトID>
export BUCKET_ID=<バケット名>
export BUCKET_LOCATION=asia-northeast1

補足:バケット名は未使用のものを環境変数で設定すること。実際にバケットを作成するのは後述のbootstrapなので、先に作るとbootstrapでエラーが出ます。

APIの有効化

version0.5.0からSecretManagerに対応したとあるので、secretmanager.googleapis.comを追加(2020/2/2)
gcloud services enable --project ${PROJECT_ID} \
  cloudkms.googleapis.com \
  secretmanager.googleapis.com \
  storage-api.googleapis.com \
  storage-component.googleapis.com

bootstrap

berglas bootstrap --project $PROJECT_ID --bucket $BUCKET_ID

ロケーションを指定する場合(大阪リージョンを指定した例)

berglas bootstrap --project $PROJECT_ID --bucket $BUCKET_ID --bucket-location asia-northeast2 --kms-location asia-northeast2

シークレットの作成

berglas create ${BUCKET_ID}/foo my-secret-data \
  --key projects/${PROJECT_ID}/locations/global/keyRings/berglas/cryptoKeys/berglas-key

成功すると、Google管理のオブジェクトがストレージに作成されます。
この時点ではアカウントオーナーでも内容は見れません。

特定ユーザーにオブジェクトの参照権限付与

berglas grant ${BUCKET_ID}/<オブジェクト名> --member user:user@mydomain.com

参照

berglas access ${BUCKET_ID}/<オブジェクト名>

なお、権限を付与することでブラウザでクラウドストレージを見ても内容を開くことはできますが、暗号化された状態のため、見ても意味はわかりません。

CloudRunから使用する

CloudRunに権限を付与する

PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format 'value(projectNumber)')
export SA_EMAIL=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${SA_EMAIL} \
  --role roles/run.viewer
berglas grant ${BUCKET_ID}/db_key --member serviceAccount:${SA_EMAIL}

ソースコードのサンプル

各言語のサンプルは下記。

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

私はPythonで試しましたが、Pythonの場合、ポイントはDockerファイルになります。
マルチステージデプロイでberglasのモジュールを持ってきて、berglasからPythonを起動しています。

デプロイ

環境変数設定で環境変数とシークレットのオブジェクトを紐づける。
これで、アプリ上では環境変数へのアクセスで利用できるようになる。

gcloud beta run deploy <アプリ名> --allow-unauthenticated --memory 128Mi --region us-central1 --timeout 30 --image <イメージ> --set-env-vars "<環境変数>=berglas://${BUCKET_ID}/<オブジェクト名>"
13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6