Google Cloud の鍵管理 Secret Manager で機密情報の管理をサボろう

  • tech系
7min

こんにちは。
クラウドエース編集部です。

Google Cloud は、デフォルトで保存されている顧客コンテンツをデータ暗号鍵(Data Encryption Keys)を使用して暗号化します。
しかし、暗号化した鍵を暗号する鍵暗号鍵(Key Encryption Keys)は、Cloud KMS(Key Management Service)等で自分で管理する必要がありました。
Secret Manager では、KEK もデフォルトで管理可能なサービスであり、機密情報の管理がより簡単になります。
本記事では、その Secret Manager の使い方について紹介します。

本記事の対象

  • Secret Manager を使ったことがない人
  • Cloud KMS 等で機密情報の管理をしている人
  • 機密情報の安全性を保ちつつ、楽に管理したい人

Secret Manager とは、機密データを保存するための安全で便利なストレージシステム

Secret Manager は、API キー、パスワード、証明書、その他の機密データを保存するための安全で便利なストレージ システムです。
Google Cloud で使用されるすべての秘密情報を一元的に管理、アクセス、監査できるようにする機能を提供します。
また、Secret Manager API を有効にすると、Secret Manager をアプリケーションやプロセスに統合できます。

特徴は、3つあります。

  1. 最小限の実装が容易
    Secret Manager は、デフォルトで暗号化するため、暗号化/復号化の管理が不要になります。
    また、Secret Manager の Cloud IAM 役割を使用して、最小限の権限を与えることができます。
    そのため、シークレットを管理するユーザーとシークレットにアクセスするユーザーを分けることが可能です。
  2. ライフサイクル管理が簡単になる
    Secret Manager には、優れたバージョニングと、リクエストを最新のバージョンのシークレットに固定する機能があり、ライフサイクル管理が簡単です。
    Cloud Functinos を使用してローテーションの自動化も可能です。
  3. 組み込みの強力な監査
    Cloud 監査ログと統合されているため、Secret Manager とのやりとりがすべて監査ログに記録されます。
    この統合により、監査要件とコンプライアンス要件を簡単に満たすことが可能です。

シークレットを作成してみる

まずは、Google Cloud Console を使用してシークレット バージョンのコンテンツを作成する方法を紹介します。

  1. Cloud Console の [Secret Manager] ページに移動します。
  2. [シークレット マネージャー] ページで、[シークレットを作成] をクリックします。
  3. [シークレットの作成] ページの [名前] に「my-secret」と入力します。
  4. [シークレット値] フィールドに「my super secret data」と入力します。
  5. [リージョン] セクションは変更しません。
  6. [シークレットを作成] ボタンをクリックします。

【作成されたシークレットの確認方法】

  1. Cloud Console の [Secret Manager] ページに作成したシークレットの名前をクリックします。
  2. [シークレットの詳細]ページの[操作]の[︙]をクリック
  3. [名前]、[シークレットの値]に間違いがなく、[バージョン]が「1」で[ステータス]が「有効」になっていれば OK。

ローカル環境から Go でシークレットにアクセスする。

次にシークレット バージョンのコンテンツにローカル環境からクライアントライブラリを使ってアクセスする方法を紹介します。
シークレット バージョンにアクセスすると、シークレットの値が返されます。
シークレット バージョンにアクセスする際は、その version-id を指定します。
また、”latest” をバージョンとして指定することにより、シークレットの最新バージョンにもアクセスできます。
(Go 以外の言語で試したい場合は、以下のドキュメントを参照ください)
https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets#access

前提として、Go と Cloud SDK のインストールが完了していることとします。
まだ完了していない場合は、開発環境の設定のドキュメントをご参考にください。

手順は以下の通りです。

  1. Secret Manager Go SDK をインストール
  2. 使用するサービスアカウントに Secret Accessor ロールの IAM 権限を付与
  3. Secret Manager にリクエストを送る

1.Secret Manager Go SDK をインストール

まず、クライアントライブラリをインストールします。

go get -u cloud.google.com/go/secretmanager/apiv1
go get -u google.golang.org/genproto/googleapis/cloud/secretmanager/v1

