AWS KMSでの暗号化
AWS KMSでシークレットマネージャー接続の詳細情報を保護
最終更新
AWS KMSでシークレットマネージャー接続の詳細情報を保護
最終更新
Keeperシークレットマネージャーは、AWS KMSと統合することで、Keeperシークレットマネージャーの構成ファイルを暗号化できます。この統合により、マシン上の接続情報を保護しながら、すべてのシークレット認証情報に対してKeeperのゼロ知識暗号化を活用できます。
AWS KMS を使用して、Keeperシークレットマネージャーの構成ファイルを暗号化および復号化
シークレットマネージャーの接続情報への不正アクセスを防止
わずかなコード変更で即座に保護を実現。すべてのKeeperシークレットマネージャーSDK機能と互換性あり
GradleまたはMavenを使用してプロジェクトをセットアップ
Gradle
repositories {
mavenCentral()
}
dependencies {
implementation("com.keepersecurity.secrets-manager:aws:1.0.0")
implementation("com.keepersecurity.secrets-manager:core:17.0.0")
implementation ("software.amazon.awssdk:kms:2.20.28")
implementation ("software.amazon.awssdk:auth:2.20.28")
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>aws</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.keepersecurity.secrets-manager</groupId>
<artifactId>core</artifactId>
<version>17.0.0</version>
</dependency>
<!-- aws-kms -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>kms</artifactId>
<version>2.20.28</version>
</dependency>
<!-- aws-auth -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
<version>2.20.28</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>
npmを使用してシークレットマネージャー とAWS KMS統合をインストールします。
npm install @keeper-security/secrets-manager-aws
シークレットマネージャーのHSMモジュールは、Keeperシークレットマネージャーのストレージモジュールに含まれており、以下のコマンドでインストールできます。
pip3 install keeper-secrets-manager-storage
AWS KMS統合には事前にboto3
が必要です。以下のコマンドでマシンにインストールしてください。
pip install boto3
以下のコマンドでシークレットマネージャーとAWS KMSの統合をインストールします。
dotnet add package Keeper.SecretsManager.AWSKeyManagement
以下のコマンドでシークレットマネージャーとAWS KMSの統合をインストールします。
go get github.com/keeper-security/secrets-manager-go/integrations/aws
デフォルトでは、boto3ライブラリは、aws configure
コマンドを使用したAWS CLIで既定の接続セッション設定を利用します。 接続の詳細情報を指定したい場合は、~/.aws/config
と~/.aws/credentials
にある2つの設定ファイルを手動で編集できます。
または、AwsSessionConfig
データクラスを使用し、aws_access_key_id
変数、aws_secret_access_key
変数、aws_session_token
変数を使用して、設定の変数をアクセスキーとして明示的に指定することもできます。
AWS KMS連携を使用するには、AWSアクセスキーが必要です。
AWS接続の構成が完了すると、KSM構成ファイルの暗号化・復号に使用するキーを連携を通じて取得できます。また、シークレットマネージャーSDKに対して、KMSをストレージとして利用するよう指定する必要があります。
指定された接続認証情報の使用
この操作を行うには、SecretsManager
コンストラクタで、AwsKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AwsSessionConfig
、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import com.keepersecurity.secretmanager.aws.kms.AwsKeyValueStorage;
import com.keepersecurity.secretmanager.aws.kms.AwsSessionConfig;
import com.keepersecurity.secretsManager.core.InMemoryStorage;
import com.keepersecurity.secretsManager.core.SecretsManager;
import com.keepersecurity.secretsManager.core.SecretsManagerOptions;
import static com.keepersecurity.secretsManager.core.SecretsManager.initializeStorage;
import software.amazon.awssdk.regions.Region;
import java.security.Security;
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
class Test {
public static void main(String args[]){
String keyId = "<Key ID>";
String awsAccessKeyId = "<AWS Access ID>";
String awsSecretAccessKey = "<AWS Secret>";
String oneTimeToken = "[One Time Token]";
Region region = Region.<cloud-region>;
String profile = null OR "DEFAULT"; //set profile (ex. DEFUALT/UAT/PROD) if ~/.aws/config is set
String configFileLocation = "client_config_test.json";
try{
//set AWS configuration, It can be null if profile is set for aws credentials
AwsSessionConfig sessionConfig = new AwsSessionConfig(awsAccessKeyId, awsSecretAccessKey);
//Get Storage
AwsKeyValueStorage awskvstorage = new AwsKeyValueStorage(keyId, configFileLocation, profile, null, region);
initializeStorage(awskvstorage, oneTimeToken);
SecretsManagerOptions options = new SecretsManagerOptions(awskvstorage);
//getSecrets(OPTIONS);
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
この操作を行うには、SecretsManager
コンストラクタで、AWSKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AWSセッション認証情報のAWSSessionConfig
、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
import { AWSKeyValueStorage, AWSSessionConfig, LoggerLogLevelOptions } from "@keeper-security/secrets-manager-aws";
import { initializeStorage, getSecrets } from "@keeper-security/secrets-manager-core";
const getKeeperRecordsAWS = async () => {
const accessKeyId = "<YOUR AWS ACCESS KEY>>";
const secretAccessKey = "<YOUR AWS SECRET_ACCESS_KEY>";
const regionName = "<YOUR AWS REGION>";
const logLevel = LoggerLogLevelOptions.Debug;
const configPath = "client-config-path.json";
const awsSessionConfig = new AWSSessionConfig(accessKeyId, secretAccessKey, regionName);
const keyId = 'arn:aws:kms:ap-south-1:<accountName>:key/<keyId>';
const storage = await new AWSKeyValueStorage(keyId, configPath, awsSessionConfig, logLevel).init();
const oneTimeToken = "<one time token>";
await initializeStorage(storage, oneTimeToken);
const { records } = await getSecrets({ storage: storage });
const firstRecord = records[0]
const firstRecordPassword = firstRecord.data.fields.find(x => x.type === 'password')
console.log(firstRecordPassword.value[0])
};
getKeeperRecordsAWS();
この操作を行うには、SecretsManager
のコンストラクタで、AwsKmsKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AwsSessionConfig
、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_hsm.storage_aws_kms import AwsKmsKeyValueStorage
aws_session_cfg = AwsSessionConfig(
aws_access_key_id="AK[...]FIF",
aws_secret_access_key="/[...]/g3",
region_name="us-east-2")
config = AwsKmsKeyValueStorage(
key_id='e9[...]567',
config_file_location='client-config.json',
aws_session_config=aws_session_cfg)
secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.get_secrets()
この操作を行うには、SecretsManager
のコンストラクタで、AwsKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AwsSessionConfig
、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
using System;
using System.Linq;
using System.Threading.Tasks;
using SecretsManager;
using AWSKeyManagement;
public class Program
{
private static async Task getOneIndividualSecret()
{
var accessKeyId = "<ACCESS_KEY_ID>";
var secretAccessKey = "<SECRET_ACCESS_KEY>";
var regionName = "<AWS_REGION_STRING";
var keyId = "<KEY_ID_1>";
var path = "<KEEPER_CONFIG_FILE_PATH>";
var dotnet_access_token = "<ONE_TIME_TOKEN>";
var awsSessionConfig = new AWSSessionConfig(accessKeyId, secretAccessKey, regionName);
var aws_storage = new AWSKeyValueStorage(keyId, path, awsSessionConfig);
SecretsManagerClient.InitializeStorage(aws_storage, dotnet_access_token);
var options = new SecretsManagerOptions(aws_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
コンストラクタで、 AWSKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AwsSessionConfig
、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
package main
import (
"encoding/json"
"fmt"
"github.com/keeper-security/secrets-manager-go/core"
awskv "github.com/keeper-security/secrets-manager-go/integrations/aws"
)
func main() {
clientID := "<Some Client ID>"
clientSecret := "<Some Client Secret>"
region := "<Cloud Region>"
keyARN := "arn:<partition>:kms:<region>:<account-id>:key/<key-id>"
oneTimeToken := "one time token"
ksmConfigFileName := ""
// Initialize the AWS Key Vault Storage
cfg := awskv.NewAWSKeyValueStorage(ksmConfigFileName, keyARN, &awskv.AWSConfig{
ClientID: clientID,
ClientSecret: clientSecret,
Region: region,
})
clientOptions := &core.ClientOptions{
Token: oneTimeToken,
Config: cfg,
}
fmt.Printf("Client ID in config: %v\n", cfg.Get(core.KEY_CLIENT_ID))
secrets_manager := core.NewSecretsManager(clientOptions)
// Fetch secrets from Keeper Security Vault
record_uids := []string{}
records, err := secrets_manager.GetSecrets(record_uids)
if err != nil {
// do something
fmt.Printf("Error while fetching secrets: %v", err)
}
for _, record := range records {
// do something with record
fmt.Println(record.Title())
}
}
デフォルトの接続を使用
この操作を行うには、SecretsManager
コンストラクタで、AwsKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AwsSessionConfig
、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import com.keepersecurity.secretmanager.aws.kms.AwsKeyValueStorage;
import com.keepersecurity.secretmanager.aws.kms.AwsSessionConfig;
import com.keepersecurity.secretsManager.core.InMemoryStorage;
import com.keepersecurity.secretsManager.core.SecretsManager;
import com.keepersecurity.secretsManager.core.SecretsManagerOptions;
import static com.keepersecurity.secretsManager.core.SecretsManager.initializeStorage;
import software.amazon.awssdk.regions.Region;
import java.security.Security;
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
class Test {
public static void main(String args[]){
String keyId = "<Key ID>";
String awsAccessKeyId = "<AWS Access ID>";
String awsSecretAccessKey = "<AWS Secret>";
String oneTimeToken = "[One Time Token]";
Region region = Region.<cloud-region>;
String profile = null OR "DEFAULT"; //set profile (ex. DEFUALT/UAT/PROD) if ~/.aws/config is set
String configFileLocation = "client_config_test.json";
try{
//set AWS configuration, It can be null if profile is set for aws credentials
AwsSessionConfig sessionConfig = new AwsSessionConfig(awsAccessKeyId, awsSecretAccessKey);
//Get Storage
AwsKeyValueStorage awskvstorage = new AwsKeyValueStorage(keyId, configFileLocation, profile, sessionConfig, region);
initializeStorage(awskvstorage, oneTimeToken);
SecretsManagerOptions options = new SecretsManagerOptions(awskvstorage);
//getSecrets(OPTIONS);
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
この操作を行うには、SecretsManager
コンストラクタで、AWSKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AWSセッション認証情報のAWSSessionConfig
、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
import { AWSKeyValueStorage } from "@keeper-security/secrets-manager-aws";
import { initializeStorage, getSecrets } from "@keeper-security/secrets-manager-core";
const getKeeperRecordsAWS = async () => {
const configPath = "client-config-path.json";
const keyId = 'arn:aws:kms:ap-south-1:<accountName>:key/<keyId>';
const storage = await new AWSKeyValueStorage(keyId, configPath).init();
const oneTimeToken = "<one time token>";
await initializeStorage(storage, oneTimeToken);
const { records } = await getSecrets({ storage: storage });
const firstRecord = records[0]
const firstRecordPassword = firstRecord.data.fields.find(x => x.type === 'password')
console.log(firstRecordPassword.value[0])
};
getKeeperRecordsAWS();
この操作を行うには、SecretsManager
のコンストラクタで、AwsKmsKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_hsm.storage_aws_kms import AwsKmsKeyValueStorage
key_id = 'c5[...]576'
config = AwsKmsKeyValueStorage(key_id, 'client-config.json') # default session
secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.get_secrets()
この操作を行うには、SecretsManager
のコンストラクタで、AWSKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
using System;
using System.Linq;
using System.Threading.Tasks;
using SecretsManager;
using AWSKeyManagement;
public class Program
{
private static async Task getOneIndividualSecret()
{
var keyId = "<KEY_ID_1>";
var path = "<KEEPER_CONFIG_FILE_PATH>";
var dotnet_access_token = "<ONE_TIME_TOKEN>";
var aws_storage = new AWSKeyValueStorage(keyId, path);
SecretsManagerClient.InitializeStorage(aws_storage, dotnet_access_token);
var options = new SecretsManagerOptions(aws_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
コンストラクタで、AWSKeyValueStorage
をシークレットマネージャーのストレージとして使用します。
このストレージには、AWSキーID、AWS KMSによって暗号化されるシークレットマネージャー構成ファイルの名前が必要となります。
package main
import (
"fmt"
"github.com/keeper-security/secrets-manager-go/core"
awskv "github.com/keeper-security/secrets-manager-go/integrations/aws"
)
func main() {
keyARN := "arn:<partition>:kms:<region>:<account-id>:key/<key-id>"
oneTimeToken := "one time token"
ksmConfigFileName := "<config file name>"
// Initialize the AWS Key Vault Storage
cfg := awskv.NewAWSKeyValueStorage(ksmConfigFileName, keyARN, nil)
clientOptions := &core.ClientOptions{
Token: oneTimeToken,
Config: cfg,
}
fmt.Printf("Client ID in config: %v\n", cfg.Get(core.KEY_CLIENT_ID))
secrets_manager := core.NewSecretsManager(clientOptions)
// Fetch secrets from Keeper Security Vault
record_uids := []string{}
records, err := secrets_manager.GetSecrets(record_uids)
if err != nil {
// do something
fmt.Printf("Error while fetching secrets: %v", err)
}
for _, record := range records {
// do something with record
fmt.Println(record.Title())
}
}
セットアップが完了すると、シークレットマネージャーとAWS KMSの連携により、シークレットマネージャーPython SDKのすべての機能が利用できるようになります。 実行時に構成ファイルの復号化を管理するには、コードからAWS KMS APIにアクセスできなければなりません。
構成の暗号化に使用するキーは変更できます。以下はその変更に必要なコードの例となります。
String newkeyId = "<New-Key-ID>";
AwsKeyValueStorage awskvstorage = new AwsKeyValueStorage(keyId, configFileLocation, profile, sessionConfig, region);
awskvstorage.changeKey(newkeyId)
const storage = await new AWSKeyValueStorage(keyId,config_path).init()
await initializeStorage(storage, oneTimeToken);
// do all process needed if any or change directly
await storage.changeKey(keyId2);
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_hsm.storage_aws_kms import AwsKmsKeyValueStorage
aws_session_cfg = AwsSessionConfig(
aws_access_key_id="AK[...]FIF",
aws_secret_access_key="/[...]/g3",
region_name="<region>")
new_key_id = "<new_key_id>"
config = AwsKmsKeyValueStorage(
key_id='e9[...]567',
config_file_location='client-config.json',
aws_session_config=aws_session_cfg)
secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.change_key(new_key_id)
using Microsoft.Extensions.Logging;
var awsSessionConfig2 = new AWSSessionConfig();
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.SetMinimumLevel(LogLevel.Debug);
builder.AddConsole();
});
var logger = loggerFactory.CreateLogger<AWSKeyValueStorage>();
var aws_storage = new AWSKeyValueStorage(keyId, path, awsSessionConfig2,logger);
updatedKeyARN := "arn:<partition>:kms:<region>:<account-id>:key/<key-id>"
isChanged, err := cfg.ChangeKey(updatedKeyARN, nil)
if err != nil {
fmt.Printf("Error while changing key: %v", err)
}
現在の実装を別のクラウド環境へ移行する場合や、生の認証情報を取得したい場合には、構成ファイルを復号できます。この関数はブール値を受け取り、true
に設定すると復号された構成をファイルに保存し、false
の場合は復号済みの構成内容のみを返します。
AwsKeyValueStorage awskvstorage = new AwsKeyValueStorage(keyId, configFileLocation, profile, sessionConfig, region);
awskvstorage.decryptConfig(true) // Set true as a parameter to extract plaintext and save config as a plaintext.
//OR
awskvstorage.decryptConfig(false); // Set false as a parameter to extract only plaintext.
const storage = await new AWSKeyValueStorage(keyId,config_path).init();
await storage.decryptConfig();
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_hsm.storage_aws_kms import AwsKmsKeyValueStorage
aws_session_cfg = AwsSessionConfig(
aws_access_key_id="AK[...]FIF",
aws_secret_access_key="/[...]/g3",
region_name="<region>")
config = AwsKmsKeyValueStorage(
key_id='e9[...]567',
config_file_location='client-config.json',
aws_session_config=aws_session_cfg)
secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.decrypt_config(True)
var conf = await aws_storage.DecryptConfigAsync(false);
Console.WriteLine(conf);
cfg := awskv.NewAWSKeyValueStorage(ksmConfigFileName, keyARN, &awskv.AWSConfig{
ClientID: clientID,
ClientSecret: clientSecret,
Region: region,
})
decryptedConfig, err := cfg.DecryptConfig(true)
KSM統合機能を使用する準備ができました。
に対応
およびパッケージが必要
に対応
パッケージが必要
に対応
に対応
パッケージが必要
に対応
パッケージが必要
AWSセッション設定の詳細は、以下のAWSのドキュメントをご参照ください。
AWSアクセスキーの詳細は、次のAWSのドキュメントをご参照ください。
その他の例と機能については、をご参照ください。