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 CKMキーにENCRYPTおよびDECRYPTの権限が必要

セットアップ

1. モジュールのインストール

GradleまたはMavenを使用してプロジェクトをセットアップ

Gradle

repositories {
  mavenCentral()
}

dependencies {
	implementation("com.keepersecurity.secrets-manager:core:17.0.0")
	implementation("com.keepersecurity.secrets-manager:gcp:1.0.0")
	implementation ("com.google.cloud:google-cloud-kms:2.62.0")
	implementation ("com.google.auth:google-auth-library-oauth2-http:1.33.1") 
	implementation("com.fasterxml.jackson.core:jackson-databind:2.18.2")
	implementation("com.fasterxml.jackson.core:jackson-core:2.18.2")
	implementation("com.google.code.gson:gson:2.12.1")
    implementation("org.slf4j:slf4j-api:1.7.32"){
        exclude("org.slf4j:slf4j-log4j12")
    }
	implementation("ch.qos.logback:logback-classic:1.2.6")
	implementation("ch.qos.logback:logback-core:1.2.6")
	implementation("org.bouncycastle:bc-fips:1.0.2.4")
}

Maven

<!-- KMS-core -->
<dependency>
	<groupId>com.keepersecurity.secrets-manager</groupId>
	<artifactId>core</artifactId>
	<version>[17.0.0,)</version>
</dependency>
<dependency>
	<groupId>com.keepersecurity.secrets-manager</groupId>
	<artifactId>gcp</artifactId>
	<version>1.0.0</version>
</dependency>
<!-- gcp-kms -->
<dependency>
	<groupId>com.google.cloud</groupId>
	<artifactId>google-cloud-kms</artifactId>
	<version>2.62.0</version>
</dependency>
<!-- gcp auth -->
<dependency>
	<groupId>com.google.auth</groupId>
	<artifactId>google-auth-library-oauth2-http</artifactId>
	<version>1.33.1</version>
</dependency>
<!--gson -->
<dependency>
	<groupId>com.google.code.gson</groupId>
	<artifactId>gson</artifactId>
	<version>2.12.1</version>
</dependency>
<!--jackson-core -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-core</artifactId>
	<version>2.18.2</version>
</dependency>
<!--jackson-databind -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-core</artifactId>
	<version>2.18.2</version>
</dependency>
<!-- slf4j-api -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.32</version>
	<scope>runtime</scope>
</dependency>
<!-- logback-classic -->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.6</version>
	<scope>compile</scope>
</dependency>
<!-- logback-core -->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
	<version>1.2.6</version>
	<scope>compile</scope>
</dependency>
<!-- bc-fips -->
<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bc-fips</artifactId>
	<version>1.0.2.4</version>
</dependency>

2. Google CKM接続を構成

Google Cloud Platform (GCP) で安全に認証を行うには、JSON形式のサービスアカウントキーを作成します。この認証情報ファイルは、GCPのサービスとプログラム経由でやり取りする際の認証手段として使用されます。

キーの生成の詳細については、Googleのドキュメントをご参照ください。

3. コードにGCPキーボルトストレージを追加

GCP接続の設定が完了したら、統合機能を使ってKSM構成を暗号化および復号化するためのキーを取得できます。また、シークレットマネージャーSDKに、KMSをストレージとして使用するよう指示する必要があります。

GCPキーボルト統合の使用

セットアップが完了すると、シークレットマネージャーのGCPキー・ボールト統合は、シークレットマネージャーSDKのすべての機能に対応します。KSM構成ファイルを暗号化・復号化するには、コードからGCPのCKMキーへアクセスできる必要があります。

指定した接続認証情報の使用

この操作を行うには、GcpKeyValueStorageインスタンスを作成し、それをSecretManagerOptionsのコンストラクタに渡します。

GcpKeyValueStorageには、シークレットマネージャーの構成ファイル名、GCP認証情報ファイル、およびCloud Key Managementのキー情報が必要です。

import java.security.Security;
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import static com.keepersecurity.secretsManager.core.SecretsManager.initializeStorage;
import com.keepersecurity.secretsmanager.gcp.GcpKeyValueStorage;
import com.keepersecurity.secretsmanager.gcp.GcpSessionConfig;
import com.keepersecurity.secretsManager.core.SecretsManagerOptions;
public class Test {
	public static void main(String args[]){
	    String oneTimeToken = "One_Time_Token";
	    String projectId = "projectId";
	    String location = "cloud_region";
	    String keyRing = "key_ring_name";
	    String keyId = "key_id";
	    String keyVersion = "key_version";
	    String configFileLocation = "client_config_test.json";
	    String credentialFileLocation = "<path_with_name_of_gcp_cred_file.json>";
	    Security.addProvider(new BouncyCastleFipsProvider());
		try{
				GcpSessionConfig sessionConfig = new GcpSessionConfig(projectId, location, keyRing, keyId, keyVersion, credentialFileLocation);
				GcpKeyValueStorage storage = new GcpKeyValueStorage(configFileLocation, sessionConfig);
				initializeStorage(storage, oneTimeToken);
				SecretsManagerOptions options = new SecretsManagerOptions(storage);	
		}catch (Exception e) {
				  System.out.println(e.getMessage());
		}
	}
}

追加オプション

キーの変更

KSM構成の暗号化に使用するキーは変更可能です。以下の例では、そのキーを使用するために必要なコードを示しています。

//The method changeKey(keyID) will be used to encrypt the KSM config file with new Key and version. 
GcpKeyValueStorage storage = new GcpKeyValueStorage(configFileLocation, sessionConfig);
String newKeyID = "<new Key ID>";
boolean isChanged = storage.changeKey(keyId);
System.out.println("Key Changed: "+isChanged); // 暗号化および復号に使用するキーを変更します。

構成を復号化する

現在の実装を別のクラウドに移行する場合や、生の認証情報を取り出したい場合は、構成ファイルを復号化できます。この関数はブール値を受け取り、trueに設定すると復号された構成をファイルに保存し、falseの場合は復号された構成を返すだけになります。

GcpKeyValueStorage storage = new GcpKeyValueStorage(configFileLocation, sessionConfig);
storage.decryptConfig(false); // 平文のみを抽出するには、パラメーターに false を指定します。
//または 
storage.decryptConfig(true); // 平文を抽出し、構成ファイルを平文として保存するには、パラメーターに true を指定します。

その他の例と機能については、KSM SDKのドキュメントをご参照ください。

最終更新