次に、認証の設定を行います。
クライアントライブラリを実行するには、認証を設定する必要があります。
その1つの方法は、サービスアカウントを作成し、環境変数を設定することです。
使用する環境によって手順も異なるため、以下のドキュメントを参考に実施してください。
https://cloud.google.com/docs/authentication/production#manually

2.使用するサービスアカウントに Secret Accessor ロールの IAM 権限を付与

シークレット バージョンにアクセスするには、シークレット、プロジェクト、フォルダまたは組織に対する Secret Manager の Secret Accessor ロール(roles/secretmanager.secretAccessor)が必要です。
今回はクライアントライブラリからローカルにアクセスするので、1で設定したサービスアカウントに Secret Accessor ロールを付与する必要があります。

  1. Cloud Console の [IAM と管理] ページに移動します。
  2. [IAM] ページで、設定を行ったサービスアカウントの欄の [鉛筆アイコン] をクリックします。
  3. [権限の編集] ページの [+ロールの追加] をクリックします。
  4. [ロールを選択] で [Secret Manager のシークレットアクセサー] を選択し、[保存] をクリックします

3.Secret Manager にリクエストを送る

まず、事前準備としてアクセスするシークレットの path を環境変数にセットします。

key value
SECRET_NAME projects/my-project/secrets/my-secret/versions/5(バージョン5にアクセス)
projects/my-project/secrets/my-secret/versions/latest(最新バージョンにアクセス)

そして、以下のコードを使いリクエストを送ると、シークレットの値が返ってきます。

package config
import (
"context"
"fmt"
secretmanager "cloud.google.com/go/secretmanager/apiv1"
secretmanagerpb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
)
func AccessSecretVersion() (string, error) {
// nilでない空のContextを返す
ctx := context.Background()
// secret manager service client の初期化
client, err := secretmanager.NewClient(ctx)
if err != nil {
return "", fmt.Errorf("failed to create secretmanager client: %v", err)
}
// 環境変数にセットしたシークレットのpathをnameに代入
name := os.Getenv("SECRET_NAME")
if name == "" {
fmt.Errorf("%s is not found", key)
}
// リクエストの作成
req := &secretmanagerpb.AccessSecretVersionRequest{
Name: name,
}
// リクエストの送信
result, err := client.AccessSecretVersion(ctx, req)
if err != nil {
return "", fmt.Errorf("failed to access secret verion: %v", err)
}
// 返ってきたシークレットの値をvalueに代入
value := string(result.Payload.Data)
return value, nil
}

Cloud Functions からシークレットにネイティブでアクセスする。

Cloud Functions からシークレットにアクセスする場合は、クライアントライブラリを使用せずに Google Cloud Console の画面で自動取得することが可能です。

  1. Cloud Console の [Cloud Functions] ページに移動します。
  2. [Cloud Functions] ページで、[関数を作成] をクリックします。
  3. [関数を作成] ページの [ランタイム、ビルド、接続、セキュリティ設定] をクリックします。
  4. [セキュリティ] を選択し、[シークレットを参照] をクリックします。
  5. [Secret] フィールドでは、作成したシークレットを、[参照の方法] では参照したい方法を選択してください。(本記事では、環境変数として参照する方法を紹介します)
  6. [環境変数] の[名前] フィールドでは、環境変数の key を入力し、[バージョン] フィールドでは、参照したいバージョンを選択してください。(以下では、最新バージョンを参照するために「latest」を選択しました)
  7. 最後に、[完了] を押すと Secret Manager にアクセスする準備は完了です。
    Cloud Functions を実行すると自動的にアクセスして指定した環境変数にセットしてくれます。

まとめ

ここまで読んでくださってありがとうございました。
Secret Manager がどういうものなのかイメージが沸きましたでしょうか。
機密情報を楽に管理する際にとても便利なサービスなので、是非使ってみてください。
Cloud KMS 等で作成した鍵を利用してパスワードを暗号化/復号化されたことがある方も、是非とも一度 Secret Manager を試してみていただき、どれだけ楽になるのかを体験していただけたらと思います。

クラウドエースでは、Google Cloud のご利用について様々な技術支援を行っております。
何かお困りのことがございましたらぜひご相談ください!
(お問い合わせはコチラ→ https://cloud-ace.jp/general-contact/

では、また会いましょう!

合わせて読みたい