# 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 Cloud Infrastructure (OCI) ボルトと統合し、Keeperシークレットマネージャーの構成ファイルを保護できます。この統合により、マシン上の接続情報を保護しつつ、すべてのシークレット認証情報についてKeeperのゼロ知識暗号化を活用できます。

## 機能

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

## 要件

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

* [Java/Kotlin用シークレットマネージャーSDK](/keeperpam/jp/secrets-manager/developer-sdk-library/java-sdk.md)に対応
* 必要となる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)
* OCIキーに `ENCRYPT` および `DECRYPT` の[権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が必要
  {% endtab %}

{% tab title="JavaScript" %}

* [JavaScript用シークレットマネージャーSDKに対応](/keeperpam/jp/secrets-manager/developer-sdk-library/javascript-sdk.md)
* `oci-keymanagement` は同梱されているため、別途インストールは不要です。
* OCI KMSキーに `ENCRYPT` および `DECRYPT` の[権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が必要
  {% endtab %}

{% tab title="Python" %}

* [Python用シークレットマネージャーSDKに対応](/keeperpam/jp/secrets-manager/developer-sdk-library/python-sdk.md)
* [`oci`](https://pypi.org/project/oci/) パッケージが必要です。
* 使用するユーザー認証情報には、OCIボルトの[権限](https://docs.oracle.com/en-us/iaas/Content/Identity/policyreference/keypolicyreference.htm#permissions)が必要です。
  {% endtab %}

{% tab title=".Net" %}

* [.NET用シークレットマネージャーSDKに対応](/keeperpam/jp/secrets-manager/developer-sdk-library/.net-sdk.md)
* [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 %}
  {% 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-databind</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` を使用して、シークレットマネージャーのOCIボルト連携モジュールをインストールします。

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

{% endtab %}

{% tab title="Python" %}
シークレットマネージャーのOCIボルト連携モジュールは、`pip` でインストールできます。

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

OCIボルト連携を使うには、`oci` が前提パッケージとして必要です。次のコマンドで `pip` によりローカル環境にインストールします。

```bash
pip3 install oci
```

{% endtab %}

{% tab title=".Net" %}
シークレットマネージャーのOCIボルト連携モジュールは、.NETのNuGetパッケージマネージャーでインストールできます。

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

{% endtab %}
{% endtabs %}

### 2. OCIボルト接続の構成

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

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

または、OCIボルトにアクセスするための情報を含め、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. コードにOCIボルトストレージを追加

OCIボルト接続の構成が済んだら、OCIボルト連携でKSM構成の暗号化・復号ができます。シークレットマネージャーSDKでは、ストレージとしてOCIボルトを指定します。

## OCIボルト連携の利用

セットアップ後は、OCIボルト連携によりシークレットマネージャー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` コンストラクタで `OciKeyValueStorage` をシークレットマネージャーのストレージとして使用します。

ストレージには、OCIの構成ファイルのパス、複数プロファイルがある場合のOCI構成プロファイル名、OCI KMSのCryptoエンドポイントとManagementエンドポイント、およびOCIボルトで暗号化するシークレットマネージャー構成ファイル名が必要です。

```javascript
import { getSecrets, initializeStorage } from "@keeper-security/secrets-manager-core";
import { OCISessionConfig, OciKeyValueStorage, LoggerLogLevelOptions } from "@keeper-security/secrets-manager-oracle-kv";

const getKeeperRecordsOCI = async () => {
    const oracleConfigFileLocation = "/home/<user>/.oci/config";
    const oracleProfile = "DEFAULT";
    const kmsCryptoEndpoint = "https://<id>-crypto.kms.<region>.oraclecloud.com";
    const kmsManagementEndpoint = "https://<id>-management.kms.<region>.oraclecloud.com";
    const ociSessionConfig = new OCISessionConfig(oracleConfigFileLocation, oracleProfile, kmsCryptoEndpoint, kmsManagementEndpoint);
    const logLevel = LoggerLogLevelOptions.info;
    const configPath = "<path_to_client-config.json>";

    // oneTimeToken is used only once to initialize the storage
    // after the first run, subsequent calls will use the encrypted config file
    const oneTimeToken = "<one_time_token>";

    const keyId = "ocid1.key.oc1.iad.<unique_id>";
    const keyVersionId = "ocid1.keyversion.oc1.iad.<unique_id>";

    const storage = await new OciKeyValueStorage(keyId, keyVersionId, configPath, ociSessionConfig, logLevel).init();
    await initializeStorage(storage, oneTimeToken);

    const { records } = await getSecrets({ storage: storage });
    const firstRecord = records[0];
    const password = firstRecord.data.fields.find((x) => x.type === "password");
    console.log(password.value[0]);
};
getKeeperRecordsOCI();

```

{% endtab %}

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

ストレージには、OCIキーID、キーバージョンID、KMSのCryptoエンドポイントとManagementエンドポイント、OCI構成ファイルのパス、構成プロファイル、およびOCIボルトで暗号化するシークレットマネージャー構成ファイル名が必要です。あわせて次のとおりOCIセッションを構成します。

```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://<id>-crypto.kms.<region>.oraclecloud.com"
kms_management_endpoint = "https://<id>-management.kms.<region>.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` をシークレットマネージャーのストレージとして使用します。

ストレージには、OCIキーID、キーバージョンID、KMSのCryptoエンドポイントとManagementエンドポイント、OCI構成ファイルのパス、構成プロファイル、およびOCIボルトで暗号化するシークレットマネージャー構成ファイル名が必要です。あわせて次のとおりOCIセッションを構成します。

```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 Main()
    {
        var ociConfigFileLocation = "<path_to_oci_config>";
        var profile = "DEFAULT";
        var kmsCryptoEndpoint = "https://<id>-crypto.kms.<region>.oraclecloud.com";
        var kmsManagementEndpoint = "https://<id>-management.kms.<region>.oraclecloud.com";
        var ociSessionConfig = new OciSessionConfig(ociConfigFileLocation, profile, kmsCryptoEndpoint, kmsManagementEndpoint);

        var path = "ksm_config.json";
        string keyId = "<oci_key_id>";
        string keyVersionId = "<oci_key_version_id>";

        var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.SetMinimumLevel(LogLevel.Debug);
            builder.AddConsole();
        });
        var logger = loggerFactory.CreateLogger<OracleKeyValueStorage>();
        var storage = new OracleKeyValueStorage(keyId, keyVersionId, path, ociSessionConfig, logger);

        var oneTimeToken = "<one_time_token>";
        SecretsManagerClient.InitializeStorage(storage, oneTimeToken);

        var options = new SecretsManagerOptions(storage);
        var records = await SecretsManagerClient.GetSecrets(options);
        records.Records.ToList().ForEach(record =>
            Console.WriteLine(record.RecordUid + " - " + record.Data.title));
    }
}
```

{% endtab %}
{% endtabs %}

## 追加オプション

### キーの変更

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

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

<pre class="language-java"><code class="lang-java"><strong>//The method changeKey(keyID, keyVersion) will be used to encrypt the KSM config file with new Key and version. 
</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" %}

```javascript
// To change the OCI Vault key used for encryption, call the changeKey method on the OciKeyValueStorage instance.
const newKeyId = "ocid1.key.oc1.iad.<new_unique_id>";
const newKeyVersionId = "ocid1.keyversion.oc1.iad.<new_unique_id>";
const storage = await new OciKeyValueStorage(keyId, keyVersionId, configPath, ociSessionConfig).init();
await storage.changeKey(newKeyId, newKeyVersionId);
```

{% 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(f"Key is changed: {isChanged}")
```

{% endtab %}

{% tab title=".Net" %}

```csharp
// To change the OCI Vault key used for encryption, call ChangeKeyAsync on the OracleKeyValueStorage instance.
var storage = new OracleKeyValueStorage(keyId, keyVersionId, path, ociSessionConfig, logger);
string newKeyId = "<new_oci_key_id>";
string newKeyVersionId = "<new_oci_key_version_id>";
await storage.ChangeKeyAsync(newKeyId, newKeyVersionId, null);
```

{% endtab %}
{% endtabs %}

### 構成の復号化

別のクラウドプロバイダーへ移行する場合や、平文の認証情報を取得するために構成ファイルを復号できます。復号した構成をファイルに書き戻すには `true`、ファイルを変更せず平文だけ取得するには `false` を渡します。

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

```java
OracleKeyValueStorage oracleKeyValueStorage = new OracleKeyValueStorage(configFileLocation, profile, oracleSessionConfig);
oracleKeyValueStorage.decryptConfig(false); // Set false as a parameter to extract only plaintext.
//OR 
oracleKeyValueStorage.decryptConfig(true); // Set true as a parameter to extract plaintext and save config as a plaintext.
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const storage = await new OciKeyValueStorage(keyId, keyVersionId, configPath, ociSessionConfig).init();

// Returns plaintext only (file stays encrypted)
const plaintext = await storage.decryptConfig(false);

// OR: returns plaintext and saves config as plaintext
const saved = 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)

# Returns plaintext only (file stays encrypted)
plaintext = storage.decrypt_config(False)
print(plaintext)

# OR: returns plaintext and saves config as plaintext
plaintext = storage.decrypt_config(True)
print(plaintext)
```

{% endtab %}

{% tab title=".Net" %}

```csharp
// To decrypt the config file and revert to plaintext, call DecryptConfigAsync on the OracleKeyValueStorage instance.
var conf = await storage.DecryptConfigAsync(false); // Returns plaintext only
Console.WriteLine(conf);
// OR
var conf = await storage.DecryptConfigAsync(true); // Returns plaintext and saves config as plaintext
Console.WriteLine(conf);
```

{% endtab %}
{% endtabs %}

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/oracle-key-vault.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
