Шифрование на стороне сервера с ключами пользователя

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-MD5MD5-хэш ключа (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
Все еще нужна помощь?
Создать заявку в поддержку