Secret Managerは、GCP上でパスワードやAPIキーなどの秘密情報を安全に管理するためのサービスです。こちらのサービスは、2020年3月にGAとなりました。AWSをご存知の方は、AWS Secrets Managerと同等の機能だと思っていただいて問題ないと思います。

KMSとの違いは?

GCPには、以前から秘密情報を管理する仕組みとしてよく利用されていた機能に、Cloud Key Management Service(KMS)があります。こちらのサービスは、鍵の一元管理を目的にしたサービスで、秘密情報そのものではなく、その情報を管理するための鍵を管理するサービスです。

どんなサービスなのか

このサービスは、シークレット(秘密情報)を管理するためのサービスです。このシークレットを削除、有効、無効を設定でき、バージョン管理が出来ます。 主な機能を列挙すると下記の通りです。

  • シークレット(認証情報)の集中管理ができる
  • 暗号化/復号化はSecret Manager側でやってくれる
  • IAMでシークレット毎に利用権限の設定が可能
  • Audit Logでシークレットの利用履歴を確認できる
  • シークレットのバージョン管理が可能

利用イメージは、アプリケーションを開発する場合、外部サービスと連携をする際にAPIキーなどの秘密情報を利用する場合があるかと思います。CI/CDツールのデプロイステージ等で、環境変数等によりその値をインジェクションするケースもあると思いますが、このSecret Managerを利用することで、アプリケーション側からその値を安全に取得することが出来ます。

シークレットを作成する

GCPプロジェクトのコンソールから、「セキュリティー」、「シークレットマネージャー」をクリックします。初めて利用される方は、下記のような画面が表示されると思います。

シークレットを作成します。今回は、下記のような内容で作成します。

作成後には、下記のようにバージョンなどが表示されます。また、このシークレットごとにアカウントの設定ができる点も抑えておきたいポイントです。

簡単ですが、コンソールを通しての作成は、表示に簡単です。 

シークレットをアプリから利用する

先程作成したシークレットをgolangで生成したアプリケーションで利用する例を示したいと思います。先程のシークレットには、サービスアカウント「test-app」が割りあたっているという想定で以下サンプルは、記載します。


package main

import (
	"context"
	"log"

	secretmanager "cloud.google.com/go/secretmanager/apiv1"
	secretmanagerpb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
)

func main() {
    projectID := "You're project id"

    // クライアント生成
    ctx := context.Background()
    client, err := secretmanager.NewClient(ctx)
    if err != nil {
        log.Fatalf("failed to setup client: %v", err)
    }

    // シークレット、test-appの最新バージョンにアクセス
    resourceName := "projects/" + projectID + "/secrets/" + "test-app" + "/versions/latest"
    req := &secretmanagerpb.AccessSecretVersionRequest{
        Name: resourceName,
    }

    // シークレット上にアクセスする
    result, err := client.AccessSecretVersion(ctx, req)
    if err != nil {
        log.Fatalf("failed to access secret version: %v", err)
    }
    log.Printf("%v", result.Payload)
}

実行時には、事前に紐付けたサービスアカウントのキーファイル(json)を利用して、下記のような形で起動します。

$ GOOGLE_APPLICATION_CREDENTIALS='./test-app@xxxx.json' go run src/main.go

 上記のような形で簡単にアクセスすることが出来ます。定期的に更新する場合にも、最新版を参照するような形にしておくことで、再デプロイ等もせずに安全に更新することができると思います。

おわりに

Googleが提供するSecret Managerについて、簡単に触りながらどんなサービスか紹介しました。非常にシンプルで暗号化・複合についてもSecretManagerで面倒を見てくれ、シークレット(秘密情報ごと)にアカウント(サービスアカウント)が設定できるので、アプリケーションやユーザことに公開非公開を制御できます。従来のKMSで秘密情報を管理する方法よりは、導入の敷居は低いので、導入してみてはいかがでしょうか。