{S3}サーバー側の暗号化を使用したデータの保護

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カスタマキーを作成する

vim key01.json

{
    "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 ls

aws s3 rb s3://bucket123 --force