LoginSignup
5
4

More than 3 years have passed since last update.

AWS KMS (Key Management Service) に関する私的メモ

Last updated at Posted at 2020-12-27

AWS認定 セキュリティ – 専門知識」を受験するにあたって、KMSについて個人的にまとめたメモです。

各CMKの比較表

image.png

Envelope enryption

S3データ格納時のサーバ側暗号化(SSE-S3、SSE-KMS、SSE-C)と、クライアント側暗号化(CSE-KMS、CSE-C)」を参照。

BYOK (Bring Your Own Key)のインポート

BYOKのポイント

  • 外部キーのインポートは対称暗号のみ可能。
  • 外部キーは自動ローテーション不可
  • 再インポートするキーマテリアルは、前回インポートしたものと同じキーマテリアルである必要がある。前回と異なるキーマテリアルをインポートするとIncorrectKeyMaterialExceptionが発生する。
  • 前回と同じキーマテリアルを再インポートできて何が嬉しいの?と思うかもしれないが、再インポートは誤って削除したキーマテリアルを復旧したり、有効期限を過ぎたキーマテリアルを延命する目的で行う。
  • BYOKの手動ローテーションを実現する手段はCMKの再作成になる。
  • インポートトークンと公開鍵は取得後24時間有効である。

以下に、AWS CLIを使用してBYOKを作成する手順を示します。
(作成するCMKのキーIDは、仮に12345678-abcd-1234-abcd-123456789012とします)

1. CMKの作成

マネージメントコンソールを使用したCMKの作成

AWSマネージメントコンソールのKMSから、キーマテリアルオリジンに外部を指定してCMKを作成します。

AWS CLIを使用したCMKの作成

AWS CLIを使用する場合、以下のコマンドラインを実行します。標準出力の内容に含まれるキーIDを取得します。

KEY_ID=$(aws kms create-key --origin EXTERNAL | jq -r '.KeyMetadata.KeyId')
echo ${KEY_ID}  # 12345678-abcd-1234-abcd-123456789012 

なお、残念ながら、AWS CLIではCMK作成時にエイリアスを作成・アタッチすることはできません。

2. 公開鍵とインポートトークンのダウンロード

公開鍵のアルゴリズムによって、以下のいずれかを実行します。

  • RSAES_PKCS1_V1_5
  • RSAES_OAEP_SHA_1
  • RSAES_OAEP_SHA_256
RSAES_PKCS1_V1_5
# 公開鍵とインポートトークンのダウンロード(RSAES_PKCS1_V1_5)
aws kms get-parameters-for-import \
  --key-id 12345678-abcd-1234-abcd-123456789012\
  --wrapping-algorithm RSAES_PKCS1_V1_5 \
  --wrapping-key-spec RSA_2048 \
  >kms_get-parameters-for-import.txt
RSAES_OAEP_SHA_1
# 公開鍵とインポートトークンのダウンロード(RSAES_OAEP_SHA_1)
aws kms get-parameters-for-import \
  --key-id 12345678-abcd-1234-abcd-123456789012\
  --wrapping-algorithm RSAES_OAEP_SHA_1 \
  --wrapping-key-spec RSA_2048 \
  >kms_get-parameters-for-import.txt
RSAES_OAEP_SHA_256
# 公開鍵とインポートトークンのダウンロード(RSAES_OAEP_SHA_256)
aws kms get-parameters-for-import \
  --key-id 12345678-abcd-1234-abcd-123456789012\
  --wrapping-algorithm RSAES_OAEP_SHA_256 \
  --wrapping-key-spec RSA_2048 \
  >kms_get-parameters-for-import.txt

3. 公開鍵とインポートトークンのBASE64デコード

cat kms_get-parameters-for-import.txt | jq -r '.PublicKey' >PublicKey.b64
cat kms_get-parameters-for-import.txt | jq -r '.ImportToken' >ImportToken.b64

openssl enc -d -a -A -in PublicKey.b64 -out PublicKey.bin
openssl enc -d -a -A -in ImportToken.b64 -out ImportToken.bin

4. キーマテリアルの生成

キーマテリアルの生成
printf "0123456789ABCDEF0123456789ABCDEF" > PlaintextKeyMaterial.bin

5. キーマテリアルの暗号化

2. 公開鍵とインポートトークンのダウンロード」で選択した公開鍵のアルゴリズムによって、以下のいずれかを実行します。

RSAES_PKCS1_V1_5
# 公開鍵でキーマテリアルの暗号化(RSAES_PKCS1_V1_5)
openssl rsautl -encrypt \
  -in PlaintextKeyMaterial.bin \
  -pkcs \
  -inkey PublicKey.bin \
  -keyform DER \
  -pubin \
  -out EncryptedKeyMaterial.bin
RSAES_OAEP_SHA_1
# 公開鍵でキーマテリアルの暗号化(RSAES_OAEP_SHA_1)
openssl rsautl -encrypt \
  -in PlaintextKeyMaterial.bin \
  -oaep \
  -inkey PublicKey.bin \
  -keyform DER \
  -pubin \
  -out EncryptedKeyMaterial.bin
RSAES_OAEP_SHA_256
# 公開鍵でキーマテリアルの暗号化(RSAES_OAEP_SHA_256)
openssl pkeyutl -encrypt \
  -in PlaintextKeyMaterial.bin \
  -pkeyopt rsa_padding_mode:oaep \
  -pkeyopt rsa_oaep_md:sha256 \
  -inkey PublicKey.bin \
  -keyform DER \
  -pubin \
  -out EncryptedKeyMaterial.bin

6. キーマテリアルのインポート

# 暗号化後のキーマテリアルのインポート
aws kms import-key-material \
  --key-id 12345678-abcd-1234-abcd-123456789012 \
  --encrypted-key-material fileb://EncryptedKeyMaterial.bin \
  --import-token fileb://ImportToken.bin \
  --expiration-model KEY_MATERIAL_EXPIRES \
  --valid-to "2020-12-31T12:00:00-08:00"

7. キーマテリアルの削除

キーマテリアルの削除
aws kms delete-imported-key-material --key-id 12345678-abcd-1234-abcd-123456789012
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4