Google Cloud Key Managementでの暗号化
シークレットマネージャーの接続情報をGoogle Cloud Key Managementで保護

KeeperシークレットマネージャーはGoogle Cloud Key Managementと連携し、Keeperシークレットマネージャーの構成ファイルを暗号化できるようにします。この連携により、マシン上の接続情報を保護しながら、すべてのシークレット認証情報に対するKeeperのゼロ知識暗号化の利点を活用できます。
機能
Google Cloud Key Managementを使って、Keeperシークレットマネージャーの構成ファイルを暗号化および復号化します。
シークレットマネージャーの接続情報への不正アクセスを防止します。
保護のためにコードに加える変更は最小限で済みます。すべてのKeeperシークレットマネージャーSDK機能で動作します。
要件
Keeper SecurityとGoogle Cloud Key Managementを連携するには、
.jsonで終わるサービスアカウントキーが必要です。この連携で利用できるキーの構造は以下の形式です。
projects/<project_name>/locations/<location_name>/keyRings/<key_ring_name>/cryptoKeys/<key_name>/cryptoKeyVersions/<key_version>
Java/Kotlin版シークレットマネージャーSDKに対応
GCPパッケージ
google-cloud-kmsが必要GCP KMSキーに
ENCRYPTおよびDECRYPTの権限が必要
注: v1.1.0以降はNode.js 22以降が必要です。それより前のNode.jsバージョンはサポートされません。
@google-cloud/kmsはバンドル済みのため、別途インストールは不要ですGCP KMSキーにはサービスアカウントに対して以下のIAM権限が必要です
Cloud KMS CryptoKey Encrypter
Cloud KMS CryptoKey Decrypter
Cloud KMS CryptoKey Public Key Viewer (非対称鍵に必要)
Cloud KMS Viewer (
cloudkms.cryptoKeys.get。初期化時のキー参照に必要)
注: v1.1.0以降はPython 3.9以降が必要です。Python 3.6~3.8を使用している場合は、
keeper-secrets-manager-storage-gcp-kms<1.1.0にバージョンを固定してください。
google-cloud-kmsパッケージが必要以下のIAM権限が必要です
Cloud KMS CryptoKey Encrypter
Cloud KMS CryptoKey Decrypter
Cloud KMS CryptoKey Public Key Viewer
Cloud KMS Viewer (
cloudkms.cryptoKeys.get。初期化時のキー参照に必要)
GCP KMSキーに
ENCRYPTおよびDECRYPTの権限が必要
セットアップ
1. モジュールのインストール
GradleまたはMavenを使用してプロジェクトをセットアップ
Gradle
Maven
npmを使用してシークレットマネージャーとGoogle Cloud Key Managementモジュール統合をインストールします。
シークレットマネージャーGoogle Cloud Key Managementモジュールは、pipを使用してインストールできます。
シークレットマネージャーのGoogle Cloud Key Managementモジュールは、.NETのNuGetパッケージマネージャーを使用してインストールできます。
シークレットマネージャーのGoogle Cloud Key Managementモジュール統合は、以下を使用してインストールできます。
2. Google CKM接続を構成
Google Cloud Platform (GCP) で安全に認証を行うには、JSON形式のサービスアカウントキーを作成します。この認証情報ファイルは、GCPのサービスとプログラム経由でやり取りする際の認証手段として使用されます。
3. コードにGCPキーボルトストレージを追加
GCP接続の設定が完了したら、統合機能を使ってKSM構成を暗号化および復号化するためのキーを取得できます。また、シークレットマネージャーSDKに、KMSをストレージとして使用するよう指示する必要があります。
GCPキーボルト統合の使用
セットアップが完了すると、シークレットマネージャーのGCPキー・ボールト統合は、シークレットマネージャーSDKのすべての機能に対応します。KSM構成ファイルを暗号化・復号化するには、コードからGCPのCKMキーへアクセスできる必要があります。
指定した接続認証情報の使用
この操作を行うには、GcpKeyValueStorage インスタンスを作成し、それを SecretManagerOptions のコンストラクタに渡します。
GcpKeyValueStorage には、シークレットマネージャーの構成ファイル名、GCP認証情報ファイル、およびCloud Key Managementのキー情報が必要です。
この操作を行うには、SecretsManager のコンストラクタで GCPKeyValueStorage をシークレットマネージャーのストレージとして使用します。
このストレージには、keyConfig、GCPKSMClient によって生成される gcpsessionConfig、およびGCP Cloud Key Managementで暗号化されるシークレットマネージャー構成ファイル名が必要です。
構成ファイルのパスは、GCPKeyValueStorage に渡す構成パスの引数、環境変数 KSM_CONFIG_FILE、カレントディレクトリの client-config.json の順に調べ、最初に空でない値が使われます。空白のみの値は未設定として扱われます。
構成ファイルだけでなく、そのディレクトリにも書き込み権限が必要です。書き込み時には構成ファイルと同じディレクトリに一時ファイルを作成し、それをリネームして配置します。構成ファイルの書き込みはファイルモード 0600 で行われ、新規作成される構成ディレクトリは 0700 になります。LinuxとmacOSでは、init() と decryptConfig() も、アプリケーションを実行しているユーザー以外が所有する構成ファイル (root所有のファイルは許可されます) や、0664 や 0666 のようにグループまたは他ユーザーに書き込み権限があるモードの構成ファイルの読み取りを拒否します。umask 002 の環境でバージョン1.0.0が作成した構成ファイルはモード 0664 になるため、現在は失敗します。一方 0644 は通過します。エラーにはファイルのパスが示されます。ファイルを 0600 に設定し、アプリケーションを実行しているアカウントがそのファイルを所有していることを確認してください。WindowsではNode.jsがPOSIXのファイルモードを適用しないため、これらのモードは影響せず、構成ファイルの読み取り時に所有者やモードのチェックは行われません。代わりに、WindowsのACLで構成ディレクトリへのアクセスを制限してください。構成パスのシンボリックリンクはWindowsでも引き続き拒否されますが、このチェックはファイルを開く直前に実行されるため、チェックとオープンの間でリンクを差し替えられると検出できません。構成ファイルを置き換えられる者は誰でもこの競合に勝てるため、構成ディレクトリへの書き込み権限を持つユーザーを制限してください。保存時に別のプロセスが構成ファイルを開いている場合、Windowsでは EPERM、EACCES、EBUSY のいずれかのエラーで保存に失敗します。既存の構成ファイルはそのまま残り、エラーがコード側に返されるため、保存を再試行してください。
他のメソッドを呼び出す前に、init() を1回呼び出し、その完了を待ってください。init() が完了するまでは、decryptConfig() を含む他の公開メソッドはすべて init() の呼び出しを促すエラーで失敗し、init() に失敗したインスタンスはそのまま使用不能になります。構成ファイルの内容が null や配列、数値、文字列以外の値を含むオブジェクトなど、文字列値だけのオブジェクトでないJSONの場合も、init() は失敗し、ファイルは変更されません。その場合は、バックアップからファイルを復元するか、ファイルを削除して新しい構成を作成してください。
この操作を行うには、SecretsManager のコンストラクタで GCPKeyValueStorage をシークレットマネージャーのストレージとして使用します。
このストレージには、GCPKeyConfig によって生成される gcp_key_config、GCPKMSClientConfig によって生成される gcp_session_config オブジェクト、GCP Cloud Key Managementによって暗号化されるシークレットマネージャー構成ファイルの名前が必要です。
この操作を行うには、SecretsManager のコンストラクタで GCPKeyValueStorage をシークレットマネージャーのストレージとして使用します。
このストレージには、GCPKeyConfigによって生成される keyConfig、GCPKMSClient によって生成される gcpSessionConfig オブジェクト、そしてGCP Cloud Key Managementによって暗号化されるシークレットマネージャー構成ファイルの名前が必要です。
この操作を行うには、NewSecretsManager で NewGCPKeyVaultStorage をシークレットマネージャーのストレージとして使用します。
NewGCPKeyVaultStorage は、GCP Cloud Key Management を使用してKSM構成を暗号化するために、以下のパラメータを必要とします。
ksmConfigFileName: KSM構成ファイルのファイル名keyResourceName: Google Cloud Key ManagementのkeyResourceNameを指定credentialFileWithPath: GCP認証情報ファイルのパスとファイル名を指定
アプリケーション既定認証情報の利用
gcloud auth application-default login、GOOGLE_APPLICATION_CREDENTIALS 環境変数の設定、またはサービスアカウントがアタッチされたGCPコンピュートインスタンス上で実行している場合は、認証情報ファイルを省略できます。
または、サービスアカウントのメールと秘密鍵をファイルなしで直接渡します。
gcloud auth application-default login、GOOGLE_APPLICATION_CREDENTIALS 環境変数の設定、またはサービスアカウントがアタッチされたGCPコンピュートインスタンス上で実行している場合は、認証情報ファイルを省略できます。
または、サービスアカウントのメールと秘密鍵をファイルなしで直接渡します。
追加オプション
キーの変更
KSM構成の暗号化に使用するキーは変更可能です。以下の例では、そのキーを使用するために必要なコードを示しています。
構成を復号化する
現在の実装を別のクラウドに移行する場合や、生の認証情報を取り出したい場合は、構成ファイルを復号化できます。この関数はブール値を受け取り、true に設定すると復号された構成をファイルに保存し、false の場合は復号された構成を返すだけになります。
暗号化された構成に戻すには、同じパスを指定して新しい GCPKeyValueStorage を作成し、その .init() を呼び出します。loadConfig() が平文の構成ファイルを検出し、init() が返る前にその場で再暗号化します。decryptConfig(true) を呼び出したインスタンスで再度 init() を呼び出さないでください。そのインスタンスはファイルを再暗号化しないため、ファイルは平文のまま残ります。
最終更新

