KMSのカスタマー管理キーはCLIでも即削除できない

  • AWS
  • KMS
  • Security

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

KMSのカスタマー管理キーを消そうとしたらマネジメントコンソールでは「削除をスケジュール」しか出てこない。CLIならバシッと消せるのでは?と思って調べたけど、結論としてCLIでもAPIでも即時削除はできなかった。

結論

  • キー削除のAPIは ScheduleKeyDeletion だけで、待機期間は 最短7日・最長30日(省略時は30日)
  • CLI(aws kms schedule-key-deletion)もSDKも中身は同じAPIなので、7日未満にはできない
  • 「今すぐ使えなくしたい」だけなら、無効化(disable-key)は即時に効く
ターミナル
aws kms schedule-key-deletion \
--key-id <key-id> \
--pending-window-in-days 7

--pending-window-in-days に7未満を渡しても受け付けられない。APIリファレンス上も PendingWindowInDays の最小値は7になっている。

なお、IAMやキーポリシーの条件キー kms:ScheduleKeyDeletionPendingWindowInDays を使うと、指定できる待機日数をさらに絞れる(例: 30日固定にして短縮させない)。

待機期間中に何が起きるか

ScheduleKeyDeletion を実行すると、キーは PendingDeletion 状態になる。この間キーは無効化された扱いで、暗号化・復号などの暗号オペレーションはすべて失敗する。待機期間が明けると、キー本体・キーマテリアル・関連するエイリアスなどが削除される。

待機中であれば cancel-key-deletion で取り消せる。取り消し後のキーは Disabled 状態になるので、使うなら enable-key で有効化し直す必要がある。

stateDiagram-v2
    Enabled --> PendingDeletion: schedule-key-deletion
    Disabled --> PendingDeletion: schedule-key-deletion
    Enabled --> Disabled: disable-key
    Disabled --> Enabled: enable-key
    PendingDeletion --> Disabled: cancel-key-deletion
    PendingDeletion --> [*]: 待機期間(7〜30日)経過で削除

マルチリージョンキーの場合

マルチリージョンのプライマリキーにレプリカが残っている場合、プライマリはすぐには消えない。待機期間のカウントは最後のレプリカキーが削除された時点から始まる。

なぜ即削除できないのか

KMSのキーが消えると、そのキーで暗号化していたデータは二度と復号できなくなる。S3、EBS、RDS、Secrets Managerなど、キーを参照しているリソースのデータがまとめて読めなくなる可能性がある。

待機期間はその事故を防ぐための猶予で、「本当に誰も使っていないか」を確認する期間として使える。

待機中にキーが使われていないか検知する

公式ドキュメントに、CloudTrail・CloudWatch Logs・SNSを組み合わせて、削除保留中のキーが使われようとしたら通知するアラームの作り方が載っている。

やることは以下の流れ。

  1. CloudTrailのログをCloudWatch Logsに送る
  2. ロググループにメトリクスフィルターを作る
  3. そのメトリクスにCloudWatchアラームを設定し、SNSで通知する

メトリクスフィルターのパターンはドキュメント記載のものがそのまま使える。

{ $.eventSource = kms* && $.errorMessage = "* is pending deletion."}
flowchart LR
    A[アプリ等が削除保留中のキーを使用] --> B[KMSがエラーを返す]
    B --> C[CloudTrailに記録]
    C --> D[CloudWatch Logs<br/>メトリクスフィルター]
    D --> E[CloudWatchアラーム]
    E --> F[SNS通知]
    F --> G[cancel-key-deletionで取り消し検討]

通知が来たら、まだそのキーを必要としているリソースがあるということなので、削除を取り消して見直す。ただしこのアラームは、非対称キーの公開鍵をKMSの外で使うケースは検知できない。

すぐ使えなくしたい場合の選択肢

方法 効果 元に戻せるか
disable-key 即座に暗号オペレーション不可 enable-key で戻せる
schedule-key-deletion 即座に使用不可、7〜30日後に削除 待機中なら cancel-key-deletion で戻せる
delete-imported-key-material キーマテリアルを即削除し使用不可 同じキーマテリアルを再インポートすれば戻せる

delete-imported-key-material は、キーマテリアルを自分でインポートしたキー(Originが EXTERNAL)専用。実行するとキーは PendingImport 状態になり、暗号オペレーションに使えなくなる。KMSが生成したキーマテリアル(Originが AWS_KMS)には使えない。

インポート型のキーで手元にキーマテリアルのコピーを持っていなければ、マテリアル削除の時点で実質的に復旧不能になる。即時性はあるけど、待機期間という安全網がない分リスクも大きい。キー本体のリソースは残るので、完全に消すにはやはり schedule-key-deletion が必要になる。