https://dev.classmethod.jp/articles/lim-s3-sse-2021/
https://tm200.hatenablog.com/entry/2021/04/21/201735
https://siguniang.wordpress.com/2014/06/14/s3-encryption-with-aws-cli/
http://x68000.q-e-d.net/~68user/unix/pickup?base64
https://qiita.com/kite_999/items/cc39179463fd061b2e7d
-- 1. コマンド等のインストール
-- 1.1 aws cli version 2 インストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
-- 2. S3 バケットを作成する
aws s3 mb s3://bucket123
aws s3 ls
-- 3. KMSカスタマキーを作成する
{
"Id": "key01",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:user/iamuser"
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": "*"
},
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {"AWS": [
"arn:aws:iam::999999999999:user/iamuser"
]},
"Action": [
"kms:CreateGrant",
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {"AWS": [
"arn:aws:iam::999999999999:user/iamuser"
]}, "Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
]
}
aws kms create-key \
--description key01 \
--policy file://key01.json
-- 4. バケットの暗号化設定
-- 4.1 Amazon S3 が管理するキーによるサーバー側の暗号化 (SSE-S3)
aws s3api put-bucket-encryption \
--bucket bucket123 \
--server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
},
"BucketKeyEnabled": true
}
]
}'
aws s3api get-bucket-encryption \
--bucket bucket123
※BucketKeyEnabledを指定してもエラーにならない。意味があるのか不明
-- 4.2 KMS キーによるサーバー側の暗号化 (SSE-KMS)
S3 バケットキーは、Amazon S3 から AWS Key Management Service (AWS KMS) へのリクエストトラフィックを減らし、SSE-KMS におけるコストを削減します。
KMSキーにはAWSマネージドキー(aws/s3)とカスタママネージドキーの2種類ある
aws s3api put-bucket-encryption \
--bucket bucket123 \
--server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "11111111-2222-3333-4444-555555555555"
},
"BucketKeyEnabled": true
}
]
}'
aws s3api get-bucket-encryption \
--bucket bucket123
-- 4.3 カスタマ指定キーによるサーバー側の暗号化 (SSE-C)
方法はない模様
-- 5. オブジェクトのアップロード時の暗号化設定
-- 5.1 Amazon S3 が管理するキーによるサーバー側の暗号化 (SSE-S3)
echo test01 > test01.txt
aws s3api put-object \
--bucket bucket123 \
--key test01.txt \
--server-side-encryption AES256 \
--body test01.txt
aws s3api head-object \
--bucket bucket123 \
--key test01.txt
-- 5.2 KMS キーによるサーバー側の暗号化 (SSE-KMS)
echo test02 > test02.txt
aws s3api put-object \
--bucket bucket123 \
--key test02.txt \
--server-side-encryption aws:kms \
--body test02.txt \
--ssekms-key-id "11111111-2222-3333-4444-555555555555"
aws s3api head-object \
--bucket bucket123 \
--key test02.txt
-- 5.3 カスタマ指定キーによるサーバー側の暗号化 (SSE-C)
echo test03 > test03.txt
openssl enc -e -aes-256-cbc -salt -k "passwordpasswordpasswordpassword" -in test03.txt -out test03.enc
※パスワードは32文字の必要がある
--sse-customer-key
→ Amazon S3 でデータを暗号化または復号するために使用する base64 でエンコードされた 256 ビットの暗号化キーを指定するには、このヘッダーを使用します。
--sse-customer-key-md5
→ RFC 1321 に従って、暗号化キーの base64 エンコードされた 128 ビット MD5 ダイジェストを指定するには、このヘッダーを使用します。
※シェルで送信用の暗号化キーとそのダイジェストを生成する場合
echo -n "passwordpasswordpasswordpassword" | base64
echo -n "passwordpasswordpasswordpassword" | openssl md5 -binary | base64
※pythonで送信用の暗号化キーとそのダイジェストを生成する場合
python3
import hashlib
import base64
sse_c_secret_key = "passwordpasswordpasswordpassword".encode('utf-8')
digest = hashlib.md5(sse_c_secret_key).digest()
sse_c_key_base64 = base64.b64encode(sse_c_secret_key).decode()
sse_c_key_md5 = base64.b64encode(digest).decode()
print(sse_c_key_base64)
print(sse_c_key_md5)
aws s3api put-object \
--bucket bucket123 \
--key test03.enc \
--body test03.enc \
--sse-customer-algorithm AES256 \
--sse-customer-key "cGFzc3dvcmRwYXNzd29yZHBhc3N3b3JkcGFzc3dvcmQ=" \
--sse-customer-key-md5 "6FYocf/oDVtFcupmCgp2Sg=="
aws s3api head-object \
--bucket bucket123 \
--key test03.enc \
--sse-customer-algorithm AES256 \
--sse-customer-key "cGFzc3dvcmRwYXNzd29yZHBhc3N3b3JkcGFzc3dvcmQ=" \
--sse-customer-key-md5 "6FYocf/oDVtFcupmCgp2Sg=="
-- 6. 復号確認
aws s3api get-object \
--bucket bucket123 \
--key test01.txt \
test11.txt
cat test11.txt
aws s3api get-object \
--bucket bucket123 \
--key test02.txt \
test12.txt
cat test12.txt
aws s3api get-object \
--bucket bucket123 \
--key test03.enc \
--sse-customer-algorithm AES256 \
--sse-customer-key "cGFzc3dvcmRwYXNzd29yZHBhc3N3b3JkcGFzc3dvcmQ=" \
--sse-customer-key-md5 "6FYocf/oDVtFcupmCgp2Sg==" \
test13.enc
openssl enc -d -aes-256-cbc -salt -k "passwordpasswordpasswordpassword" -in test13.enc -out test13.txt
cat test13.txt
-- 7. クリーンアップ
-- KMSキーの一覧
aws kms list-keys
-- KMSキーの削除
aws kms schedule-key-deletion \
--key-id arn:aws:kms:ap-northeast-1:999999999999:key/11111111-2222-3333-4444-555555555555c \
--pending-window-in-days 7
aws s3 rb s3://bucket123 --force