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

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/

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

合わせて読みたい