# Oracle Key Vaultでの暗号化

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2F0Ynffxtmn3MnaN3Kgm3B%2Fimage.png?alt=media&#x26;token=b025ad9d-b33a-47c0-9daa-ea980ab33bb5" alt=""><figcaption></figcaption></figure>

Keeperシークレットマネージャーは、Oracle Key Vaultと統合することで、Keeperシークレットマネージャーの構成ファイルを保護できます。この統合により、ローカル環境の接続情報を安全に守りながら、すべてのシークレット情報をゼロ知識暗号化で保護するKeeperのセキュリティ機能を活用できます。

## 機能

* Keeperシークレットマネージャーの構成ファイルをOracle Key Vaultで暗号化・復号化
* シークレットマネージャーの接続情報への不正アクセスを防止
* コードの最小限の変更で導入可能。すべてのKeeperシークレットマネージャーSDK機能と互換性あり

## 要件

{% tabs %}
{% tab title="Java" %}

* [Java/Kotlin用シークレットマネージャーSDK](https://docs.keeper.io/keeperpam/secrets-manager/developer-sdk-library/java-sdk)に対応
* 必要となるOracleパッケージ: [oci-java-sdk-keymanagement](https://mvnrepository.com/artifact/com.oracle.oci.sdk/oci-java-sdk-keymanagement)、[oci-java-sdk-common](https://mvnrepository.com/artifact/com.oracle.oci.sdk/oci-java-sdk-common)、[oci-java-sdk-common-httpclient-jersey](https://mvnrepository.com/artifact/com.oracle.oci.sdk/oci-java-sdk-common-httpclient-jersey)
* GCP CKMキーに`ENCRYPT`および`DECRYPT`の[権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が必要
  {% endtab %}

{% tab title="JavaScript" %}

* JavaScript用シークレットマネージャーSDKに対応
* OCI SDK の[`oci-keymanagement`](https://www.npmjs.com/package/oci-keymanagement)パッケージが必要
* GCP CKMキーに`ENCRYPT`および`DECRYPT`の[権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が必要
  {% endtab %}

{% tab title="Python" %}

* Python用シークレットマネージャーSDKに対応
* `oci`[パッケージ](https://pypi.org/project/oci/)が必要です。
* 使用するユーザー認証情報には、Key Vaultへの[アクセス権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が付与されている必要があります。
  {% endtab %}

{% tab title=".Net" %}

* .NET用シークレットマネージャーSDKに対応
* [OCI.DotNetSDK.Keymanagement](https://www.nuget.org/packages/OCI.DotNetSDK.Keymanagement)が必要
* `ENCRYPT`および`DECRYPT`の[権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が必要
  {% endtab %}

{% tab title="GoLang" %}

* GoLang用シークレットマネージャーSDKに対応
* OCI SDKから[oci-keymanagement](https://pkg.go.dev/github.com/oracle/oci-go-sdk/keymanagement)パッケージが必要
* GCP CKMキーに`ENCRYPT`および`DECRYPT`の[権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が必要
  {% endtab %}
  {% endtabs %}

## セットアップ

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

{% tabs %}
{% tab title="Java" %}
GradleまたはMavenを使用してプロジェクトをセットアップ

**Gradle**

<pre><code>repositories {
  mavenCentral()
}

dependencies {
<strong>  implementation("com.keepersecurity.secrets-manager:oracle:1.0.0")
</strong>  implementation("com.keepersecurity.secrets-manager:core:17.0.0")
  implementation("com.oracle.oci.sdk:oci-java-sdk-keymanagement:3.60.0")
  implementation("com.oracle.oci.sdk:oci-java-sdk-common-httpclient-jersey:3.60.0") // or the latest version
  implementation("com.oracle.oci.sdk:oci-java-sdk-common:3.60.0")
  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-simple:2.0.16")
  implementation("org.bouncycastle:bc-fips:1.0.2.4")
}
</code></pre>

**Maven**

```xml
<!-- KMS-core -->
    <dependency>
     <groupId>com.keepersecurity.secrets-manager</groupId>
     <artifactId>oracle</artifactId>
     <version>1.0.0</version>
    </dependency>
    <dependency>
     <groupId>com.keepersecurity.secrets-manager</groupId>
     <artifactId>core</artifactId>
     <version>17.0.0</version>
    </dependency>

<!-- oci-kv -->
   <dependency>
       <groupId>com.oracle.oci.sdk</groupId>
       <artifactId>oci-java-sdk-keymanagement</artifactId>
       <version>3.60.0</version>
   </dependency>
   <dependency>
       <groupId>com.oracle.oci.sdk</groupId>
       <artifactId>oci-java-sdk-common-httpclient-jersey</artifactId>
       <version>3.60.0</version>
   </dependency>
   <dependency>
       <groupId>com.oracle.oci.sdk</groupId>
       <artifactId>oci-java-sdk-common</artifactId>
       <version>3.60.0</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>

   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-simple</artifactId>
       <version>2.0.16</version>
   </dependency>   	
   <!-- bc-fips -->
   <dependency>
   	<groupId>org.bouncycastle</groupId>
   	<artifactId>bc-fips</artifactId>
   	<version>1.0.2.4</version>
   </dependency>
   	
```

{% endtab %}

{% tab title="JavaScript" %}
`npm`を使用してシークレットマネージャーのOracle Key Vaultモジュールをインストールします。

```bash
npm install @keeper-security/secrets-manager-oracle-kv
```

{% endtab %}

{% tab title="Python" %}
シークレットマネージャーOCI KSMモジュールは、pipを使用してインストールできます。

```bash
pip3 install keeper-secrets-manager-storage-oracle-kms
```

Oracle Key Vault統合を使用するには、`oci` が前提パッケージとして必要です。以下のコマンドで、`pip` を使ってローカル環境にインストールしてください。

```bash
pip3 install oci
```

{% endtab %}

{% tab title=".Net" %}
シークレットマネージャーのOracle KSMモジュールは、.NETのNuGetパッケージマネージャーを使用してインストールできます。

```bash
dotnet add package Keeper.SecretsManager.OracleKeyManagement
```

{% endtab %}

{% tab title="GoLang" %}
シークレットマネージャーのOracle KSMモジュール統合は、以下の方法でインストールできます。

```bash
go get github.com/keeper-security/secrets-manager-go/integrations/oracle
```

{% endtab %}
{% endtabs %}

### 2. **Oracle KVの接続を構成**

Oracle Key Vault インスタンスが利用可能であること、そしてそのOCID (Oracle Cloud Identifier) を把握していることを確認してください。なお、`oci key management`ライブラリはデフォルトで`~/.oci/config`にあるOCI設定ファイルを使用します。

{% hint style="info" %}
Oracleキーのセットアップの詳細については、[Oracleの公式ドキュメント](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm)をご参照ください。
{% endhint %}

または、Oracle Key Vault にアクセスするための情報を含め、OCI環境に適した設定を追加する必要があります。

{% hint style="info" %}
設定ファイルは以下のようになります (実際の情報に置き換えてください)

\
\[DEFAULT]\
user=ocid1.user.oc1..example\_unique\_id\
fingerprint=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx\
key\_file=/path/to/your/private/api/key.pem\
tenancy=ocid1.tenancy.oc1..example\_unique\_id\
region=us-phoenix-1
{% endhint %}

### 3. コードにOracle Key Vaultストレージを追加

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

### Oracle Key Vault統合の使用

セットアップが完了すると、Oracle Key Vaultとの統合により、シークレットマネージャーSDKのすべての機能がそのまま使えるようになります。KSM構成ファイルの暗号化や復号化を行うには、コードがOCIキーにアクセスできる必要があります。\
\
**指定された接続認証情報の使用**

{% tabs %}
{% tab title="Java" %}
この操作を行うには、まず `OracleKeyValueStorage` インスタンスを作成し、それを `SecretManagerOptions` コンストラクタに渡します。

`OracleKeyValueStorage` には、プロファイルと構成が記載されたシークレットマネージャーの構成ファイル名が必要です。

```java
import java.security.Security;
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import static com.keepersecurity.secretsManager.core.SecretsManager.initializeStorage;
import com.keepersecurity.secretmanager.oracle.kv.OracleKeyValueStorage;
import com.keepersecurity.secretmanager.oracle.kv.OracleSessionConfig;
import com.keepersecurity.secretsManager.core.SecretsManagerOptions;
import com.oracle.bmc.Region;


class Test {
	public static void main(String args[]){
		String configPath = "<~/.oci/config>";
		String cryptoEndpoint = "https://<>-crypto.kms.<oracle_cloud_region>.oraclecloud.com";
		String vaultId = "<OCI VAULT ID>";
		String keyId = "<OCI KEY ID>";
		String keyVersionId = "<OCI KEY VERSION>";
		String configFileLocation = "<KSM CONFIG FILE LOCATION>";
		String profile = "<OCI CONFIG PROFILE EX: DEFAULT>"; // プロファイル名
		String oneTimeToken = "<Keeper One Time Token>";
		String managementEndpoint =  "https://<>-management.kms.<oracle_cloud_region>.oraclecloud.com";
		Region region = Region.<cloud_region>;
		Security.addProvider(new BouncyCastleFipsProvider());
		try{
			//Oracle KV構成の設定 
			OracleSessionConfig oracleSessionConfig = new OracleSessionConfig(configPath, cryptoEndpoint, managementEndpoint, vaultId, keyId, keyVersionId, region);
			//ストレージを取得 
			OracleKeyValueStorage oracleKeyValueStorage = new OracleKeyValueStorage(configFileLocation, profile, oracleSessionConfig);
			initializeStorage(oracleKeyValueStorage, oneTimeToken);
			SecretsManagerOptions options = new SecretsManagerOptions(oracleKeyValueStorage);
			//getSecrets(options)
		}catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

```

{% endtab %}

{% tab title="JavaScript" %}
この操作を行うには、`SecretsManager` コンストラクタで、`OracleKeyValueStorage` をシークレットマネージャーのストレージとして使用します。

`OracleKeyValueStorage` を使用する際には、以下の情報が必要です：

* Oracleの構成ファイルのパス
* 複数のプロファイルがある場合は使用するOracle構成プロファイル名
* Oracle KMSの暗号化エンドポイント (Cryptoエンドポイント)
* Oracle KMSの管理エンドポイント (Managementエンドポイント)
* Oracle KMSで暗号化されるシークレットマネージャーの構成ファイル名

```javascript
import { OCISessionConfig, OciKeyValueStorage } from "@keeper-security/secrets-manager-oracle-kv";
    const getKeeperRecordsOCI = async () => {
        const oracleConfigFileLocation = "/home/...../.oci/config";
        const oracleProfile = "DEFAULT";
        const kmsCryptoEndpoint = "https://<>-crypto.kms.<location>.oraclecloud.com";
        const kmsManagementEndpoint = "https://<>-management.kms.<location>.oraclecloud.com";
        const ociSessionConfig = await new OCISessionConfig(oracleConfigFileLocation, oracleProfile, kmsCryptoEndpoint,kmsManagementEndpoint);
        const logLevel = LoggerLogLevelOptions.info;
        let config_path = "<Keeper config File Path>";
        const oneTimeToken = "<one time token>";
        const keyId = 'ocid1.key.oc1.iad.<>.<>';
        const keyVersionId = "ocid1.keyversion.oc1.iad.<>.<>";
        const storage = await new OciKeyValueStorage(keyId, keyVersionId, config_path, ociSessionConfig,logLevel).init();
        await initializeStorage(storage, oneTimeToken);
        const { records } = await getSecrets({ storage: storage });
        console.log(records);
        const firstRecord = records[0];
        const firstRecordPassword = firstRecord.data.fields.find((x: { type: string; }) => x.type === 'bankAccount');
        console.log(firstRecordPassword.value[0]);
    };
    console.log("start");
    getKeeperRecordsOCI();

```

{% endtab %}

{% tab title="Python" %}
この操作を行うには、`SecretsManager` コンストラクタで `OracleKeyValueStorage` をシークレットマネージャーのストレージとして使用します。

`OracleKeyValueStorage` を使用するには、以下の情報が必要です。

* OCIキーID
* キーバージョンID
* KMSの暗号化 (Crypto) エンドポイント
* KMSの管理 (Management) エンドポイント
* Oracleの構成ファイルのパス
* 使用するOracle構成プロファイル名 (複数プロファイルがある場合)
* Oracle KMSによって暗号化されるシークレットマネージャー構成ファイル名
* 以下に示すOCIセッション構成情報

これらを正しく設定することで、Oracle Key Vaultとの安全な統合が可能になります。

```python
from keeper_secrets_manager_storage_oracle_kms import OracleKeyValueStorage, OCISessionConfig
from keeper_secrets_manager_core import SecretsManager
config_file_location = "/home/<user>/.oci/config"
profile = "DEFAULT"
kms_crypto_endpoint = "https://<kmsendpoint>.oraclecloud.com"
kms_mgmt_endpoint = "https://<kmsendpoint>.oraclecloud.com"
key_id = '<key_id>'
key_version_id = "<key_version_id>"
config_path = "<path to config json>"
one_time_token = "<Keeper One Time Token>"
oci_session_config = OCISessionConfig(config_file_location, profile, kms_crypto_endpoint, kms_management_endpoint)
storage = OracleKeyValueStorage(key_id=key_id, key_version=key_version_id, config_file_location=config_path, oci_session_config=oci_session_config,logger=None)
secrets_manager = SecretsManager(one_time_token,config=storage)
all_records = secrets_manager.get_secrets()
first_record = all_records[0]
print(first_record)
```

{% endtab %}

{% tab title=".Net" %}
この操作を行うには、`SecretsManager` コンストラクタで `OracleKeyValueStorage` をシークレットマネージャーのストレージとして使用します。

`OracleKeyValueStorage` を利用するには、以下の情報が必要です。

* OCIキーID
* キーバージョンID
* KMS暗号化 (Crypto) エンドポイント
* KMS管理 (Management) エンドポイント
* Oracle構成ファイルのパス
* 使用するOracle構成プロファイル名 (複数プロファイルがある場合)
* Oracle KMSによって暗号化されるシークレットマネージャー構成ファイル名
* 以下に示すOCIセッション設定

これらの情報を用いて`OracleKeyValueStorage`を初期化し、`SecretsManager`に渡すことで、Oracle Key Vaultをストレージとして使用することができます。

```csharp
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using OracleKeyManagement;
using SecretsManager;

public class Program
{
	private static async Task getOneIndividualSecret()
	{
	   Console.WriteLine("execution started");
            bool changeKey = false;
            bool decryptConfiguration = false;
            var OCIConfigFileLocation = "location";
            var profile = "DEFAULT";
            var kmsCryptoEndpoint = "crypto_endpoint";
            var kmsManagementEndpoint = "management_endpoint";
            var ociSessionConfig1 = new OciSessionConfig(OCIConfigFileLocation, profile, kmsCryptoEndpoint, kmsManagementEndpoint); 
            var path = "oci_ksm_conf_test.json";
            string keyId1 = "key1";
            string keyId2 = "key2";
            string keyVersionId1 = "key1version";
            string keyVersionId2 = "key2version";
            
            var loggerFactory = LoggerFactory.Create(builder =>
            {
                builder.SetMinimumLevel(LogLevel.Debug);
                builder.AddConsole();
            });
            var logger = loggerFactory.CreateLogger<OracleKeyValueStorage>();
            var oracle_storage = new OracleKeyValueStorage(keyId2,keyVersionId2,path,ociSessionConfig1,logger );
            
            var dotnet_access_token = "<accesstoken>";
            SecretsManagerClient.InitializeStorage(oracle_storage, dotnet_access_token);
            if (changeKey)
            {
                oracle_storage.ChangeKeyAsync(keyId1,keyVersionId1,null).Wait();
            }
            if (decryptConfiguration)
            {
                var conf = await oracle_storage.DecryptConfigAsync(true);
                Console.WriteLine(conf);
            }
            var options = new SecretsManagerOptions(oracle_storage);
            var records_1 = await SecretsManagerClient.GetSecrets(options);
            records_1.Records.ToList().ForEach(record => Console.WriteLine(record.RecordUid + " - " + record.Data.title));
	}

	static async Task Main()
	{
		await getOneIndividualSecret();
	}
}
```

{% endtab %}

{% tab title="Go" %}
この操作を行うには、`SecretsManager`コンストラクタで`NewOracleKeyValueStorage`をシークレットマネージャーのストレージとして使用します。

`NewOracleKeyValueStorage`を使用してKSM構成をOracle Vaultで暗号化するには、以下のパラメータが必要です：

* `ksmConfigFileName`: KSM構成ファイルのファイル名
* `keyConfig`: Oracleキーの認証情報 (`KeyID` と `KeyVersionID`)
* `oracleConfig`: Oracle Vaultの接続情報 (`VaultManagementEndpoint`と`VaultCryptoEndpoint`)

なお、`oci-keymanagement`ライブラリはデフォルトで`~/.oci/config`にあるOCI構成ファイルを使用します。必要に応じてカスタマイズも可能です。

```go
package main

import (
	"encoding/json"
	"fmt"

	"github.com/keeper-security/secrets-manager-go/core"
	oraclekv "github.com/keeper-security/secrets-manager-go/integrations/oracle"
)

func main() {
	decryptConfig := true
	changeKey := true
	ksmConfigFile := ""
	oneTimeToken := "oneTimeToken"
	keyConfig := &oraclekv.KeyConfig{
		KeyID:        "ocid1.key.oc1.<>.<>.<>",
		KeyVersionID: "ocid1.keyversion.oc1.<>.<>.<>.<>",
	}
	oracleConfig := &oraclekv.OracleConfig{
		VaultManagementEndpoint: "https://<>-management.kms.<>.oraclecloud.com",
		VaultCryptoEndpoint:     "https://<>-crypto.kms.<>.oraclecloud.com",
		Profile:                 "",
		ProfileConfigPath:       "",
	}
	cfg := oraclekv.NewOracleKeyVaultStorage(ksmConfigFile, keyConfig, oracleConfig)
	secrets_manager := core.NewSecretsManager(
		&core.ClientOptions{
			Token:  oneTimeToken,
			Config: cfg,
		},
	)
	secrets, err := secrets_manager.GetSecrets([]string{})
	if err != nil {
		// 適切な処理を実行
		fmt.Printf("Error: %s\n", err)
	} else {
		for _, secret := range secrets {
			fmt.Printf("Recieved secret: %s\n", secret.Title())
		}
	}

}
```

{% endtab %}
{% endtabs %}

## 追加オプション

### キーの変更

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

{% tabs %}
{% tab title="Java" %}

<pre class="language-bash"><code class="lang-bash"><strong>//`changeKey(keyID, keyVersion)` メソッドを使用すると、新しいキーIDとバージョンでKSM構成ファイルを再暗号化できます。
</strong>
String newKeyID = "&#x3C;new Key ID>";
String newKeyVersion = "&#x3C;New Key Version>";
OracleKeyValueStorage oracleKeyValueStorage = new OracleKeyValueStorage(configFileLocation, profile, oracleSessionConfig);
oracleKeyValueStorage.changeKey(newKeyID, newKeyVersion); // Change the key for encryption/decryption
</code></pre>

{% endtab %}

{% tab title="JavaScript" %}

<pre class="language-bash"><code class="lang-bash"><strong>// 暗号化に使用するOracle KMSキーを変更するには、`OciKeyValueStorage` インスタンスで `changeKey` メソッドを呼び出します。
</strong><strong>const storage = await new OciKeyValueStorage(keyId, keyVersionId, configPath, ociSessionConfig).init();
</strong>await storage.changeKey(keyId2, keyVersionId2);
</code></pre>

{% endtab %}

{% tab title="Python" %}

```python
   storage = OracleKeyValueStorage(key_id=key_id, key_version=key_version_id, config_file_location=config_path, oci_session_config=oci_session_config,logger=None)
    
    new_key_id = "<new key id>"
    new_key_version_id = "<new key version>"
    isChanged = storage.change_key(new_key_id, new_key_version_id)
    print("Key is changed " + isChanged)
```

{% endtab %}

{% tab title=".Net" %}

```bash
// 暗号化に使用するOracle KMSキーを変更するには、`OracleKeyValueStorage` インスタンスで `ChangeKeyAsync` メソッドを呼び出します。
// ※ロギング機能を使用する場合は Microsoft.Extensions.Logging の参照が必要です。

     var loggerFactory = LoggerFactory.Create(builder =>
            {
                builder.SetMinimumLevel(LogLevel.Debug);
                builder.AddConsole();
            });
    var logger = loggerFactory.CreateLogger<OracleKeyValueStorage>();
    var oracle_storage = new OracleKeyValueStorage(keyId2,keyVersionId2,path,ociSessionConfig1,logger );
```

{% endtab %}

{% tab title="GoLang" %}

```
// Oracleの構成情報を変更せずにキーだけを変更したい場合は、`oracle config` の代わりに `nil` を渡してください。
		updatedKeyConfig := &oraclekv.KeyConfig{
			KeyID:        "ocid1.key.oc1.<>.<>.<>",
			KeyVersionID: "ocid1.keyversion.oc1.<>.<>.<>.<>",
		}
	isChanged, err := cfg.ChangeKey(updatedKeyConfig, nil)
```

{% endtab %}
{% endtabs %}

### 構成の復号化

現在の実装を別のクラウド環境に移行する場合や、生の認証情報を取得したい場合は、構成を復号することができます。この関数は真偽値 (boolean) を受け取り、`true`にすると復号した構成をファイルに保存し、`false`の場合は復号された構成をそのまま返します。

{% tabs %}
{% tab title="Java" %}

```java
OracleKeyValueStorage oracleKeyValueStorage = new OracleKeyValueStorage(configFileLocation, profile, oracleSessionConfig);
oracleKeyValueStorage.decryptConfig(false); // 平文のみを抽出するには、パラメーターに false を指定します。
print(plaintext)
//OR 
oracleKeyValueStorage.decryptConfig(true); // 平文を抽出し、構成ファイルを平文として保存するには、パラメーターに true を指定します。
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
 const storage = await new OciKeyValueStorage(keyId, keyVersionId, config_path, ociSessionConfig).init();
 await storage.decryptConfig(true); // ファイルに保存
 const decryptedConfig = await storage.decryptConfig(true); // 復号された構成が返されます
```

{% endtab %}

{% tab title="Python" %}

```python
 storage = OracleKeyValueStorage(key_id=key_id, key_version=key_version_id, config_file_location=config_path, oci_session_config=oci_session_config,logger=None)
 storage.decrypt_config(True)
```

{% endtab %}

{% tab title=".Net" %}

```bash
//構成ファイルを復号して平文で再保存するには、`OracleKeyValueStorage` インスタンスで `DecryptConfigAsync` メソッドを呼び出します。
 var conf = await oracle_storage.DecryptConfigAsync(true);
 Console.WriteLine(conf);   
```

{% endtab %}

{% tab title="GoLang" %}

```
cfg := oraclekv.NewOracleKeyVaultStorage(ksmConfigFile, keyConfig, oracleConfig)
	secrets_manager := core.NewSecretsManager(
		&core.ClientOptions{
			Token:  oneTimeToken,
			Config: cfg,
		},
	)
// 復号された構成をKSM構成ファイルに保存したい場合は true を、保存せず復号結果のみ取得したい場合は false を渡してください。
decryptedConfig, err := cfg.DecryptConfig(true) 
```

{% endtab %}
{% endtabs %}

{% hint style="success" %}
KSM統合機能を使用する準備ができました。
{% endhint %}

{% hint style="info" %}
その他の例と機能については、[KSM SDKのドキュメント](https://docs.keeper.io/keeperpam/secrets-manager/developer-sdk-library)をご参照ください。
{% endhint %}
