LocalStackでAWS KMSを操作してみる
AWS KMS。 AWS認定ソリューションアーキテクトアソシエイトの勉強をしていた時や、仕事で読んだコードで度々見かけていましたが、 実際に自分で操作をしたことがなかったのでLocalStackでKMSを操作してみました。
AWS KMSってなに?
AWS Key Management Service (KMS) を利用すると、データ保護に使用される暗号化キーを一元管理できます。
つまり、データ保護に使用する暗号化キーを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
暗号化されたパスワードを平文で取得できました!