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

Keeperシークレットマネージャーは、Oracle Key Vaultと統合することで、Keeperシークレットマネージャーの構成ファイルを保護できます。この統合により、ローカル環境の接続情報を安全に守りながら、すべてのシークレット情報をゼロ知識暗号化で保護するKeeperのセキュリティ機能を活用できます。
機能
Keeperシークレットマネージャーの構成ファイルをOracle Key Vaultで暗号化・復号化
シークレットマネージャーの接続情報への不正アクセスを防止
コードの最小限の変更で導入可能。すべてのKeeperシークレットマネージャーSDK機能と互換性あり
要件
GCP CKMキーに
ENCRYPT
およびDECRYPT
の権限が必要
JavaScript用シークレットマネージャーSDKに対応
OCI SDK の
oci-keymanagement
パッケージが必要GCP CKMキーに
ENCRYPT
およびDECRYPT
の権限が必要
.NET用シークレットマネージャーSDKに対応
ENCRYPT
およびDECRYPT
の権限が必要
GoLang用シークレットマネージャーSDKに対応
OCI SDKからoci-keymanagementパッケージが必要
GCP CKMキーに
ENCRYPT
およびDECRYPT
の権限が必要
セットアップ
1. モジュールのインストール
GradleまたはMavenを使用してプロジェクトをセットアップ
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("com.keepersecurity.secrets-manager:oracle:1.0.0")
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")
}
Maven
<!-- 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>
npm
を使用してシークレットマネージャーのOracle Key Vaultモジュールをインストールします。
npm install @keeper-security/secrets-manager-oracle-kv
シークレットマネージャーOCI KSMモジュールは、pipを使用してインストールできます。
pip3 install keeper-secrets-manager-storage-oracle-kms
Oracle Key Vault統合を使用するには、oci
が前提パッケージとして必要です。以下のコマンドで、pip
を使ってローカル環境にインストールしてください。
pip3 install oci
シークレットマネージャーのOracle KSMモジュールは、.NETのNuGetパッケージマネージャーを使用してインストールできます。
dotnet add package Keeper.SecretsManager.OracleKeyManagement
シークレットマネージャーのOracle KSMモジュール統合は、以下の方法でインストールできます。
go get github.com/keeper-security/secrets-manager-go/integrations/oracle
2. Oracle KVの接続を構成
Oracle Key Vault インスタンスが利用可能であること、そしてそのOCID (Oracle Cloud Identifier) を把握していることを確認してください。なお、oci key management
ライブラリはデフォルトで~/.oci/config
にあるOCI設定ファイルを使用します。
Oracleキーのセットアップの詳細については、Oracleの公式ドキュメントをご参照ください。
または、Oracle Key Vault にアクセスするための情報を含め、OCI環境に適した設定を追加する必要があります。
設定ファイルは以下のようになります (実際の情報に置き換えてください)
[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
3. コードにOracle Key Vaultストレージを追加
Oracleとの接続が設定されると、統合機能を使ってKSM構成を暗号化および復号化するためのキーを取得できます。あわせて、シークレットマネージャーSDKにKMSをストレージとして使用するよう指示する必要があります。
Oracle Key Vault統合の使用
セットアップが完了すると、Oracle Key Vaultとの統合により、シークレットマネージャーSDKのすべての機能がそのまま使えるようになります。KSM構成ファイルの暗号化や復号化を行うには、コードがOCIキーにアクセスできる必要があります。 指定された接続認証情報の使用
この操作を行うには、まず OracleKeyValueStorage
インスタンスを作成し、それを SecretManagerOptions
コンストラクタに渡します。
OracleKeyValueStorage
には、プロファイルと構成が記載されたシークレットマネージャーの構成ファイル名が必要です。
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());
}
}
}
この操作を行うには、SecretsManager
コンストラクタで、OracleKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
OracleKeyValueStorage
を使用する際には、以下の情報が必要です:
Oracleの構成ファイルのパス
複数のプロファイルがある場合は使用するOracle構成プロファイル名
Oracle KMSの暗号化エンドポイント (Cryptoエンドポイント)
Oracle KMSの管理エンドポイント (Managementエンドポイント)
Oracle KMSで暗号化されるシークレットマネージャーの構成ファイル名
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();
この操作を行うには、SecretsManager
コンストラクタで OracleKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
OracleKeyValueStorage
を使用するには、以下の情報が必要です。
OCIキーID
キーバージョンID
KMSの暗号化 (Crypto) エンドポイント
KMSの管理 (Management) エンドポイント
Oracleの構成ファイルのパス
使用するOracle構成プロファイル名 (複数プロファイルがある場合)
Oracle KMSによって暗号化されるシークレットマネージャー構成ファイル名
以下に示すOCIセッション構成情報
これらを正しく設定することで、Oracle Key Vaultとの安全な統合が可能になります。
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)
この操作を行うには、SecretsManager
コンストラクタで OracleKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
OracleKeyValueStorage
を利用するには、以下の情報が必要です。
OCIキーID
キーバージョンID
KMS暗号化 (Crypto) エンドポイント
KMS管理 (Management) エンドポイント
Oracle構成ファイルのパス
使用するOracle構成プロファイル名 (複数プロファイルがある場合)
Oracle KMSによって暗号化されるシークレットマネージャー構成ファイル名
以下に示すOCIセッション設定
これらの情報を用いてOracleKeyValueStorage
を初期化し、SecretsManager
に渡すことで、Oracle Key Vaultをストレージとして使用することができます。
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();
}
}
この操作を行うには、SecretsManager
コンストラクタでNewOracleKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
NewOracleKeyValueStorage
を使用してKSM構成をOracle Vaultで暗号化するには、以下のパラメータが必要です:
ksmConfigFileName
: KSM構成ファイルのファイル名keyConfig
: Oracleキーの認証情報 (KeyID
とKeyVersionID
)oracleConfig
: Oracle Vaultの接続情報 (VaultManagementEndpoint
とVaultCryptoEndpoint
)
なお、oci-keymanagement
ライブラリはデフォルトで~/.oci/config
にあるOCI構成ファイルを使用します。必要に応じてカスタマイズも可能です。
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())
}
}
}
追加オプション
キーの変更
KSM構成の暗号化に使用するキーを変更することも可能です。以下の例は、そのために必要なコードとなります。
//`changeKey(keyID, keyVersion)` メソッドを使用すると、新しいキーIDとバージョンでKSM構成ファイルを再暗号化できます。
String newKeyID = "<new Key ID>";
String newKeyVersion = "<New Key Version>";
OracleKeyValueStorage oracleKeyValueStorage = new OracleKeyValueStorage(configFileLocation, profile, oracleSessionConfig);
oracleKeyValueStorage.changeKey(newKeyID, newKeyVersion); // Change the key for encryption/decryption
// 暗号化に使用するOracle KMSキーを変更するには、`OciKeyValueStorage` インスタンスで `changeKey` メソッドを呼び出します。
const storage = await new OciKeyValueStorage(keyId, keyVersionId, configPath, ociSessionConfig).init();
await storage.changeKey(keyId2, keyVersionId2);
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)
// 暗号化に使用する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 );
// Oracleの構成情報を変更せずにキーだけを変更したい場合は、`oracle config` の代わりに `nil` を渡してください。
updatedKeyConfig := &oraclekv.KeyConfig{
KeyID: "ocid1.key.oc1.<>.<>.<>",
KeyVersionID: "ocid1.keyversion.oc1.<>.<>.<>.<>",
}
isChanged, err := cfg.ChangeKey(updatedKeyConfig, nil)
構成の復号化
現在の実装を別のクラウド環境に移行する場合や、生の認証情報を取得したい場合は、構成を復号することができます。この関数は真偽値 (boolean) を受け取り、true
にすると復号した構成をファイルに保存し、false
の場合は復号された構成をそのまま返します。
OracleKeyValueStorage oracleKeyValueStorage = new OracleKeyValueStorage(configFileLocation, profile, oracleSessionConfig);
oracleKeyValueStorage.decryptConfig(false); // 平文のみを抽出するには、パラメーターに false を指定します。
print(plaintext)
//OR
oracleKeyValueStorage.decryptConfig(true); // 平文を抽出し、構成ファイルを平文として保存するには、パラメーターに true を指定します。
const storage = await new OciKeyValueStorage(keyId, keyVersionId, config_path, ociSessionConfig).init();
await storage.decryptConfig(true); // ファイルに保存
const decryptedConfig = await storage.decryptConfig(true); // 復号された構成が返されます
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)
//構成ファイルを復号して平文で再保存するには、`OracleKeyValueStorage` インスタンスで `DecryptConfigAsync` メソッドを呼び出します。
var conf = await oracle_storage.DecryptConfigAsync(true);
Console.WriteLine(conf);
cfg := oraclekv.NewOracleKeyVaultStorage(ksmConfigFile, keyConfig, oracleConfig)
secrets_manager := core.NewSecretsManager(
&core.ClientOptions{
Token: oneTimeToken,
Config: cfg,
},
)
// 復号された構成をKSM構成ファイルに保存したい場合は true を、保存せず復号結果のみ取得したい場合は false を渡してください。
decryptedConfig, err := cfg.DecryptConfig(true)
最終更新