# AWSシークレットマネージャー同期

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2F5nJW9dMhZ5a5PJjIyfZs%2Fimage.png?alt=media&#x26;token=811292e4-f439-41f7-b569-38885a7f0951" alt=""><figcaption></figcaption></figure>

## 概説

KeeperシークレットマネージャーCLIツールの [`sync` コマンド](https://docs.keeper.io/jp/keeperpam/secrets-manager/secrets-manager-command-line-interface/sync-command)を使用すると、Keeperボルトから目的の**AWSシークレットマネージャー**アカウントにシークレットをプッシュし、目的の場所にある既存の値を上書きできます。これにより、Keeperボルトが、AWSシークレットマネージャーを利用するAWSのすべてのサービスまたはスクリプトにとっての唯一の信頼できる情報源となります。

## 機能

* KeeperボルトのシークレットをAWSシークレットマネージャーにとっての信頼できる情報源として使用します。
* AWSの既存のスクリプトとサービスでKeeperボルトのシークレットがシームレスに使用できるようになります。

## 要件

* Keeperシークレットマネージャーへのアクセス (詳細は、[クイックスタートガイド](https://docs.keeper.io/jp/keeperpam/secrets-manager/quick-start-guide)をご参照ください)
  * Keeperサブスクリプションのシークレットマネージャーアドオンの有効化
  * シークレットマネージャー強制ポリシーが有効化されたロールを割り当てられたメンバーシップ
* シークレットを共有するKeeper[シークレットマネージャーアプリケーション](https://github.com/Keeper-Security/gitbook-jp-secrets-manager/blob/main/about/terminology/README.md#application)
  * アプリケーションの作成手順については、[クイックスタートガイド](https://github.com/Keeper-Security/gitbook-jp-secrets-manager/blob/main/quick-start-guide/README.md#create-a-secrets-manager-application)をご参照ください。
* AWSシークレットマネージャーのAWSアカウント、およびIAMセキュリティクレデンシャルの作成機能

## セットアップ

### 1. KeeperシークレットマネージャーCLIを設定

{% hint style="info" %}
KSM CLIがすでにマシンに設定済みの場合は、この手順を省略します。
{% endhint %}

KSM CLIツールを設定するには、Keeperシークレットマネージャーのワンタイムアクセストークンを使用してプロファイルを作成する必要があります。

プロファイルを作成するには、`ksm profile init <TOKEN>` コマンドを使用してデフォルトのプロファイルを初期化します。

複数のプロファイルの作成およびその他のオプションについては、[profileコマンドのページ](https://docs.keeper.io/jp/keeperpam/secrets-manager/secrets-manager-command-line-interface/profile-command)をご参照ください。

### 2. AWSのアクセス権限を設定

AWSにKSMの同期機能を使用するには、AWS [Secrets Manager](https://us-east-2.signin.aws.amazon.com/oauth?client_id=arn%3Aaws%3Asignin%3A%3A%3Aconsole%2Fsecretsmanager\&code_challenge=gyxHzzr4Q_qv1bRXegkE_Xl5wy4z7gXwStWjrIwBzk4\&code_challenge_method=SHA-256\&response_type=code\&redirect_uri=https%3A%2F%2Fconsole.aws.amazon.com%2Fsecretsmanager%3FhashArgs%3D%2523%26isauthcode%3Dtrue%26oauthStart%3D1733438854433%26state%3DhashArgsFromTB_us-east-2_d3ecb47269c4d818)に標準のIAMセキュリティ認証情報が必要です。この認証情報には、ボルト全体または個別のキーに対して有効な `SecretsManagerReadWrite` 権限が含まれている必要があります。

`arn:aws:iam::aws:policy/SecretsManagerReadWrite`

アクセスキーの作成については、[こちら](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html)のAmazonの手順をご参照ください。

### 3. AWSクレデンシャルレコードの作成

KSM CLIでは、シークレットを設定するためにAWSアカウントのクレデンシャルが必要です。 これらのクレデンシャルはKeeperのレコードに保存されており、CLIツールからは、Keeperシークレットマネージャーを使用してアクセスできます。

クレデンシャルレコードには、以下のラベルを持つレコードフィールドが必要です。

`AWS Access Key ID`\
`AWS Secret Access Key`\
`AWS Region Name`

#### 方法1. AWSクレデンシャルのカスタムのレコードタイプを作成

必要なフィールドを使用してカスタムのレコードタイプを作成できるため、レコードの作成が簡単かつシンプルになります。

カスタムのレコードタイプを作成するには、Keeperボルトで **\[カスタムのレコードタイプ]** タブに移動して、**\[タイプの作成]** をクリックします。 正しいフィールドラベルが設定された伏せ字項目を使用して新しいレコードタイプを作成し、**\[発行]** をクリックして新しいレコードタイプを作成します。

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2FRVdFInaXkTosrErzKhci%2Fimage.png?alt=media&#x26;token=6db21257-d400-4eb3-8a03-0eac2f79059a" alt=""><figcaption><p>AWSのクレデンシャルレコードタイプの定義</p></figcaption></figure>

AWSクレデンシャルタイプのレコードを新規作成し、対応するフィールドに詳細情報を入力します。

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2FCq3n2yh6lHdudAqHmwpH%2Fimage.png?alt=media&#x26;token=e72a7a37-2cdd-449c-a65b-7ca535116438" alt=""><figcaption></figcaption></figure>

この新しいレコードが、シークレットマネージャーアプリケーションに関連付けられた共有フォルダに移動されていることを確認します。

#### 方法2. カスタムフィールドを追加

新しいレコードタイプを作成せずにクレデンシャルレコードを作成するには、必要なフィールドをカスタムフィールドとして標準レコードに追加します。

任意のタイプの新しいレコードを作成し、必要なAWSフィールドごとに **\[伏せ字項目]** タイプのカスタムフィールドを追加します。**\[ラベルの編集]** をクリックして、ラベルを対応するフィールド名に変更します。

{% hint style="info" %}
どのレコードタイプでも問題ありませんが、「添付ファイル」の標準レコードタイプにはフィールドがないため、カスタムフィールドを追加したときの見た目がすっきりします。
{% endhint %}

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2FDRP6ko16QRQmsqayWRgd%2Fimage.png?alt=media&#x26;token=0b511bac-9232-48ba-ad84-60aa797de2ea" alt=""><figcaption><p>カスタムフィールドとしてのクレデンシャルフィールド</p></figcaption></figure>

次に、各カスタムフィールドに入力し、**\[保存]** をクリックしてレコードを保存します。

### 4. 値のマッピングを作成

KSM CLIの `sync` コマンドは、コマンド呼び出しで定義されたマッピングを使用して、設定する値を識別します。各マッピングには、指定された名前の値がKeeper Vaultから取得した対応する値で埋められます。

これらのマッピングは以下の形式に従っています。

`--map "VALUE KEY" "KEEPER NOTATION"`

`VALUE KEY` は、AWSシークレットマネージャーで値が割り当てられるキーの名前です。

`KEEPER NOTATION` は、キーに設定するKeeperのレコードの値を取得するKeeper表記法を使用したクエリです。

Keeper表記法は、Keeperシークレットマネージャーが特定のレコードの値を識別するために使用するクエリの表記法です。 この表記法は、以下の一般的な形式に従います。`UID/[field|custom]/fieldname`\
例: `ae3d[...]d22e/field/password`

詳細は、[Keeper表記法のページ](https://docs.keeper.io/jp/keeperpam/secrets-manager/about/keeper-notation)をご参照ください。

{% hint style="info" %}
これらの例では、完全なレコードUIDが指定されていないことにご注意ください。
{% endhint %}

完全なマッピング例:\
`--map "MySQL_PWD" "jd3[...]i-fd/field/password"`

複数のマッピングを1つの`sync`コマンドに追加できます。\
`--map "MySQL_PWD" "jd3[...]i-fd/field/password" --map "MySQL_Login" "jd3[...]i-fd/field/login"`

### 5. レコードマッピングを作成する(JSON値)

AWSでは、Secrets ManagerにJSON形式の値を保存できます。これらは複数の方法で設定でき、**マッピングされるAWS KMSキーが重複しない限り**、それらを組み合わせて使用することも可能です。レコードやフォルダを同期する際、AWS側のキー名はレコードのタイトルとして扱われ、JSONキーはフィールドタイプまたはラベルとして扱われます。

拡張マッピング形式を使用する場合は、以下の形式を使用します。

`--map "AWS_KEY+JSON_KEY" "KEEPER NOTATION"`

```bash
# 同一のKMSキー内で複数の値を扱う場合のJSON形式
ksm sync -t aws -c <CRED_UID> \
  --map "my-app+db_password" "keeper://jd3[...]ifd/field/password" \
  --map "my-app+api_key" "keeper://jd3[...]ifd/field/api_key"
```

以下のいずれかのレコード形式またはフォルダ形式を使用します。

* タイトルまたはUIDを指定して、個別のレコードを同期します。複数回指定できます。

```
--record, -r <RECORD>
```

* 指定したフォルダ内のすべてのレコードを同期します(再帰なし)。

```
--folder, -f <FOLDER>
```

* 指定したフォルダおよびそのすべてのサブフォルダ内のレコードを再帰的に同期します。

```
--folder-recursive, -fr <FOLDER>
```

{% hint style="info" %}
KSM syncコマンドでは、**レコードのタイトルがキー名として使用されます**。そのため、AWSの制限に準拠している必要があります。

AWS Secrets Managerのキー名には、以下の制約があります。

* 一意であること
* 文字数は1〜512文字
* 使用できる文字は、英数字および次の記号のみ

  ```
  /_+=.@-
  ```

{% endhint %}

```bash
# フラット化したJSONで単一レコードを同期
ksm sync --type aws --credentials <CRED_UID> --record "Database Password"

# 生のJSON形式で複数レコードを同期
ksm sync -t aws -c <CRED_UID> -r "DB Password" -r "API Keys" --raw-json

# 単一フォルダ内のすべてのレコードを同期
ksm sync --type aws --credentials <CRED_UID> --folder "Production/Databases"

# 複数フォルダを再帰的に同期
ksm sync -t aws -c <CRED_UID> \
  --folder-recursive "Production" \
  --folder-recursive "Staging"

# マッピング構文を混在させた例
ksm sync -t aws -c <CRED_UID> \
  --map "text_key" "keeper://xxx/field/password" \
  --map "json_key+password" "keeper://xxx/field/password" \
  --map "json_key+api_key" "keeper://xxx/custom_field/api_key" \
  --record "Auto Record" \
  --folder "Production/Databases" \
  --folder-recursive "Staging"
```

{% hint style="warning" %}
デフォルトでは、AWSのウェブUIは、キーと値の両方が単純な文字列で構成された非常にシンプルなJSON形式を扱います。

`--raw-json` オプションを使用すると、内容はプレーンテキストとして表示されるため、レコード全体のJSONを解析して利用するには、外部の関数やSDKを使用する必要があります。

このフラグを指定しない場合、JSONのキーにはフィールドタイプまたはラベルが使用され、値には、電話番号や住所などの複合フィールドについて `JSON.stringify()` 形式の値が格納されます。
{% endhint %}

{% hint style="warning" %}
Keeper表記法を使用したクエリによって参照されるレコードが、シークレットマネージャーアプリケーションと共有されている共有フォルダに格納されているようにします。
{% endhint %}

{% hint style="success" %}
これで、KSM同期を実行する準備ができました
{% endhint %}

## 同期の実行

同期を実行するには、クレデンシャルレコードと値のマッピングを指定して、KSM CLIの `sync` コマンドを使用します。

### 1. コマンドを構成

KSM syncコマンドをAWSタイプと組み合わせて、以下のような形式になります。

```
ksm sync --type aws --credentials [UID] --map [...] --map [...]
```

### 2. ドライランを実行

syncコマンドは、実際に値をプッシュすることも変更を加えることもせずに、AWSシークレットマネージャーの値に加えられるすべての変更を確認するドライランがサポートされています。 ドライランで、マッピングクエリが正しく構成されていることを確認します。

```
ksm sync --type aws --credentials [UID] --map [...] --map [...] --dry-run
```

### 3. 同期を実行

準備ができたら、`dry-run` オプションを指定せずにsyncコマンドを実行します。 これにより、KeeperボルトからAWSシークレットマネージャーに値がプッシュされます

{% hint style="info" %}
`--map` の短縮形として、`-m` を使用できます
{% endhint %}

```
ksm sync --type aws --credentials [UID] -m [...] -m [...]
```
