- 市川諒
- 約 2,600 文字
- 900 View
前書き
こんにちは、TIG所属インフラエンジニアの市川です。GCP連載の5本目です。
突然ですが、普段生活するうえでカギ🔑をなくした、忘れたことはないでしょうか。私はあります。なくしたことはないけど、うっかり置き忘れちゃうんですよね。
それがことインフラ構築の場面ではどうでしょうか。最近はとにかく多くのカギを管理しなくてはなりません。API Keyとか気づいたら何が何だか分からなくなり、苦渋の決断の末、再度払い出すことも多いのでは無いでしょうか。検証ならまぁ…ギリギリですが、本番ではやっちゃダメ絶対です。
ということで、そんな管理人の皆さんに朗報です。 遂にGCPにシークレット管理機能がやってきました! CLIツールのBerglasとGUIで管理するSecret Managerを簡単にご紹介したいと思います。
Berglasを使ってみる
サクっと利用するならCloud Shellだよね! ということで、以下Cloud Shellで作業をしています。
Berglasとは?
Githubページでこのツールについて確認します。
Berglasは、Google Cloudでシークレットを保存および取得するためのコマンドラインツールおよびライブラリです。シークレットはCloud KMSで暗号化され、Cloud Storageに保存されます。 Secret Managerには相互運用可能なレイヤーもあります。
- CLIとして:Berglasは、Google Cloudでのデータの暗号化、復号化、保存のプロセスを自動化します。
- ライブラリとして:BerglasはさまざまなGoogle Cloudランタイムへのシークレットの組み込みを自動化します
Berglasは、公式にサポートされているGoogle製品ではありません。
なるほど。GCPのリポジトリで開発されてるのに公式製品ではないのね。CLIとしてもライブラリとしても利用可能というところがイケてますね。
Berglasのインストール(正確にはバイナリをダウンロード)
wget https://storage.googleapis.com/berglas/master/linux_amd64/berglas |
Dockerコンテナもあるようなので、好みに応じて使い分けください。
環境変数の準備と依存してるAPIの有効化
サクッと設定しましょう。
環境変数の設定 |
Berglas環境のBootstrap
次コマンドを実行すると、シークレットを保存するための新しいCloud Storageバケットと、データを暗号化するためのCloud KMSキーが自動的に作成されます。
berglas bootstrap --project $PROJECT_ID --bucket $BUCKET_ID |
成功すると下記のような出力が確認できます! 最近のCLIツールってこれでもかってくらい優しくできていますよね。
Successfully created berglas environment: |
シークレットの作成
サンプルケースとして、httpbinのBasic認証APIへリクエストを投げ 200 OK するのCloud Functionsを作ります。
httpbinのBasic認証は次のようなレスポンスを返すモックサーバです。
認証情報なしだと401を返す |
ということで、ユーザ名・パスワードを認証情報としてシークレットにしていきましょう!
berglas create ${BUCKET_ID}/api-user basic-user-name \ |
手順
- Cloud Functionへ渡すサービスアカウントを作成
gcloud iam service-accounts create berglas-service-account \ |
Berglasから先ほど作ったサービスアカウントへシークレットへのアクセス権限を渡す
berglas grant ${BUCKET_ID}/api-user --member serviceAccount:${SA_EMAIL} |
Goのプログラム
golangでBASIC認証をする場合はSetBasicAuthを使います。
package fn |
デプロイ
gcloud functions deploy berglas-example-go \ |
テスト実行
ちゃんとBerglasで作成したシークレットが取得できましたね!
割と道のりが長いですが、GCPのサービスから簡単にアクセスできるのは気持ちが良いですね。
Secret Managerを利用
折り返しです。もうしばしお付き合いください。
Secret Manageとは?
インフラストラクチャとアプリケーションレベルのシークレットを暗号化、保存、管理、監査します。
https://cloud.google.com/solutions/secrets-management/
簡潔ですね。CloudKMSはGCPの管理するカギで暗号化、復号などをサポートしたサービスですが、もう一枚レイヤが上なサービスのようです。BerglasのGUI版ぐらいの気持ちでいると良いとお思います。
Secret Manager画面
GUI画面へはセキュリティ -> シークレット マネージャーでアクセスできます。
作成画面はかなり簡潔で好感度が高いです。この手のサービスはやたらと入力項目が多くて初見殺しなイメージ(勝手)があったので。
ラベルで整理ができるのも片づけが苦手な私にぴったりです(今回はつけていないですが)。。。
有効化、無効化、破棄も非常に容易にできます。新しいバージョンを選択することで、シークレットの中身の更新と過去のシークレットを一括無効にできます。
Berglasで登録したシークレットをSecret Managerに移す
何やらBerglasと連携もできるようなので、ちょこっと触ってみます。
- BerglasからSecret Managerのキーにアクセス
berglas access sm://${PROJECT_ID}/the-first-secret |
- migrate
Google Cloud Blogに「1回限りの」って書いてあるのが不穏w
berglas migrate ${BUCKET_ID} --project ${PROJECT_ID} |
2回目の実行
berglas migrate ${BUCKET_ID} --project ${PROJECT_ID} |
通りました。
- 画面
イケてますね! 当然ですが、最終更新日はUPLOADした時間になります。
Cloud FunctionからSecret Managerを使う
流れとしては、非常に簡単です。
- シークレットアクセサ役割をCloud Functionのサービスアカウントに割り当て
- 利用
サービスアカウントへ役割を割り当て
gcloud beta secrets add-iam-policy-binding the-first-secret \ |
サンプルプログラム
シークレットを吐き出すのみというシンプルなコードです。BerglasのクライアントライブラリはgooglecloudがメンテしているのがGoだけでしたが、今回はPythonライブラリがあったのでPythonで書きます。
import os |
ライブラリgoogle-cloud-secret-managerが必要なので、requirements.txtも作成しましょう。
google-cloud-secret-manager==0.1.1 |
デプロイ
gcloud functions deploy print_secret \ |
…ニッコリ😄
まとめ
使い方にちょいとクセというか、お作法があるので、習うより慣れろシリーズだと思います。
これでもう、カギの管理に困ることはなくなって、幸せな世界が待っていることでしょう。
ご興味のある方は、ぜひ触ってみてはいかがでしょうか。
GCP連載の5本目でした。次は齋場さんのTerraform Validatorを使って、GCPのセキュリティポリシーの自動チェックを行うです。