Chiffrement côté serveur S3 SSE avec Python boto3

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:

Cryptage par défaut

  1. SSE with AES-256
  2. SSE with KMS AWS Managed Keys
  3. SSE with KMS CMK(Customer Managed Keys)

Autre que le cryptage par défaut

  1. SSE with AES-256
  2. SSE with KMS AWS Managed Keys
  3. SSE with KMS CMK(Customer Managed Keys)
  4. SSE with Customer Key(AES-256 etc.)

échantillon

Préparation

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"
}

Basculer entre le cryptage par défaut et le cryptage non par défaut

Cryptage par défaut

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.

Modèle de chiffrement autre que celui par défaut

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

Chiffrement côté serveur S3 SSE avec Python boto3
Essayez le chiffrement côté serveur de S3 à l'aide de boto3
Opération S3 avec python boto3
Téléchargeur S3 avec boto
[Python] Résumé des opérations sur les fichiers S3 avec boto3
Chiffrement et déchiffrement avec Python
[S3] CRUD avec S3 utilisant Python [Python]
Utilisez boto3 pour accéder à S3
Générer une URL signée S3 avec boto
Premiers pas avec Dynamo de Python boto
[AWS] Associez Lambda et S3 à boto3
Connectez-vous à s3 avec AWS Lambda Python
Comment gérer l'erreur SSL lors de la connexion à S3 avec Python boto
Copier des données d'Amazon S3 vers Google Cloud Storage avec Python (boto)
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
python commence par ()
Gérez bien AWS avec la bibliothèque Python Boto
Exporter un instantané RDS vers S3 avec Lambda (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
[Python] Local → Procédure de téléchargement de fichiers vers S3 (boto3)
Émettre une URL limitée dans le temps S3 avec boto3 (avec confirmation de l'existence du fichier)
[Memo] Chargez le csv de s3 dans les pandas avec boto3
Communication série avec Python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
[Python] 2 conversion du complément
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python