Шифрование на стороне сервера с ключами пользователя
Server-Side Encryption with Customer-Provided Keys — метод серверного шифрования, при котором вы предоставляете ключи при каждом запросе. Ключи не сохраняются на стороне сервера, и вы полностью контролируете безопасность.
Полный контроль над доступом к данным
SSE‑C помогает соответствовать требованиям закона №152-ФЗ, обеспечивая контроль над средствами защиты информации. Он позволяет использовать собственные политики управления ключами без участия внешнего провайдера и обеспечивает доступ к данным только при наличии соответствующего ключа.
Как работает SSE‑C
1. Создайте 256-битный ключ (32 байта), например:
openssl rand -out encryption_key32.bin 32
2. Преобразуйте ключ в Base64 и получите его контрольную сумму:
export BASE64_ENCRYPTION_KEY=$(cat encryption_key32.bin | base64)
export MD5_BASE64_ENCRYPTION_KEY=$(openssl dgst -md5 -binary encryption_key32.bin | base64)
3. Передавайте ключ в запросах к S3 API с заголовками:
Заголовок | Назначение |
---|---|
x-amz-server-side-encryption-customer-algorithm | Алгоритм шифрования (обязательно AES256) |
x-amz-server-side-encryption-customer-key | Ключ шифрования в формате Base64 |
x-amz-server-side-encryption-customer-key-MD5 | MD5-хэш ключа (Base64) для проверки целостности |
4. Для повторного доступа используйте тот же ключ. При попытке использования неверного или некорректного ключа система вернет ошибку с кодом 400 (Bad Request)
Загрузка с использованием ключа шифрования
Поддерживаемые форматы ключа: RawBase64 или Hex.
export RAW_BASE64_ENCRYPTION_KEY=$(echo "${BASE64_ENCRYPTION_KEY}" | sed 's/=*$//')
Загрузка одного файла:
mc cp ./file.txt <alias_name>/<bucket_name>/<file> \
--enc-c "<alias_name>=${RAW_BASE64_ENCRYPTION_KEY}"
Загрузка папки с SSE-C (рекурсивно):
mc cp --recursive ./<local-folder>/ <alias_name>/<bucket_name>/<folder>/ \
--enc-c "<alias_name>=${RAW_BASE64_ENCRYPTION_KEY}"
Загрузка одного файла:
rclone copy ./file.txt <remote_name>:<bucket_name> \
--s3-sse-customer-algorithm AES256 \
--s3-sse-customer-key-base64 ${BASE64_ENCRYPTION_KEY} \
--s3-sse-customer-key-md5 ${MD5_BASE64_ENCRYPTION_KEY} \
--s3-no-check-bucket
Загрузка папки:
rclone copy ./<local-folder> <remote_name>:<bucket_name>/<folder> \
--s3-sse-customer-algorithm AES256 \
--s3-sse-customer-key-base64 ${BASE64_ENCRYPTION_KEY} \
--s3-sse-customer-key-md5 ${MD5_BASE64_ENCRYPTION_KEY}
Загрузка одного файла:
aws s3 cp ./file.txt s3://<bucket_name>/<file> \
--sse-c AES256 --sse-c-key fileb://encryption_key32.bin
Загрузка нескольких файлов или папки (рекурсивно):
aws s3 cp ./<local-folder>/ s3://<bucket_name>/<folder>/ \
--recursive --sse-c AES256 --sse-c-key fileb://encryption_key32.bin
aws s3api put-object \
--bucket <bucket_name> --key <file> --body ./file.txt \
--sse-customer-algorithm AES256 \
--sse-customer-key ${BASE64_ENCRYPTION_KEY} \
--sse-customer-key-md5 ${MD5_BASE64_ENCRYPTION_KEY}
Для загрузки объекта с SSE-C через curl
, необходимо указать дополнительные заголовки, а также параметры авторизации:
# Замените YOUR_ACCESS_KEY_ID и YOUR_SECRET_ACCESS_KEY на свои реальные ключи
export AWS_ACCESS_KEY_ID="<YOUR_ACCESS_KEY_ID>"
export AWS_SECRET_ACCESS_KEY="<YOUR_SECRET_ACCESS_KEY>"
export AWS_REGION="ru-1"
curl -X PUT "https://s3.buckets.ru/<bucket_name>/<file>" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:s3" \
-H "x-amz-server-side-encryption-customer-algorithm: AES256" \
-H "x-amz-server-side-encryption-customer-key: ${BASE64_ENCRYPTION_KEY}" \
-H "x-amz-server-side-encryption-customer-key-MD5: ${MD5_BASE64_ENCRYPTION_KEY}" \
--upload-file ./file.txt
Скачивание зашифрованного объекта
Скачивание одного файла:
mc cp <alias_name>/<bucket_name>/<file> ./file.txt \
--enc-c "<alias_name>=${RAW_BASE64_ENCRYPTION_KEY}"
Скачивание папки с SSE-C (рекурсивно):
mc cp --recursive <alias_name>/<bucket_name>/<folder>/ ./<local-folder>/ \
--enc-c "<alias_name>=${RAW_BASE64_ENCRYPTION_KEY}"
Скачивание одного файла:
rclone copy <remote_name>:<bucket_name>/<file> ./<local-folder> \
--s3-sse-customer-algorithm AES256 \
--s3-sse-customer-key-base64 ${BASE64_ENCRYPTION_KEY} \
--s3-sse-customer-key-md5 ${MD5_BASE64_ENCRYPTION_KEY}
Скачивание папки:
rclone copy <remote_name>:<bucket_name>/<folder> ./<local-folder> \
--s3-sse-customer-algorithm AES256 \
--s3-sse-customer-key-base64 ${BASE64_ENCRYPTION_KEY} \
--s3-sse-customer-key-md5 ${MD5_BASE64_ENCRYPTION_KEY}
Скачивание одного файла:
aws s3 cp s3://<bucket_name>/<file> ./file.txt \
--sse-c AES256 --sse-c-key fileb://encryption_key32.bin
Скачивание нескольких файлов или папки целиком (рекурсивно):
aws s3 cp s3://<bucket_name>/<folder>/ ./<local-folder>/ \
--recursive --sse-c AES256 --sse-c-key fileb://encryption_key32.bin
aws s3api get-object \
--bucket <bucket_name> --key <file> ./file.txt \
--sse-customer-algorithm AES256 \
--sse-customer-key ${BASE64_ENCRYPTION_KEY} \
--sse-customer-key-md5 ${MD5_BASE64_ENCRYPTION_KEY}
curl "https://s3.buckets.ru/<bucket_name>/<file>" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:s3" \
-H "x-amz-server-side-encryption-customer-algorithm: AES256" \
-H "x-amz-server-side-encryption-customer-key: ${BASE64_ENCRYPTION_KEY}" \
-H "x-amz-server-side-encryption-customer-key-MD5: ${MD5_BASE64_ENCRYPTION_KEY}" \
--output ./file.txt