AWS KMSを利用して、S3に暗号化オブジェクトを保存する

AWSでシークレットを安全に管理・配備する方法として、AWS KMSについて調査したので、そのメモを残しておきます。

AWS KMS

データの暗号化に使用される暗号化キーの作成と管理を容易にするマネージド型サービスで、S3をはじめ様々なAWSサービスと統合されています。 最初の取っ掛かりとして、この記事が分かりやすいです。

dev.classmethod.jp

AWS KMS + S3

Amazon Simple Storage Service (Amazon S3) で AWS KMS を使用する方法 に記載の通り、S3で AWS KMS を使用する方法は、「サーバー側の暗号化: SSE-KMS の使用」「Amazon S3 暗号化クライアントの使用」の2通りあります。それぞれ具体的な方法を見ていきたいと思います。

サーバー側の暗号化: SSE-KMS の使用

AWS SDK, AWS-CLI, S3コンソールなどを利用することで、サーバー側で暗号化を行えます。 最もカンタンな例として、AWS-CLIでの暗号化・復号化をしてみました。

暗号化

aws s3 cp plain.txt s3://${YOUR_S3_BUCKET} \
    --sse-kms-key-id ${YOUR_AWS_KMS_KEY_ID} \
    --sse aws:kms

復号化

aws s3 cp s3://${YOUR_S3_BUCKET} plain.txt \
    --sse-kms-key-id ${YOUR_AWS_KMS_KEY_ID} \
    --sse aws:kms

cp — AWS CLI 1.14.58 Command Reference

Amazon S3 暗号化クライアントの使用

Amazon KMS で保管されるカスタマーマスターキーを利用し、エンベロープ暗号化 を用いてオブジェクトをS3に保管する方法です。

AWS SDK for Rubyも対応しているので、Rubyで扱うことも可能です。

技術的な詳細

エンベロープ暗号化については、下記ドキュメントを読むと良いです。

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/images/envelope-encryption.png 出典: AWS Key Management Service の概念

事例

blog.honeybadger.io