Настройка шифрования
Получить статус шифрования для бакета
Заголовок раздела «Получить статус шифрования для бакета»- Веб-консоль
- AWS CLI
- Python
- Go
- В веб-консоли выберите нужный проект.
- В списке сервисов выберите Object Storage.
- Нажмите на имя нужного бакета в списке.
- Перейдите на вкладку Защита данных. Информация о статусе будет в блоке Шифрование.
Выполните команду:
1aws s3api get-bucket-encryption --bucket <имя бакета>1{2 "ServerSideEncryptionConfiguration": {3 "Rules": [4 {5 "ApplyServerSideEncryptionByDefault": {6 "SSEAlgorithm": "aws:kms",7 "KMSMasterKeyID": "kms/projects/myproject/cryptoKeys/mykey"8 }9 }10 ]11 }12}Приведенный код на Python:
- Импортирует
boto3— официальный AWS SDK для Python. - Создает сессию и клиент для подключения к Object Storage.
- Определяет имя бакета, для которого нужно получить статус шифрования.
- Получает статус шифрования для бакета и извлекает из него необходимые данные.
- Выводит информацию о статусе и используемом алгоритме шифрования. Если для шифрования используется пользовательский ключ, выводит его ID. Если для шифрования используется системный ключ, выводит соответствующее сообщение.
1import boto32import json3
4session = boto3.session.Session(profile_name='default')5s3 = session.client(6 service_name='s3',7 endpoint_url='https://storage.mwsapis.ru/'8)9
10response = s3.get_bucket_encryption(11 Bucket='<имя бакета>'12)13
14# Извлекает данные из ответа15rules = response['ServerSideEncryptionConfiguration']['Rules'][0]16encryption = rules['ApplyServerSideEncryptionByDefault']17algorithm = encryption['SSEAlgorithm']18
19print(f"Bucket: kms-encryption-test")20print(f"Encryption status: ENABLED")21print(f"SSE Algorithm: {algorithm}")22
23# Если есть пользовательский ключ, выводит его ID24if 'KMSMasterKeyID' in encryption:25 print(f"KMS Key ID: {encryption['KMSMasterKeyID']}")26else: # Если пользовательского ключа нет, выводит информацию об использовании системного ключа27 print("System key is used for encryption")Приведенный код на Go:
- Импортирует необходимые пакеты, в том числе AWS SDK для Go.
- Получает из аргумента командной строки имя бакета, для которого нужно проверить статус шифрования.
- Подгружает конфигурацию из
~/.aws/*. - Создает клиент для подключения к Object Storage.
- Получает статус шифрования для бакета и извлекает из него необходимые данные.
- Выводит информацию о статусе и используемом алгоритме шифрования. Если для шифрования используется пользовательский ключ, выводит его ID. Если для шифрования используется системный ключ, выводит соответствующее сообщение.
1package main2
3import (4 "context"5 "flag"6 "fmt"7 "log"8
9 "github.com/aws/aws-sdk-go-v2/aws"10 "github.com/aws/aws-sdk-go-v2/config"11 "github.com/aws/aws-sdk-go-v2/service/s3"12)13
14func main() {15 // Получает имя бакета из аргумента командной строки16 bucketName := flag.String("b", "", "The name of the bucket")17 flag.Parse()18
19 if *bucketName == "" {20 fmt.Println("You must supply the name of a bucket (-b BUCKET)")21 return22 }23
24 // Подгружает конфигурацию из ~/.aws/*25 cfg, err := config.LoadDefaultConfig(context.TODO())26 if err != nil {27 log.Fatal(err)28 }29
30 // Создает клиент для подключения Object Storage31 client := s3.NewFromConfig(cfg)32
33 // Получает конфигурацию шифрования34 result, err := client.GetBucketEncryption(context.TODO(), &s3.GetBucketEncryptionInput{35 Bucket: aws.String(*bucketName),36 })37 if err != nil {38 log.Fatal(err)39 }40
41 // Извлекает данные из ответа42 if len(result.ServerSideEncryptionConfiguration.Rules) > 0 {43 rule := result.ServerSideEncryptionConfiguration.Rules[0]44 encryption := rule.ApplyServerSideEncryptionByDefault45
46 fmt.Printf("Bucket: %s\n", *bucketName)47 fmt.Printf("Encryption status: ENABLED\n")48 fmt.Printf("SSE Algorithm: %s\n", encryption.SSEAlgorithm)49
50 // Если есть пользовательский ключ, выводит его51 if encryption.KMSMasterKeyID != nil {52 fmt.Printf("KMS Key ID: %s\n", *encryption.KMSMasterKeyID)53 } else { // Если пользовательского ключа нет, выводит информацию об использовании системного ключа54 fmt.Println("System key is used for encryption")55 }56 }57 }Выбрать пользовательский ключ для шифрования
Заголовок раздела «Выбрать пользовательский ключ для шифрования»- Веб-консоль
- AWS CLI
- Python
- Go
- В веб-консоли выберите нужный проект.
- Если у вас нет пользовательского ключа, создайте его.
- В списке сервисов выберите Object Storage.
- Нажмите на имя нужного бакета в списке.
- Перейдите на вкладку Защита данных.
- Нажмите на значок редактирования в блоке Шифрование.
- Перейдите на вкладку Пользовательский ключ и выберите ключ, который будет использоваться для шифрования данных в бакете.
- Нажмите кнопку Сохранить.
Важно
Если у вас нет пользовательского ключа, создайте его.
Выполните команду:
1aws s3api put-bucket-encryption \2 --bucket <имя бакета> \3 --server-side-encryption-configuration '{4 "Rules": [5 {6 "ApplyServerSideEncryptionByDefault": {7 "SSEAlgorithm": "aws:kms",8 "KMSMasterKeyID": "kms/projects/<имя проекта>/cryptoKeys/<имя ключа>"9 }10 }11 ]12 }'Важно
Если у вас нет пользовательского ключа, создайте его.
Приведенный код на Python:
- Импортирует
boto3— официальный AWS SDK для Python. - Создает клиент для подключения к Object Storage.
- Определяет имя бакета, в котором данные будут шифроваться пользовательским ключом.
- Указывает, какие алгоритм и пользовательский ключ будут использоваться для шифрования данных в бакете.
- Применяет настройки шифрования.
- Выводит сообщение о том, что данные в бакете шифруются пользовательским ключом.
1import boto32
3# Создаем клиент для подключения к Object Storage4s3 = boto3.client('s3')5
6# Имя бакета7bucket_name = '<имя бакета>'8
9# Определяет настройки шифрования10server_side_encryption_configuration = {11 'Rules': [12 {13 'ApplyServerSideEncryptionByDefault': {14 'SSEAlgorithm': 'aws:kms',15 'KMSMasterKeyID': 'kms/projects/<имя проекта>/cryptoKeys/<имя ключа>' #ID пользовательского ключа в сервисе KMS16 }17 }18 ]19}20
21# Устанавливает конфигурацию шифрования22s3.put_bucket_encryption(23 Bucket=bucket_name,24 ServerSideEncryptionConfiguration=server_side_encryption_configuration25)26
27# Сообщает, что конфигурация шифрования успешно применена28print("The bucket is encrypted with the specified user key")Важно
Если у вас нет пользовательского ключа, создайте его.
Приведенный код на Go:
- Импортирует необходимые пакеты, в том числе официальный AWS SDK для Go.
- Подгружает конфигурацию из
~/.aws/*. - Создает клиент для доступа к Object Storage.
- Определяет имя бакета, в котором данные будут шифроваться пользовательским ключом.
- Определяет имя ключа, который будет использоваться для шифрования бакета.
- Применяет конфигурацию шифрования к указанному бакету.
- Выводит сообщение об используемом ключе и алгоритме шифрования.
1package main2
3import (4 "context"5 "fmt"6 "log"7 "github.com/aws/aws-sdk-go-v2/aws"8 "github.com/aws/aws-sdk-go-v2/config"9 "github.com/aws/aws-sdk-go-v2/service/s3"10 "github.com/aws/aws-sdk-go-v2/service/s3/types"11)12
13func main() {14 // Подгружает конфигурацию из ~/.aws/*15 cfg, err := config.LoadDefaultConfig(context.TODO())16 if err != nil {17 log.Fatal(err)18 }19
20 // Создает клиент для доступа к Object Storage21 client := s3.NewFromConfig(cfg)22
23 // Имя бакета24 bucketName := "<имя бакета>"25
26 //ID ключа27 keyID := "kms/projects/<имя проекта/cryptoKeys/<имя ключа>"28
29 // Создает конфигурацию шифрования30 encryptionConfig := &types.ServerSideEncryptionConfiguration{31 Rules: []types.ServerSideEncryptionRule{32 {33 ApplyServerSideEncryptionByDefault: &types.ServerSideEncryptionByDefault{34 SSEAlgorithm: types.ServerSideEncryptionAwsKms,35 KMSMasterKeyID: aws.String(keyID),36 },37 },38 },39 }40
41 // Применяет конфигурацию шифрования к бакету42 _, err = client.PutBucketEncryption(context.TODO(), &s3.PutBucketEncryptionInput{43 Bucket: aws.String(bucketName),44 ServerSideEncryptionConfiguration: encryptionConfig,45 })46
47 if err != nil {48 log.Fatalf("Failed to enable encryption: %v", err)49 }50
51 fmt.Printf("Encryption successfully enabled for bucket: %s\n", bucketName)52 fmt.Printf("Encrypted with user key: %s\n", keyID)53 fmt.Printf("SSE Algorithm: %s\n", types.ServerSideEncryptionAwsKms)54}Перейти с пользовательского ключа на системный
Заголовок раздела «Перейти с пользовательского ключа на системный»- Веб-консоль
- AWS CLI
- Python
- Go
- В веб-консоли выберите нужный проект.
- В списке сервисов выберите Object Storage.
- Нажмите на имя нужного бакета в списке.
- Перейдите на вкладку Защита данных.
- Нажмите на значок редактирования в блоке Шифрование.
- Перейдите на вкладку Системный ключ и нажмите кнопку Сохранить.
Выполните команду:
1aws s3api delete-bucket-encryption --bucket <имя бакета>Приведенный код на Python:
Импортирует
boto3— официальный AWS SDK для Python.Определяет функцию
disable_encryption, которая:- создает клиент для подключения к Object Storage;
- вызывает метод
delete_bucket_encryptionдля указанного бакета; - выводит сообщение об успешной отмене шифрования пользовательским ключом и переходе на системный ключ.
Определяет имя бакета и вызывает для него функцию
disable_encryption.
1import boto32from botocore.exceptions import ClientError3
4def disable_encryption(bucket_name):5 try:6 # Создает клиент для подключения к Object Storage7 s3_client = boto3.client('s3')8
9 # Отменяет шифрование пользовательским ключом10 s3_client.delete_bucket_encryption(Bucket=bucket_name)11
12 print(f"Encryption with user key successfully disabled for bucket: {bucket_name}. The system key is used for encryption.")13
14 except ClientError as e:15 print(f"Error disabling encryption: {e}")16 raise17 except Exception as e:18 print(f"Unexpected error: {e}")19 raise20
21# Использование функции22try:23 bucket_name = "<имя бакета>"24 disable_encryption(bucket_name)25except Exception as e:26 print(f"Failed to disable user key encryption: {e}")Приведенный код на Go:
- Импортирует необходимые пакеты, в том числе официальный AWS SDK для Go.
- Подгружает конфигурацию из
~/.aws/*. - Создает клиент для доступа к Object Storage.
- Определяет имя бакета, для которого нужно отменить шифрование пользовательским ключом.
- Вызывает метод
DeleteBucketEncryptionи деактивирует шифрование пользовательским ключом. - Выводит сообщение об успешной отмене шифрования пользовательским ключом и переходе на системный ключ.
1package main2
3import (4 "context"5 "fmt"6 "log"7
8 "github.com/aws/aws-sdk-go-v2/aws"9 "github.com/aws/aws-sdk-go-v2/config"10 "github.com/aws/aws-sdk-go-v2/service/s3"11)12
13func main() {14 // Подгружает конфигурацию из ~/.aws/*15 cfg, err := config.LoadDefaultConfig(context.TODO())16 if err != nil {17 log.Fatal(err)18 }19
20 // Создает клиент для доступа к Object Storage21 client := s3.NewFromConfig(cfg)22
23 // Имя бакета24 bucketName := "<имя бакета>"25
26 // Отменяет шифрование пользовательским ключом для бакета27 _, err = client.DeleteBucketEncryption(context.TODO(), &s3.DeleteBucketEncryptionInput{28 Bucket: aws.String(bucketName),29 })30
31 if err != nil {32 log.Fatalf("Failed to disable encryption: %v", err)33 }34
35 fmt.Printf("Encryption with user key successfully disabled for bucket: %s.\nThe system key is used for encryption.\n", bucketName)36
37}Загрузить объект и зашифровать отдельным пользовательским ключом
Заголовок раздела «Загрузить объект и зашифровать отдельным пользовательским ключом»- AWS CLI
- Python
- Go
Выполните команду:
1aws s3 cp <путь к объекту> s3://<имя бакета>/<имя объекта> --sse aws:kms --sse-kms-key-id kms/projects/<имя проекта>/cryptoKeys/<имя ключа>Приведенный код на Python:
- Импортирует библиотеку
boto3— официальный AWS SDK для Python. - Создает сессию с использованием профиля по умолчанию, который хранится в файле
~/.aws/credentials. - Создает клиент с использованием созданной сессии.
- Вызывает метод
upload_fileи загружает указанный файл в бакет в качестве объекта с указанным именем. Для шифрования объекта используется ключ, переданный в аргументеExtraArgs.
1import boto32
3session = boto3.session.Session(profile_name='default')4s3 = session.client(5 service_name='s3',6 endpoint_url='https://storage.mwsapis.ru/'7)8
9s3.upload_file(10 '<имя файла в локальной системе>',11 '<имя бакета>',12 '<имя объекта в Object Storage>',13 ExtraArgs={14 'ServerSideEncryption': 'aws:kms', # Шифрует данные указанным пользовательским ключом15 'SSEKMSKeyId': 'kms/projects/<имя проекта>/cryptoKeys/<имя ключа>' # ID пользовательского ключа в сервисе KMS16 }17)Приведенный код на Go:
- Импортирует необходимые пакеты, включая AWS SDK для Go.
- Получает из аргументов командной строки:
- путь к файлу для загрузки в Object Storage;
- имя бакета, в который нужно загрузить этот файл;
- ID ключа, который будет использоваться для шифрования файла.
- Подгружает конфигурацию из
~/.aws/*. - Создает клиент для доступа к Object Storage.
- Загружает файл в указанный бакет и шифрует его указанным ключом. Если ключ не был передан в аргументах командной строки, выводит соответствующее сообщение и загружает файл, используя системный ключ для шифрования.
- Выводит сообщение об успешной загрузке.
1package main2
3import (4 "context"5 "flag"6 "fmt"7 "log"8 "os"9 "path/filepath"10
11 "github.com/aws/aws-sdk-go-v2/aws"12 "github.com/aws/aws-sdk-go-v2/config"13 "github.com/aws/aws-sdk-go-v2/service/s3"14 "github.com/aws/aws-sdk-go-v2/service/s3/types"15)16
17func main() {18 // Получает из аргументов командной строки имя бакета, путь к файлу в локальной системе, ID ключа19 bucketName := flag.String("b", "", "The name of the bucket")20 filePath := flag.String("f", "", "Path to the file to upload")21 kmsKeyID := flag.String("k", "", "user key ID for server-side encryption")22
23 flag.Parse()24
25 if *bucketName == "" {26 fmt.Println("You must supply the name of a bucket (-b BUCKET)")27 return28 }29
30 if *filePath == "" {31 fmt.Println("You must supply the path to a file (-f FILE)")32 return33 }34
35 // Подгружает конфигурацию из ~/.aws36 cfg, err := config.LoadDefaultConfig(context.TODO())37 if err != nil {38 log.Fatal(err)39 }40
41 // Создает клиент для подключения к Object Storage42 client := s3.NewFromConfig(cfg)43
44 file, err := os.Open(*filePath)45 if err != nil {46 log.Fatalf("Unable to open file %q, %v", *filePath, err)47 }48 defer file.Close()49
50 // Задает параметры загрузки объекта51 uploadInput := &s3.PutObjectInput{52 Bucket: aws.String(*bucketName),53 Key: aws.String(filepath.Base(*filePath)),54 Body: file,55 }56
57 // Если указан пользовательский ключ, добавляет параметры шифрования58 if *kmsKeyID != "" {59 uploadInput.ServerSideEncryption = types.ServerSideEncryptionAwsKms60 uploadInput.SSEKMSKeyId = aws.String(*kmsKeyID)61 fmt.Printf("Using KMS key: %s for encryption\n", *kmsKeyID)62 } else {63 fmt.Println("No user key provided, uploading without server-side encryption.")64 }65 // В этом случае объект будет зашифрован с помощью системного ключа66
67 // Загружает объект68 _, err = client.PutObject(context.TODO(), uploadInput)69 if err != nil {70 log.Fatalf("Unable to upload %q to %q, %v", *filePath, *bucketName, err)71 }72
73 fmt.Printf("Successfully uploaded %q to %q\n", *filePath, *bucketName)74}