本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。
暗号化操作に使用されるキーを簡単に作成および管理できるマネージドサービスです。
【AWS Black Belt Online Seminar】AWS Key Management Service(YouTube)(0:59:33)
KMS では、エンベロープ暗号化を使用しています。 これは、データを暗号化する鍵(データキー)とデータキーを暗号化する鍵(マスターキー)を利用する方式で、セキュリティが強化されます。
KMS のキーに対する操作は CloudTrail に記録されます。詳しくは、「AWS KMS による AWS CloudTrail API コールのログ記録」を参照してください。
KMS では、マスターキーとデータキーという 2 種類の鍵が登場します。
kms:GenerateDataKey
を使用して平文のデータキーと暗号化されたデータキーを都度生成します。kms:GenerateDataKeyWithoutPaintext
では、暗号化されたデータキーのみを生成します。CMK にはエイリアス(別名)を付けることができます。エイリアスを使用することで、キーをローテーションした場合など、エイリアスの紐づけを変更するだけで、アプリケーション側の更新が不要になります。
エイリアス名の ARN は次のようになります。そのため、リージョン/アカウントで一意にする必要があります。
arn:aws:kms:ap-northeast-1:123456789012:alias/aliasName
キーマテリアルとは、「暗号化キーを生成するために必要な材料」であり「CMK 作成時に使用されるデータのこと」をいいます。
キーマテリアルは、次の 3 種類が指定できます。
CMK にはリソースベースのキーポリシーを付与することができます。 これにより、特定のサービスからのみアクセスさせるといった制御ができます。 CMK 作成時にはデフォルトのキーポリシーが設定されているので、必要に応じて変更します。
キーポリシーに指定できる代表的な条件は次のとおりです。その他については、AWS KMS 条件キーを参照してください。
単一リージョンで作成した CMK はエクスポートのインポートも出来ないため、作成したリージョン以外では使用することができません。 しかし、マルチリージョンキーを選択することで、複数のリージョンにレプリケートすることが可能です。
CMK は別のアカウントに使用を許可することができます。
次のように使用を許可するアカウントを指定すると、キーポリシーに反映されます。
CMK は即時削除することはできません。削除スケジュールを設定し、一定期間後に削除されます。 削除スケジュールは、7 日~ 30 日を指定できます。この期間内であれば削除をキャンセルすることができます。 削除されると、既存データを二度と復号できなくなるので注意が必要です。
削除ではなく、無効化することもできますのでまずは無効化を行い、本当にキーが使用されていないことを確認することを推奨します。
削除予定の CMK が利用されたら通知させることもできます。
削除保留中の KMS キーの使用を検出するアラームの作成キーステータスの表
CloudTrail に以下のイベントが記録されます。
{
"errorCode": "KMSInvalidStateException",
"errorMessage": "arn:aws:kms:ap-northeast-1:123456789012:key/XXX is pending deletion."
}
{
"errorCode": "KMSInvalidStateException",
"errorMessage": "arn:aws:kms:ap-northeast-1:123456789012:key/XXX is disabled."
}
フィルタパターン例
{($.eventSource=kms.amazonaws.com) && (($.errorCode="KMSInvalidStateException") || ($.errorCode="DisabledException"))}
OR
{($.eventSource=kms.amazonaws.com) && (($.errorCode="*Exception"))}
次の CloudTrail イベントを監視することで通知が可能です。
フィルタパターン例
{($.eventSource=kms.amazonaws.com) && (($.eventName="DisableKey") || ($.eventName="ScheduleKeyDeletion"))}
AWS Encryption SDK の機能として、「データキーキャッシュ」があります。 これを利用することでデータキー取得の API コールを減らすことができます。
KMS を利用した暗号化は、次の 2 種類があります。