# AWS - KMS Enum

{{#include ../../../banners/hacktricks-training.md}}

## KMS - Key Management Service

AWS Key Management Service (AWS KMS) は、ユーザーが **顧客マスターキー** (CMK) を **作成および管理する** プロセスを簡素化するマネージドサービスとして提供されています。これらの CMK は、ユーザーデータの暗号化に不可欠です。AWS KMS の注目すべき機能は、CMK が主に **ハードウェアセキュリティモジュール** (HSM) によって **保護されている** ことです。これにより、暗号化キーの保護が強化されます。

KMS は **対称暗号化** を使用します。これは **情報を静止状態で暗号化する** ために使用されます（例えば、S3 内）。**転送中の情報を暗号化する** 必要がある場合は、**TLS** のようなものを使用する必要があります。

KMS は **リージョン固有のサービス** です。

**Amazon の管理者はあなたのキーにアクセスできません**。彼らはあなたのキーを復元することができず、あなたのキーの暗号化を手伝うこともありません。AWS は単にオペレーティングシステムとその基盤となるアプリケーションを管理しており、私たちが暗号化キーを管理し、それらのキーがどのように使用されるかを管理する責任があります。

**顧客マスターキー** (CMK): 最大 4KB のサイズのデータを暗号化できます。通常、DEK（データ暗号化キー）を作成、暗号化、復号化するために使用されます。その後、DEK はデータを暗号化するために使用されます。

顧客マスターキー (CMK) は、AWS KMS におけるマスターキーの論理的表現です。マスターキーの識別子や作成日、説明、キーの状態などのメタデータに加えて、**CMK にはデータを暗号化および復号化するために使用されるキー素材が含まれています**。CMK を作成すると、デフォルトで AWS KMS がその CMK のためのキー素材を生成します。ただし、キー素材なしで CMK を作成し、その CMK に自分のキー素材をインポートすることもできます。

マスターキーには 2 種類あります：

- **AWS 管理の CMK: 他のサービスによってデータを暗号化するために使用されます**。リージョン内でそれを作成したサービスによって使用されます。それは、そのサービスで暗号化を実装する最初の時に作成されます。3 年ごとにローテーションされ、変更することはできません。
- **顧客管理の CMK**: 柔軟性、ローテーション、構成可能なアクセスおよびキー ポリシー。キーを有効または無効にします。

**エンベロープ暗号化** は、キー管理サービス (KMS) の文脈において: データキーでデータを **暗号化し、次にマスターキーでデータキーを暗号化する** ための二層階層システムです。

### キーポリシー

これにより、**KMS でキーを使用およびアクセスできる人を定義します**。

**デフォルトでは:**

- **KMS キーを所有する AWS アカウントの IAM にアクセスを管理する** 権限を与えます。

他の AWS リソースポリシーとは異なり、AWS **KMS キーポリシーはアカウントのいずれかのプリンシパルに自動的に権限を与えません**。アカウント管理者に権限を与えるには、**キーポリシーにこの権限を提供する明示的なステートメントを含める必要があります**。

- アカウントを許可しない限り（`"AWS": "arn:aws:iam::111122223333:root"`）IAM 権限は機能しません。

- これは、**キーポリシーに加えて KMS キーへのアクセスを許可するために IAM ポリシーを使用することを** アカウントに許可します。

**この権限がないと、キーへのアクセスを許可する IAM ポリシーは無効になります**が、キーへのアクセスを拒否する IAM ポリシーは依然として有効です。

- **キーが管理不能になるリスクを軽減します**。アカウント管理者、特に削除できないアカウントのルートユーザーにアクセス制御権限を与えることによって。

**デフォルトポリシー** の例:
```json
{
"Sid": "Enable IAM policies",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "kms:*",
"Resource": "*"
}
```
> [!WARNING]
> **アカウントが許可されている** (`"arn:aws:iam::111122223333:root"`) 場合、アカウントの **プリンシパル** は **KMSキーを使用するためにIAM権限が必要** です。ただし、例えば **ロールのARN** が **キー ポリシー** に **特に許可されている** 場合、そのロールは **IAM権限を必要としません**。

<details>

<summary>ポリシーの詳細</summary>

ポリシーのプロパティ:

- JSONベースのドキュメント
- リソース --> 影響を受けるリソース ("\*" も可)
- アクション --> kms:Encrypt, kms:Decrypt, kms:CreateGrant ... (権限)
- 効果 --> Allow/Deny
- プリンシパル --> 影響を受けるarn
- 条件 (オプション) --> 権限を与える条件

グラント:

- AWSアカウント内の別のAWSプリンシパルに権限を委任することを許可します。AWS KMS APIを使用して作成する必要があります。CMK識別子、グラントを受けるプリンシパル、および必要な操作レベル (Decrypt, Encrypt, GenerateDataKey...) を指定できます。
- グラントが作成されると、GrantTokenとGrantIDが発行されます。

**アクセス**:

- **キー ポリシー** を介して -- これが存在する場合、IAMポリシーよりも **優先されます**
- **IAMポリシー** を介して
- **グラント** を介して

</details>

### キー管理者

デフォルトのキー管理者:

- KMSを管理するアクセス権を持っていますが、データを暗号化または復号化することはできません
- キー管理者リストにはIAMユーザーとロールのみを追加できます (グループは不可)
- 外部CMKが使用される場合、キー管理者はキー材料をインポートする権限を持っています

### CMKのローテーション

- 同じキーが長く使用されるほど、そのキーで暗号化されるデータが増え、そのキーが侵害されると、リスクにさらされるデータの範囲が広がります。さらに、キーがアクティブである期間が長くなるほど、侵害される可能性が高くなります。
- **KMSは顧客キーを365日ごとにローテーションします** (または、いつでも手動でプロセスを実行できます) そして **AWSが管理するキーは3年ごとにローテーションされ、これは変更できません**。
- **古いキーは保持され**、ローテーション前に暗号化されたデータを復号化するために使用されます。
- 侵害が発生した場合、キーをローテーションしても脅威は除去されず、侵害されたキーで暗号化されたすべてのデータを復号化することが可能です。ただし、**新しいデータは新しいキーで暗号化されます**。
- **CMK** が **無効** または **削除保留中** の状態にある場合、KMSはCMKが再有効化されるか削除がキャンセルされるまで **キーのローテーションを実行しません**。

#### 手動ローテーション

- **新しいCMKを作成する必要があります**。その後、新しいCMK-IDが作成されるため、**アプリケーション** を **新しいCMK-IDを参照するように更新** する必要があります。
- このプロセスを簡単にするために、**キーIDを参照するためにエイリアスを使用** し、その後エイリアスが参照しているキーを更新することができます。
- **古いファイルを復号化するために古いキーを保持する必要があります**。

オンプレミスのキーインフラストラクチャからキーをインポートできます。

### その他の関連KMS情報

KMSは、すべてのサービスから受け取る暗号化/復号化リクエストの数に基づいて価格が設定されます。

KMSは完全な監査およびコンプライアンス **CloudTrailとの統合** を提供します。ここでKMSに対して行われたすべての変更を監査できます。

KMSポリシーを使用して、次のことができます:

- データキーを作成できる人と、これらのキーを使用するサービスを制限する
- システムのアクセスを暗号化専用、復号化専用、または両方に制限する
- システムがリージョンをまたいでキーにアクセスできるように定義する (ただし、KMSをホストするリージョンでの障害が他のリージョンのシステムの可用性に影響を与えるため、推奨されません)。

リージョン間でキーを同期または移動/コピーすることはできません; アクセスを許可するためのルールを定義することのみ可能です。

### 列挙
```bash
aws kms list-keys
aws kms list-key-policies --key-id <id>
aws kms list-grants --key-id <id>
aws kms describe-key --key-id <id>
aws kms get-key-policy --key-id <id> --policy-name <name> # Default policy name is "default"
aws kms describe-custom-key-stores

# This script enumerates AWS KMS keys across all available regions.
for region in $(aws ec2 describe-regions --query "Regions[].RegionName" --output text); do
echo -e "\n### Region: $region ###"; aws kms list-keys --region $region --query "Keys[].KeyId" --output text | tr '\t' '\n';
done
```
### プリベスケーション

{{#ref}}
../aws-privilege-escalation/aws-kms-privesc/README.md
{{#endref}}

### ポストエクスプロイテーション

{{#ref}}
../aws-post-exploitation/aws-kms-post-exploitation/README.md
{{#endref}}

### パーシステンス

{{#ref}}
../aws-persistence/aws-kms-persistence/README.md
{{#endref}}

## 参考文献

- [https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html)

{{#include ../../../banners/hacktricks-training.md}}
