KMS.5
概要
KMS.5 は、KMS キーのキーポリシーがパブリックアクセス(Principal: "*" または等価な Principal: {"AWS": "*"})を許可していないことをチェックする Security Hub CSPM コントロールである。対応する Config ルールは kms-key-policy-no-public-access(カスタマーマネージドキー限定)。
Principal: "*" または等価な Principal: {"AWS": "*"} を許可し、全 AWS プリンシパル(自アカウント以外を含む全 AWS アカウントのユーザー・ロール)からのアクセスを許可している状態を指す。検出範囲
KMS.5 の特徴は「キーポリシー内の Principal: "*" によるパブリックアクセスを検出し、特定の外部アカウントへのクロスアカウントアクセスは検出しない」点である。クロスアカウントアクセスは IAM Access Analyzer が担当する。
KMS キーにはデフォルトキーポリシーが存在し、自アカウントの root にのみ kms:* を許可する保守的な設定になっている。明示的にキーポリシーを変更しない限り、外部からのアクセスは発生しない。
| キーポリシー設定 | 外部プリンシパルからの呼び出し | KMS.5 | IAM Access Analyzer |
|---|---|---|---|
デフォルト(自アカウント root のみ kms:*) | 拒否 | PASSED | finding なし |
Principal: "*"(パブリック) | 許可(全 AWS プリンシパル) | FAILED | finding(isPublic: true) |
| 組織外アカウント(クロスアカウント) | 指定アカウントのみ許可 | PASSED | finding(isPublic: false) |
| 組織内アカウント(信頼ゾーン内) | 指定アカウントのみ許可 | PASSED | finding なし |
外部アクセス制御レイヤー
KMS キーの外部アクセスに関わるコントロールは以下の 3 種類。KMS.5 は CSPM による検出レイヤーに位置する。
| レイヤー | コントロール | 役割 |
|---|---|---|
| デフォルト保護 | デフォルトキーポリシー | 自アカウント root にのみ kms:* を許可。外部アクセスは許可されない |
| 予防(RCP) | CT.KMS.PV.7 | 組織外プリンシパルからの KMS API アクセスを拒否(キーポリシーの内容は変更しない) |
| 検出(CSPM) | KMS.5(本記事) | キーポリシーに Principal: "*" が設定されているキーを検出 |
| 検出(IAM Access Analyzer) | KMS キー | キーポリシーを解析し、パブリック・組織外クロスアカウントへの到達可能性を検出 |
Principal: "*" が残っていても組織外からの API 呼び出しは拒否される。ただし KMS.5 はキーポリシーの内容(Principal: "*" の有無)を見るため、RCP 適用後も FAILED のまま変わらないと想定される。本記事のステップ 10 でこれを検証する。本記事で確認すること
KMS.5 に関わる検証は、既に他の記事で一部が完了している。本記事ではそれらをリンクで参照しつつ、未検証の項目を検証する。
| # | 検証観点 | 状態 | 出典 |
|---|---|---|---|
| 1 | デフォルトキーポリシーは自アカウント root のみ許可 | 検証済み | IAM Access Analyzer KMS キー ステップ 1 |
| 2 | デフォルト状態で KMS.5 が PASSED | 本記事で検証(2. デフォルト状態で KMS.5 PASSED を確認) | — |
| 3 | Principal: "*" 設定時に KMS.5 が FAILED | 本記事で検証(8. KMS.5 FAILED を確認) | — |
| 4 | Principal: "*" 設定時の IAM Access Analyzer finding(isPublic: true) | 検証済み | IAM Access Analyzer KMS キー ステップ 3 |
| 5 | 組織外アカウントを設定時に KMS.5 が PASSED のまま | 本記事で検証(4. KMS.5 が PASSED のままであることを確認) | — |
| 6 | 組織外アカウントを設定時の IAM Access Analyzer finding(isPublic: false) | 検証済み | IAM Access Analyzer KMS キー ステップ 4 |
| 7 | 組織内アカウントを設定時に KMS.5 が PASSED のまま | 本記事で検証(6. KMS.5 が PASSED のままであることを確認) | — |
| 8 | 組織内アカウントを設定時の IAM Access Analyzer finding | 記述のみ(信頼ゾーン内のため finding なし) | IAM Access Analyzer Analyzer のタイプ |
| 9 | キーポリシーから Principal: "*" を削除で KMS.5 が PASSED に復帰 | 本記事で検証(9. Principal: * の削除で PASSED に復帰することを確認) | — |
| 10 | 予防コントロール CT.KMS.PV.7 有効化後、KMS.5 finding がどうなるか(RCP 型は CSPM 動作を変えるか) | 本記事で検証(10. 予防コントロール CT.KMS.PV.7 有効化後の finding) | — |
本記事では #2、#3、#5、#7、#9、#10 の 6 点を検証する。
#5・#7 のように「KMS.5 が PASSED のまま変化しない」ことを確認する場合、Security Hub finding の UpdatedAt は Config の評価結果が変わらないと更新されないケースがある(VPC BPA 記事の UpdatedAt 教訓を参照)。そのため本記事では、Config の ResultRecordedTime がキーポリシー変更時刻より後であることをもって、設定変更後に再評価されたことを確認する。
Config ルールの手動トリガー(start-config-rules-evaluation)は 1 回で評価が走らない場合があり、同じ ResultRecordedTime が返ることがある。その場合は数分待ってから再度トリガーする。
結果
- デフォルト状態: KMS キーをポリシー指定なしで作成すると、デフォルトキーポリシーが設定され、KMS.5 は PASSED
- 組織外アカウントの許可追加: キーポリシーに組織外アカウントへの許可を追加しても、KMS.5 は PASSED のまま(IAM Access Analyzer は
isPublic: falseの finding を生成) - 組織内アカウントの許可追加: キーポリシーに組織内アカウントへの許可を追加しても、KMS.5 は PASSED のまま(IAM Access Analyzer も信頼ゾーン内のため finding なし)
Principal: "*"の追加: キーポリシーにPrincipal: "*"の statement を追加すると、KMS.5 は FAILED に変化Principal: "*"の削除: キーポリシーからPrincipal: "*"の statement を削除すると、KMS.5 は PASSED に復帰する- CT.KMS.PV.7(RCP 型)との連動: 有効化しても KMS.5 の finding は変化しない。RCP はキーポリシーを変更せず API アクセスを拒否するため、キーポリシーの内容をチェックする KMS.5 の評価結果は変わらない
検証環境
本記事のコマンドは、--profile 指定がない場合は Workload アカウントで実行する。事前に export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
検証の流れ
flowchart LR
A[1. テスト用キー<br>作成] --> B[2. デフォルト状態で<br>KMS.5 PASSED 確認]
B --> C[3. 組織外アカウント<br>許可追加]
C --> D[4. KMS.5 PASSED<br>のまま確認]
D --> E[5. 組織内アカウント<br>許可追加]
E --> F[6. KMS.5 PASSED<br>のまま確認]
F --> G[7. Principal:*<br>許可追加]
G --> H[8. KMS.5 FAILED<br>確認]
H --> I[9. Principal:* のみ<br>削除 → PASSED 復帰確認]
I --> J[10. FAILED 状態に戻し<br>CT.KMS.PV.7 有効化の影響確認]
J --> K[11. クリーンアップ]
1. テスト用キーの作成
ポリシー指定なしで KMS キーを作成すると、自アカウントの root に kms:* を許可するデフォルトキーポリシーが設定される。
なお、デフォルトキーポリシーが自アカウント root のみ許可している事実そのものは IAM Access Analyzer KMS キー記事 で既に検証済み。本記事の本ステップではテスト用キーが正しく作成されたことを確認する目的でデフォルトポリシーを表示する。
aws kms create-key \
--description "kms-5-test" \
--query 'KeyMetadata.{KeyId:KeyId,Arn:Arn,KeyState:KeyState}' \
--region ap-northeast-1{
"KeyId": "<キー ID>",
"Arn": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>",
"KeyState": "Enabled"
}エイリアスを設定する(手順上の参照を楽にするため)。
aws kms create-alias \
--alias-name alias/kms-5-test \
--target-key-id <キー ID> \
--region ap-northeast-1
(出力なし)デフォルトキーポリシーを確認する。
aws kms get-key-policy \
--key-id <キー ID> \
--policy-name default \
--query 'Policy' --output text \
--region ap-northeast-1 | python3 -m json.tool{
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<アカウント ID>:root"},
"Action": "kms:*",
"Resource": "*"
}
]
}自アカウントの root にのみ kms:* を許可する保守的な設定。
2. デフォルト状態で KMS.5 PASSED を確認
Config ルール名の取得
aws configservice describe-config-rules \
--query 'ConfigRules[?starts_with(ConfigRuleName, `securityhub-kms-key-policy-no-public-access`)].ConfigRuleName' \
--region ap-northeast-1[
"securityhub-kms-key-policy-no-public-access-<サフィックス>"
]Config ルール手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-kms-key-policy-no-public-access-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
Config の評価結果確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-kms-key-policy-no-public-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<キー ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<キー ID>",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<評価時刻>"
}
]Security Hub finding 確認
Config の評価結果が Security Hub に反映されるまで 2〜3 分のラグがある。数分待ってから確認する。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "KMS.5"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>",
"UpdatedAt": "<更新時刻>"
}
]3. 組織外アカウントを許可
組織外アカウント(信頼ゾーン外)を Principal に指定して、キーポリシーに statement を追加する。
get-key-policy で現在のキーポリシーを取得し、cross-account-external statement を追加した新しいキーポリシーを作成する。
cat > /tmp/kms-5-policy-step3.json << EOF
{
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<アカウント ID>:root"},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "cross-account-external",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<組織外アカウント ID>:root"},
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:DescribeKey"],
"Resource": "*"
}
]
}
EOF
aws kms put-key-policy \
--key-id <キー ID> \
--policy-name default \
--policy file:///tmp/kms-5-policy-step3.json \
--region ap-northeast-1
(出力なし)4. KMS.5 が PASSED のままであることを確認
Config ルール手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-kms-key-policy-no-public-access-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
Config の評価結果確認
ResultRecordedTime がステップ 3(put-key-policy の実行時刻)より後であることを確認する。
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-kms-key-policy-no-public-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<キー ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<キー ID>",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<put-key-policy 後の評価時刻>"
}
]組織外アカウントを許可しても、KMS.5 の Config 評価は COMPLIANT(PASSED)のまま。
Security Hub finding 確認
数分待ってから確認する。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "KMS.5"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>",
"UpdatedAt": "<put-key-policy 後の更新時刻>"
}
]5. 組織内アカウントを許可
組織内アカウント(Audit)の許可を追加したキーポリシーを作成する。
cat > /tmp/kms-5-policy-step5.json << EOF
{
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<アカウント ID>:root"},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "cross-account-external",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<組織外アカウント ID>:root"},
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:DescribeKey"],
"Resource": "*"
},
{
"Sid": "cross-account-internal",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<組織内アカウント ID>:root"},
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:DescribeKey"],
"Resource": "*"
}
]
}
EOF
aws kms put-key-policy \
--key-id <キー ID> \
--policy-name default \
--policy file:///tmp/kms-5-policy-step5.json \
--region ap-northeast-1
(出力なし)6. KMS.5 が PASSED のままであることを確認
Config ルール手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-kms-key-policy-no-public-access-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
Config の評価結果確認
ResultRecordedTime がステップ 5(put-key-policy の実行時刻)より後であることを確認する。
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-kms-key-policy-no-public-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<キー ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<キー ID>",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<put-key-policy 後の評価時刻>"
}
]Security Hub finding 確認
数分待ってから確認する。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "KMS.5"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>",
"UpdatedAt": "<put-key-policy 後の更新時刻>"
}
]7. Principal: * を許可
ステップ 3・5 で追加した組織外・組織内の statement は残したまま、新たに Principal: "*" の statement を追加する。
cat > /tmp/kms-5-policy-step7.json << EOF
{
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<アカウント ID>:root"},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "cross-account-external",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<組織外アカウント ID>:root"},
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:DescribeKey"],
"Resource": "*"
},
{
"Sid": "cross-account-internal",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<組織内アカウント ID>:root"},
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:DescribeKey"],
"Resource": "*"
},
{
"Sid": "public-access",
"Effect": "Allow",
"Principal": "*",
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:DescribeKey"],
"Resource": "*"
}
]
}
EOF
aws kms put-key-policy \
--key-id <キー ID> \
--policy-name default \
--policy file:///tmp/kms-5-policy-step7.json \
--region ap-northeast-1
(出力なし)8. KMS.5 FAILED を確認
Config ルール手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-kms-key-policy-no-public-access-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。Config の評価結果確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-kms-key-policy-no-public-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<キー ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<キー ID>",
"ComplianceType": "NON_COMPLIANT",
"ResultRecordedTime": "<put-key-policy 後の評価時刻>"
}
]Security Hub finding 確認
数分待ってから確認する。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "KMS.5"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>",
"UpdatedAt": "<put-key-policy 後の更新時刻>"
}
]9. Principal: * の削除で PASSED に復帰することを確認
public-access の statement のみを削除し、組織外・組織内の statement は残した状態で KMS.5 が PASSED に復帰することを確認する。
aws kms put-key-policy \
--key-id <キー ID> \
--policy-name default \
--policy file:///tmp/kms-5-policy-step5.json \
--region ap-northeast-1
(出力なし)ステップ 5 と同じキーポリシー(組織外・組織内の statement のみ)に戻す。
Config ルール手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-kms-key-policy-no-public-access-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
NON_COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。Config の評価結果確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-kms-key-policy-no-public-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<キー ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<キー ID>",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<put-key-policy 後の評価時刻>"
}
]Security Hub finding 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "KMS.5"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>",
"UpdatedAt": "<更新時刻>"
}
]組織外・組織内の statement は残っているが、Principal: "*" を削除したことで KMS.5 は PASSED に復帰。
10. 予防コントロール CT.KMS.PV.7 有効化後の finding
CT.KMS.PV.7 は RCP 型で、組織外プリンシパルからの API アクセスを拒否する。キーポリシーの内容(Principal: "*" 等)は変更しない。そのため、キーポリシーの内容をチェックする KMS.5 の評価結果は変化しない想定である。
本ステップでは、ステップ 7 のキーポリシー(Principal: "*" を含む)を再適用して FAILED 状態を作り直し、その後 CT.KMS.PV.7 を有効化して KMS.5 の評価が変化しないことを確認する。
キーポリシーを Principal: “*” を含む状態に戻す
ステップ 9 で PASSED に戻したため、再び FAILED 状態を作る必要がある。ステップ 7 のキーポリシー(Principal: "*" を含む)を再適用する。
aws kms put-key-policy \
--key-id <キー ID> \
--policy-name default \
--policy file:///tmp/kms-5-policy-step7.json \
--region ap-northeast-1
(出力なし)CT.KMS.PV.7 有効化
Control Tower で CT.KMS.PV.7 を対象の OU で有効化する。詳細な手順は CT.KMS.PV.7 の記事 を参照。
Config ルール手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-kms-key-policy-no-public-access-<サフィックス> \
--region ap-northeast-1
(出力なし)1〜2 分待ってから評価結果を確認する。
COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。Config の評価結果確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-kms-key-policy-no-public-access-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<キー ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<キー ID>",
"ComplianceType": "NON_COMPLIANT",
"ResultRecordedTime": "<RCP 有効化後の評価時刻>"
}
]ResultRecordedTime が CT.KMS.PV.7 有効化時刻より後であることを確認する。これにより、RCP 適用後に Config の再評価が実行されたことを示す。
CT.KMS.PV.7(RCP 型)を有効化しても、キーポリシーの内容は変わらないため KMS.5 は FAILED のまま。RCP は実際の API アクセスをブロックするが、キーポリシーの内容に基づく CSPM の検出結果には影響しないことを示す。
Security Hub finding 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "KMS.5"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:kms:ap-northeast-1:<アカウント ID>:key/<キー ID>",
"UpdatedAt": "<更新時刻>"
}
]CT.KMS.PV.7 無効化
本ステップで CT.KMS.PV.7 を新たに有効化した場合のみ無効化する。元から有効な環境ではそのまま有効にしておく。手順は CT.KMS.PV.7 の記事 を参照。
11. クリーンアップ
CT.KMS.PV.7 の状態確認
ステップ 10 で CT.KMS.PV.7 を有効化した場合、既にステップ 10 末尾で無効化済み。元から有効な環境であれば有効のまま残す。
KMS キー削除
KMS キーは即時削除できない。削除スケジュール(7〜30 日)を設定する。
aws kms delete-alias --alias-name alias/kms-5-test \
--region ap-northeast-1
(出力なし)
aws kms schedule-key-deletion \
--key-id <キー ID> \
--pending-window-in-days 7 \
--query '{KeyId:KeyId,KeyState:KeyState,DeletionDate:DeletionDate}' \
--region ap-northeast-1{
"KeyId": "<キー ID>",
"KeyState": "PendingDeletion",
"DeletionDate": "<削除予定日>"
}一時ファイル削除
rm -f /tmp/kms-5-policy-step3.json /tmp/kms-5-policy-step5.json /tmp/kms-5-policy-step7.json