Daten mit SSE-C verschlüsseln
Bei SSE-C (Server-Side Encryption with Customer-provided Keys) verschlüsselt der Storage Ihre Objekte serverseitig mit AES-256 – aber mit einem Schlüssel, den nur Sie besitzen. Der Schlüssel wird bei jedem Request mitgesendet, serverseitig ausschließlich im Arbeitsspeicher verwendet und nicht gespeichert.
Wichtige Eigenschaften
- Ohne den Schlüssel sind die Objekte dauerhaft unlesbar – es gibt keine Wiederherstellung durch centron.
- Der Schlüssel muss bei jedem Zugriff (
PUT,GET,HEAD,COPY) mitgegeben werden; auch Objekt-Listings zeigen nur Metadaten. - Die Übertragung erfolgt zwingend über HTTPS.
- Alternative bei voller Client-Kontrolle: clientseitige Verschlüsselung (z. B. restic/Kopia verschlüsseln selbst – dort ist SSE-C unnötig).
Bewahren Sie den Schlüssel sicher und redundant auf (Passwort-Manager, Secret-Store). Ein verlorener SSE-C-Schlüssel bedeutet unwiederbringlichen Datenverlust.
Schlüssel erzeugen
Ein SSE-C-Schlüssel ist ein zufälliger 256-Bit-Wert (32 Byte, Base64-codiert):
openssl rand -base64 32 > ssec.key
cat ssec.key
# z. B.: 5FZDMoAyVqzUmYOMzR3xkJXnxSTdVk9fQZfSrYupdrQ=
Verwendung mit der AWS CLI
KEY=$(cat ssec.key)
# Upload mit SSE-C
aws s3 cp geheim.pdf s3://mein-bucket/geheim.pdf \
--sse-c AES256 --sse-c-key "$KEY" \
--endpoint-url https://s3.internet1.de
# Download – derselbe Schlüssel ist erforderlich
aws s3 cp s3://mein-bucket/geheim.pdf ./geheim.pdf \
--sse-c AES256 --sse-c-key "$KEY" \
--endpoint-url https://s3.internet1.de
# Zugriff ohne Schlüssel schlägt fehl (HTTP 400)
aws s3 cp s3://mein-bucket/geheim.pdf ./test.pdf \
--endpoint-url https://s3.internet1.de
Beim serverseitigen Kopieren verschlüsselter Objekte zusätzlich den Quellschlüssel angeben (--copy-source-sse-c-key).
Verwendung mit boto3 (Python)
import base64, os, boto3
key = base64.b64decode(open("ssec.key").read().strip())
s3 = boto3.client(
"s3",
endpoint_url="https://s3.internet1.de",
region_name=" ",
aws_access_key_id=os.environ["S3_ACCESS_KEY"],
aws_secret_access_key=os.environ["S3_SECRET_KEY"],
)
s3.put_object(
Bucket="mein-bucket", Key="geheim.pdf",
Body=open("geheim.pdf", "rb"),
SSECustomerAlgorithm="AES256",
SSECustomerKey=key,
)
obj = s3.get_object(
Bucket="mein-bucket", Key="geheim.pdf",
SSECustomerAlgorithm="AES256",
SSECustomerKey=key,
)
Verwendung mit curl
Die API erwartet drei Header: Algorithmus, Base64-Schlüssel und MD5-Prüfsumme des Schlüssels:
KEY_B64=$(cat ssec.key)
KEY_MD5=$(echo -n "$KEY_B64" | base64 -d | openssl md5 -binary | base64)
curl -X PUT "https://s3.internet1.de/mein-bucket/geheim.pdf" \
--user "IHR_ACCESS_KEY:IHR_SECRET_KEY" \
--aws-sigv4 "aws:amz:de-central-1:s3" \
-H "x-amz-server-side-encryption-customer-algorithm: AES256" \
-H "x-amz-server-side-encryption-customer-key: $KEY_B64" \
-H "x-amz-server-side-encryption-customer-key-MD5: $KEY_MD5" \
--upload-file ./geheim.pdf
Hinweise zur Schlüsselverwaltung
- Ein Schlüssel pro Datenklasse/Anwendung statt eines globalen Schlüssels – erleichtert Rotation und begrenzt Schadensfälle.
- Rotation: SSE-C-Objekte lassen sich per serverseitigem
CopyObjectmit altem Quell- und neuem Zielschlüssel umschlüsseln, ohne die Daten herunterzuladen. - Prüfen, ob eingesetzte Tools SSE-C unterstützen (rclone: ja, per
sse_customer_key; viele GUI-Clients: eingeschränkt).