LocalStackでAWS KMSを操作してみる

AWS KMS。 AWS認定ソリューションアーキテクトアソシエイトの勉強をしていた時や、仕事で読んだコードで度々見かけていましたが、 実際に自分で操作をしたことがなかったのでLocalStackでKMSを操作してみました。

AWS KMSってなに?

AWS Key Management Service (KMS) を利用すると、データ保護に使用される暗号化キーを一元管理できます。

aws.amazon.com

つまり、データ保護に使用する暗号化キーをAWS側が管理してくれるので、我々が暗号化キーを管理する必要がありません。 IAM ユーザやIAM ロールに適切なポリシーを設定することで、暗号化キーを安全に管理することができます。

KMSをLocalStackで操作してみる

ローカルにpassword.txtというファイルを用意しました。 ファイルの中には平文で mypassword と記述してあります。

$ ls -la
password.txt

$ cat password.txt
mypassword

KMSキーを作成する

平文のパスワードを暗号化したいです。 しかし、暗号化するためのキーは自分で管理したくありません。 暗号化されたパスワードと暗号化に使用したキーの両方を盗まれた場合にパスワードを複合されてしまうからです。 そこでKMSの出番です。KMSは暗号化に使用するキーであるKMSキーを管理してくれます。

$ awslocal kms create-key

{
    "KeyMetadata": {
        "AWSAccountId": "000000000000",
        "KeyId": "e6a25557-e58a-4a47-929d-5404b4ac73e1",
        "Arn": "arn:aws:kms:ap-northeast-1:000000000000:key/e6a25557-e58a-4a47-929d-5404b4ac73e1",
        "CreationDate": "2023-09-13T10:15:00.026118+09:00",
        "Enabled": true,
        "Description": "",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "Origin": "AWS_KMS",
        "KeyManager": "CUSTOMER",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeySpec": "SYMMETRIC_DEFAULT",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ],
        "MultiRegion": false
    }
}

KMSキーを作成するコマンドを実行するとKMSキーの情報が’返却されます。 暗号化をする際にKeyIdを使用します。

KMSキーを使用して平文のパスワードを暗号化する

下記のコマンドで平文のパスワードpassword.txtを暗号化し、 encrypted_password.txtを作成します。 KMSキーを作成した際に取得したKeyId--key-idに渡します。

$ awslocal kms encrypt \
    --key-id e6a25557-e58a-4a47-929d-5404b4ac73e1 \
    --plaintext fileb://password.txt \
    --output text \
    --query CiphertextBlob | base64 \
    --decode > encrypted_password.txt

暗号化されたパスワードの書かれているencrypted_password.txtを確認すると 平文のパスワードは暗号化されており、KeyIdが記述されています。

$ cat encrypted_password.txt
e6a25557-e58a-4a47-929d-5404b4ac73e1?{o???'>pZ??l??A??1?????Ui?&??b??9??+?"??

このKeyId が記述されていることにより、encrypted_password.txtを複合化する際にKMSは このKeyId を持つKMSキーを使用します。

平文パスワードの削除

暗号化されたパスワード encrypted_password.txtがあり、 それを複合化するためのKMSキーがAWS KMSで管理されています。 平文のパスワードpassword.txtをローカルに置いておく必要はないので削除します。

$ rm password.txt
$ ls -la
encrypted_password.txt

暗号化されたパスワードの複合化

暗号化されたパスワードにKMSキーのKeyIdが記述されているので、 複合化する際はKMSにKeyIdを知らせる必要はありません。

$ awslocal kms decrypt \
    --ciphertext-blob fileb://encrypted_password.txt \
    | jq -r '.Plaintext' | base64 --decode > password.txt
$ ls -la
encrypted_password.txt
password.txt

$ cat password.txt
mypassword

暗号化されたパスワードを平文で取得できました!