🙌

【GCP】Secret Manageを触ってみた

2021/03/28に公開
1

GCP Secret Managerとは

GCPのSecret Managerとは、APIキーやパスワードなど各種機密情報を一元管理するためのサービスです。

例えば、アプリケーションから外部APIにアクセスする際、APIキーが必要としましょう。
この時、各アプリケーションではAPIキーが必要ですがどこで管理するでしょうか。GitHubで管理する。デプロイ時に設定する。など様々あると思います。
しかし、この運用だと機密情報への細かいアクセス管理が難しくなります。また、APIキーを更新した際、使用している全てのアプリケーションを修正する必要がでてきます。

これを解決するのがGCPのSecret Managerです。
機密情報を一元管理することで、アプリケーションは機密情報を参照するだけでよくなり、セキュアに運用可能です。

下記はSecret Managerのイメージ図です。

ざっくり説明すると

  • 機密情報はSecret Managerで一元管理する
  • 機密情報は管理者が作成・更新・削除などを行う
  • 各アプリケーションではSecret Managerから機密情報を参照する(アプリケーション側で機密情報を保持する必要がない)

構成

Secret Managerは下記のような構成になっています。

オブジェクトでいうと次のようなイメージでしょうか。

{
  "メタデータ": {
    "レプリケーションポリシー": "xxx",
    "ラベル": "xxx",
    "権限": "xxx"
  },
  "バージョン": [
    {"シークレット値": "xxx", "ステータス": "xxx"},
    {"シークレット値": "xxx", "ステータス": "xxx"}
  ]
}

シークレットは、メタデータとバージョンのコレクションを含むオブジェクトです。
メタデータとバージョンを保持しています。APIキーや資格情報などはバージョンに保存される形になっています。

シークレットの作成

Secret Managerはセキュリティ > Secret Managerから作成できます。

シークレットの値は直接入力とファイルインポートが可能です。

gcloudから作成する場合は、次のコマンドでできます。
echo -n "testpassword2" | gcloud secrets create testpassword2 --data-file=-

バージョンの追加

シークレット値の更新をしたい場合は新しいバージョンを追加を行います。

gcloudから作成する場合は、次のコマンドでできます。
echo -n "add version3" | gcloud secrets versions add testpassword2 --data-file=-

バージョンの参照

ここではgcloudでシークレット値を確認します。

# バージョン指定
$ gcloud secrets versions access 3 --secret="testpassword2"

# 最新のバージョンを取得する場合はlatestを指定
$ gcloud secrets versions access latest --secret="testpassword2"

バージョンの確認は各アプリケーションでSDKを使用すると思います。サンプルはこちらの公式ドキュメントから確認できます。

https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets?hl=ja#access

pubsubの通知

プレビュー版の機能ではありますが、シークレットやバージョンの変更に関する情報をPub/Subに送信することも可能です。
これによりバージョンを追加や削除した際、slackに通知や任意のワークフローを実行できます。

pubsubの設定は現在コンソールからは設定できません。

サービスアカウントの作成

# サービスアカウントの作成
$ gcloud beta services identity create --service "secretmanager.googleapis.com"
$ export SM_SERVICE_ACCOUNT="service-...."
# ポリシーのバインディング
$ gcloud pubsub topics add-iam-policy-binding topic-test --member "serviceAccount:${SM_SERVICE_ACCOUNT}" --role "roles/pubsub.publisher"

topicの紐付け

# topicの紐付け
$ gcloud beta secrets update testpassword2 --add-topics "projects/${PROJECT_ID}/topics/${TOPIC_NAME}"

# 設定の確認
$ gcloud beta secrets describe testpassword2
createTime: '2021-03-28T03:17:28.532523Z'
name: projects/${PROJECT_ID}/secrets/testpassword2
replication:
  automatic: {}
topics:
- name: projects/${PROJECT_ID}/topics/${TOPIC_NAME}

バージョンの追加をすると、メッセージが飛んでいました。

詳細を知りたい場合はこちらの公式ドキュメントを参照してください。
https://cloud.google.com/secret-manager/docs/event-notifications?hl=ja

料金

Secret Managerはアクセス オペレーション 10,000 オペレーションあたり $0.03で課金されます。
https://cloud.google.com/secret-manager/pricing?hl=ja

そのためリクエストが多い場合は注意が必要です。
APIキーの取得などは初回の1度だけで良いと思うので、アプリケーションの実行時に1度だけ取得して使い回すやデプロイ時に環境変数として反映するなどの工夫は必要そうです。

さいごに

Secret Managerを使えば機密情報を1元管理できたり、アクセス制御によるセキュアな運用ができて良さそうですね。
シークレットに有効期限やpubsub通知はプレビュー版なので今後のアップデータも期待したいです。

参考

Discussion