#概要
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}/<オブジェクト名>"