Zum Hauptinhalt springen

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).
Schlüsselverlust = Datenverlust

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 CopyObject mit 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).

Verwandte Themen