Je voudrais utiliser boto3 (Python) pour crypter les données écrites sur S3.
référence https://qiita.com/ot-nemoto/items/66cc783e8d8714f88bd8#%E9%9D%9E%E6%9A%97%E5%8F%B7%E5%8C%96%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%81%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E6%9A%97%E5%8F%B7%E5%8C%96%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89
Les types de chiffrement côté serveur SSE sont:
Remplacez la valeur de BUCKET_NAME dans la source par le nom de votre compartiment S3. Remplacez SSEKMSKeyId par l'ID de clé de vos clés gérées par le client. Créez une SSECustomerKey afin qu'elle puisse être chiffrée avec AES-256. J'utilise Ubuntu 18.04 et j'ai utilisé les résultats d'exécution de commande suivants. SSE_CUSTOMER_KEY=$(cat /dev/urandom | base64 -i | fold -w 32 | head -n 1)
event = {
"BUCKET_NAME" : "xxxxxxxxx",
"encryption_mode" : default_encryption,
"SSEKMSKeyId" : "yyyyyyyy",
"SSECustomerKey" : "zzzzzzzzzzzz"
}
Pour le chiffrement par défaut, sur la console S3, appuyez sur Propriétés → Chiffrement par défaut sur le compartiment S3 et sélectionnez AES-256 ou AWS-KMS. Définissez la valeur encryption_mode de la variable d'événement ci-dessus sur default_encryption.
Pour chiffrer avec un modèle autre que le chiffrement par défaut, sur la console S3, appuyez sur Propriétés → Chiffrement par défaut du compartiment S3 et sélectionnez Aucun. Définissez la valeur encryption_mode de la variable d'événement ci-dessus sur non_default_encryption.
#-*- encoding:utf-8 -*-
from datetime import datetime,timedelta,timezone
import json
import os,os.path
import sys
#Third Party
import boto3
#kms
kms = boto3.client("kms")
#s3
s3 = boto3.client("s3")
def default_encryption(**event) -> None:
"""
Check the "Default encryption" on the S3 bucket Properties
Automatically encrypt objects when stored in Amazon S3
Args:
event
Returns:
None
"""
#SSE with AES-256
#SSE with KMS AWS Managed Keys
#SSE with KMS CMK(Customer Managed Keys)
response = s3.put_object(
Bucket = event["BUCKET_NAME"],
Key = "test",
Body = "Encrypted".encode("UTF-8")
)
print(f'ServerSideEncryption'.ljust(20) + f' = {response["ServerSideEncryption"]}')
#just only for KMS. check the KeyManager
if response["ServerSideEncryption"] == "aws:kms":
KeyManager = kms.describe_key(
KeyId = response["SSEKMSKeyId"]
)["KeyMetadata"]["KeyManager"]
print(f"KeyManager".ljust(20) + f" = {KeyManager}")
#Body
Body = s3.get_object(
Bucket = event["BUCKET_NAME"],
Key = "test"
)["Body"].read().decode("UTF-8")
print(f"Body".ljust(20) + f" = {Body}")
def non_default_encryption(**event) -> None:
"""
Encrypt the data on your behalf
Args:
event
Returns:
None
"""
#SSE with AES-256
#SSE with KMS AWS Managed Keys
#SSE with KMS CMK(Customer Managed Keys)
#SSE with Client operations key. This is not the key which S3 or KMS operates
l = [
{"ServerSideEncryption" : "AES256"},
{"ServerSideEncryption" : "aws:kms" },
{"ServerSideEncryption" : "aws:kms","SSEKMSKeyId" : event["SSEKMSKeyId"]},
{"SSECustomerAlgorithm" : "AES256","SSECustomerKey" : event["SSECustomerKey"]}
]
for item in l:
params = {
"Bucket" : event["BUCKET_NAME"],
"Key" : "test",
"Body" : "Encrypted".encode("UTF-8")
}
for key in item:
params[key] = item[key]
response = s3.put_object(**params)
if "ServerSideEncryption" in response:
print(f'ServerSideEncryption'.ljust(20) + f' = {response["ServerSideEncryption"]}')
#just only for KMS. check the KeyManager
if response["ServerSideEncryption"] == "aws:kms":
KeyManager = kms.describe_key(
KeyId = response["SSEKMSKeyId"]
)["KeyMetadata"]["KeyManager"]
print(f"KeyManager".ljust(20) + f" = {KeyManager}")
elif "SSECustomerAlgorithm" in response:
print(f'SSECustomerAlgorithm'.ljust(20) + f' = {response["SSECustomerAlgorithm"]}')
#Body
params = {
"Bucket" : event["BUCKET_NAME"],
"Key" : "test"
}
if "SSECustomerAlgorithm" in item:
params["SSECustomerAlgorithm"] = item["SSECustomerAlgorithm"]
params["SSECustomerKey"] = item["SSECustomerKey"]
Body = s3.get_object(
**params
)["Body"].read().decode("UTF-8")
print(f"Body".ljust(20) + f" = {Body}")
if __name__ == "__main__":
event = {
"BUCKET_NAME" : "xxxxxxxxx",
"encryption_mode" : default_encryption,
"SSEKMSKeyId" : "yyyyyyyy",
"SSECustomerKey" : "zzzzzzzzzzzz"
}
event["encryption_mode"](**event)
Recommended Posts