今回はデータ保護の領域から暗号化キーを扱う2つのサービスについてまとめてみます。直接使ったことはないサービスなので基本事項を押さえるのが目的です。
AWS Key Management Service (KMS)
暗号化キーの作成と管理を行うサービス。暗号化のある他のサービスでも使われ、試験でも頻出する模様。
エンベロープ暗号化(Envelope Encryption)と呼ばれる仕組みで、データを暗号化するCustomer Data Key(CDK)に加えてCDKを暗号化するCustomer Master Key(CMK)の2つのキーを使用する(両方とも復号も行う)。APIも含めた使い方の概要は以下の通り。
ローテーションを有効化すると1年ごとにCMKが自動でローテーションされるが、以前のCMKも保持しているので古いデータも復号できる。1年という期間が許容できない場合は手動ローテーションもできるが、実際には単に新規CMKを作成するだけである。この時、エイリアスを作成しておくと呼び出し側の処理を変えずに済む。
AWSが作成したCMKではなく、例えばオンプレと同じキー(と暗号化アルゴリズム)を使用したい場合などにはインポートすることができる(BYOK: Bring Your Own Key)。ただし、ローテーションができない(有効期限の設定は可能)、障害時に自動復旧されないなどの制約がある。
アクセス制御に関しては、IAMポリシーで使用側に対して行うことの他に、CMK側にどのようなアクセスが可能かをキーポリシーとして設定できる。デフォルトでは以下が設定され、CMKを生成したアカウントの全ユーザーやロールにKMSの全アクセスを許可している。キーポリシーを利用してキー管理者とキー利用者を設定したりMFAを強制させたりもできる。さらにCreateGrantを使用して一時的な許可(Grant)を与えることも可能。
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "【任意の識別子】",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::【アカウントID】:root"}, // 全ユーザーとロールを意味する
"Action": "kms:*",
"Resource": "*", // アタッチするKMSを表すため常に"*"
}]
}
CMKには3種類あり、これまでの話はカスタマー管理CMKのものである。この他に、他のAWSサービスで作成・使用されるAWS管理CMK(コンソール上では「aws/【サービス名】」と表示される)と、アカウントに関係なくAWSが裏で使用しているAWS所有CMKがある。
AWS CloudHSM
こちらもKMSと同様に暗号化キーの作成と管理を行うサービスだが、公式に「法令順守のためのハードウェアセキュリティモジュール(Hardware Security Module)」とある通りKMSよりも高いコンプライアンスに対応するためのサービスで、以下のような特徴がある。
- キーの保管に専用のハードウェアが使用される
- VPC内で実行され、AWSはアクセスできない
- 対称キー(共通鍵暗号方式)と非対称キー(公開鍵暗号方式)の両方に対応している
- KMSでも2019年11月から非対称キーに対応しているが、試験には反映されていない可能性あり。
- 耐障害性などはユーザーが管理する
- KMSと統合してCloudHSMクラスターをカスタムキーストアとして使用可能