Szyfrowanie po stronie serwera z kluczami zarządzanymi przez klienta (SSE-C) w NSIS
Wprowadzenie
Ten przewodnik wyjaśnia, jak szyfrować obiekty po stronie serwera za pomocą SSE-C.
Szyfrowanie po stronie serwera jest sposobem ochrony danych w stanie spoczynku. SSE szyfruje tylko dane obiektu. Korzystanie z szyfrowania po stronie serwera z kluczami szyfrowania dostarczonymi przez klienta (SSE-C) pozwala ustawić własne klucze do szyfrowania. Serwer zarządza szyfrowaniem podczas zapisu na dyskach i deszyfrowaniem podczas uzyskiwania dostępu do obiektów. Jedyną rzeczą, którą musisz zarządzać, jest dostarczenie własnych kluczy szyfrowania.
SSE-C działa jak w momencie przesyłania obiektu. Serwer używa klucza szyfrowania podanego przez użytkownika w celu zastosowania szyfrowania AES-256 do danych i usuwa klucz szyfrowania z pamięci. Aby ponownie uzyskać dostęp do danych, należy podać ten sam klucz szyfrowania w żądaniu. Serwer weryfikuje, czy podany klucz pasuje, a następnie odszyfrowuje obiekt przed zwróceniem danych obiektu do użytkownika.
Wymagania
Użytkownik z wymaganymi prawami dostępu do bucketu
Poświadczenia EC2 (Jak wygenerować poświadczenia EC2 i zarządzać nimi na NSIS Cloud)
Zainstalowany i skonfigurowany aws
Jeśli nie korzystałeś wcześniej z aws:
$ sudo apt install awscli
Następnie:
$ aws configure
AWS Access Key ID [None]: <your EC2 Access Key>
AWS Secret Access Key [None]: <your EC2 Secret Key>
Default region name [None]: <enter>
Default output format [None]: <enter>
SSE-C w skrócie
Tylko HTTPS S3 odrzuca wszelkie żądania wykonane przez HTTP przy użyciu SSE-C.
W przypadku błędnego wysłania żądania za pomocą protokołu HTTP, dla bezpieczeństwa należy odrzucić klucz i przeprowadzić jego rotację.
ETag w odpowiedzi nie jest MD5 danych obiektu.
Użytkownik jest odpowiedzialny za zarządzanie kluczami szyfrowania i za to, do którego obiektu zostały one użyte.
Jeśli bucket ma włączoną obsługę wersji, każda wersja obiektu może mieć swój własny klucz szyfrowania.
Uwaga
Utrata klucza szyfrowania oznacza również utratę obiektu. Nasze serwery nie przechowują kluczy szyfrowania, więc bez nich nie jest możliwy ponowny dostęp do danych.
REST API
Do szyfrowania lub deszyfrowania obiektów w trybie SSE-C wymagane są następujące nagłówki:
Nagłówek |
Typ |
Opis |
|---|---|---|
x-amz-server-side-encryption-customer-alglubithm |
ciąg |
Algorytm szyfrowania. Musi być ustawiony na AES256 |
x-amz-server-side-encryption-customer-key |
ciąg |
256-bitowy klucz szyfrowania base64 używany w procesie szyfrowania po stronie serwera. |
x-amz-server-side-encryption-customer-key-MD5 |
ciąg |
zakodowany w base64 128-bitowy skrót MD5 klucza szyfrowania zgodnie z RFC 1321. Jest on używany w celu zapewnienia, że szyfrowanie nie zostało uszkodzone podczas procesu transplubtu i kodowania. |
Informacja
Skrót MD5 klucza przed kodowaniem base64.
Nagłówki mają zastosowanie do następujących operacji API:
PutObject
PostObject
CopyObject (do obiektów docelowych)
HeadObject
GetObject
InitiateMultipartUpload
UploadPart
UploadPart-Copy (do części docelowych)
Przykład nr 1 Generowanie wartości nagłówka
secret="32bytesOfTotallyRandomCharacters"
key=$(echo -n $secret | base64)
keymd5=$(echo -n $secret | openssl dgst -md5 -binary | base64)
LUB
openssl rand 32 > sse-c.key
key=$(cat sse-c.key | base64)
keymd5=$(cat sse-c.key | openssl dgst -md5 -binary | base64)
Przykład nr 2 aws-cli (s3api)
Przesyłanie obiektu z włączonym szyfrowaniem SSE-C
aws s3api put-object \
--bucket bucket-name --key object-name \
--body contents.txt \
--sse-customer-algorithm AES256 \
--sse-customer-key $key \
--sse-customer-key-md5 $keymd5 \
--endpoint-url https://s3.waw4-1.cloudferro.com
Przykład nr 3 aws-cli (s3)
aws s3 cp file.txt s3://bucket-name/ \
--sse-c-key $secret \
--sse-c AES256 \
--endpoint https://s3.waw4-1.cloudferro.com
Przykład nr 4 aws-cli (s3 blob)
aws s3 cp file.txt s3://bucket/ \
--sse-c-key fileb://sse-c.key \
--sse-c AES256 \
--endpoint https://s3.waw4-1.cloudferro.com
Informacja
Obecnie s3cmd nie obsługuje szyfrowania SSE-C.
Pobieranie zaszyfrowanego obiektu
aws s3api get-object <file_name> --bucket <bucket_name> \
--key <object_key> \
--sse-customer-key $secret \
--sse-customer-algorithm AES256 \
--endpoint https://s3.waw4-1.cloudferro.com
lub
aws s3api get-object <file_name> --bucket <bucket_name> \
--key <object_key> \
--sse-customer-key fileb://<key_name> \
--sse-customer-algorithm AES256 \
--endpoint https://s3.waw4-1.cloudferro.com