Введение
Приватный экспорт необходимо зашифровать перед хранением. Вы зашифруете небольшой синтетический файл, позволите одному читателю восстановить его исходные байты, диагностируете неудачную расшифровку и запланируете очистку своего ключа.
Сначала выполните Начало работы с AWS на LabEx, Предоставление читателю отчётов минимальных привилегий и Использование временных учётных данных с ролью IAM. Эта новая VM предоставляет собственный файл, сеанс роли читателя и эталонный ключ.
Связь с сертификацией
Эта лабораторная работа помогает на практике изучить следующие темы экзаменов.
- Cloud Practitioner (CLF-C02) · Задача 2.2: Шифрование KMS, разрешения расшифровки и состояния ключей.
- Solutions Architect – Associate (SAA-C03) · Задача 1.3: Шифрование KMS, разрешения расшифровки и состояния ключей.
- Developer – Associate (DVA-C02) · Задача 2.2: Шифрование KMS, разрешения расшифровки и состояния ключей.
- CloudOps Engineer – Associate (SOA-C03) · Задача 4.2: Шифрование KMS, разрешения расшифровки и состояния ключей.
- Security – Specialty (SCS-C03) · Задача 5.3: Базовая практика: Шифрование KMS, разрешения расшифровки и состояния ключей.
- Data Engineer – Associate (DEA-C01) · Задача 4.3: Базовая практика: Шифрование KMS, разрешения расшифровки и состояния ключей.
- DevOps Engineer – Professional (DOP-C02) · Задача 6.2: Базовая практика: Шифрование KMS, разрешения расшифровки и состояния ключей.
- Solutions Architect – Professional (SAP-C02) · Задача 2.3: Базовая практика: Шифрование KMS, разрешения расшифровки и состояния ключей.
Шифрование приватного экспорта
На этом шаге вы создадите ключ AWS Key Management Service (KMS) и преобразуете предоставленный экспорт в шифротекст. Используйте предоставленный синтетический private-export.json вместо персональных данных. Профиль export-reader использует временный сеанс подготовленной роли читателя, изначально без разрешений KMS. Сохраните alias/labex-sec01-reference.
Откройте AWS View рядом с Terminal, чтобы сравнивать состояние ключа, разрешения читателя и результаты криптографических запросов. Хеши байтов позволяют сравнивать результаты без отображения приватных данных.
Симметричный ключ использует один и тот же защищённый ключевой материал для шифрования и расшифровки; KMS хранит этот материал внутри сервиса. Псевдоним даёт ключу читаемое имя, не заменяя его уникальный ARN.
Начните в предоставленном каталоге проекта. cd изменяет текущий каталог; запрос идентификации вызывающего подтверждает подготовленную идентификацию оператора без вывода учётных данных.
cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
Ожидайте ARN пользователя labex-sec01-operator. Создайте свой ключ. --query выбирает одно поле ответа, --output text убирает кавычки JSON, а $(...) сохраняет результат в переменной оболочки для последующих команд.
KEY_ARN=$(aws kms create-key --description labex-sec01-owned-export --query KeyMetadata.Arn --output text)
aws kms create-alias --alias-name alias/labex-sec01-private-export --target-key-id "$KEY_ARN"
aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[KeyState,KeySpec]' --output text
Ожидайте Enabled и SYMMETRIC_DEFAULT. Не используйте и не изменяйте эталонный ключ.

Пример официальной консоли: псевдоним, статус Enabled и ARN соответствуют идентификации и состоянию ключа, которые вы только что запросили. Это примеры значений AWS; продолжайте использовать собственный KEY_ARN в Terminal.
Источник: AWS KMS.
Контекст шифрования — набор несекретных меток, связанных с шифротекстом. При расшифровке необходимо предоставить те же метки. Здесь Purpose=private-export обозначает назначение этого экспорта. Значения контекста не предназначены для паролей или персональных данных.
KMS Encrypt обрабатывает небольшие открытые тексты; размер подготовленного экспорта значительно меньше предела 4 KiB. fileb:// читает входные данные как двоичные байты. CLI представляет возвращённый шифротекст в base64; base64 --decode преобразует его обратно в двоичный файл. Конвейер передаёт вывод следующей команде, а > записывает результат в указанный файл.
aws kms encrypt --key-id "$KEY_ARN" --plaintext fileb://private-export.json --encryption-context Purpose=private-export --query CiphertextBlob --output text | base64 --decode > private-export.kms
Сравните хеши байтов с помощью sha256sum. Разные хеши показывают, что шифротекст отличается от исходных данных; это само по себе не доказывает наличие разрешений.
sha256sum private-export.json private-export.kms
Откройте AWS View. Customer key inventory должен показывать ваш включённый ключ, а Cryptographic requests — разрешённый запрос Encrypt оператора, входные данные которого совпадают с экспортом.
Предоставление доступа одной роли читателя
На этом шаге вы позволите читателю приложения расшифровывать данные только с вашим ключом экспорта. Разрешение роли IAM задаёт и действие, и ресурс, к которому оно применяется. kms:Decrypt разрешает восстановление байтов; оно не предоставляет шифрование или администрирование ключа.

Для восстановления экспорта читателю нужны правильный контекст, разрешение Decrypt и включённый ключ.
Сначала попробуйте профиль читателя до добавления разрешения. --profile export-reader выбирает подготовленный временный сеанс роли вместо оператора. Команда должна завершиться отказом в доступе и не должна вернуть открытый текст.
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text
Создайте документ политики. Here-document записывает строки между <<EOF и EOF в read-export.json; оболочка подставляет в $KEY_ARN точный ARN ключа. Это разрешение не использует подстановочный символ ни для действия, ни для ресурса.
cat > read-export.json <<EOF
{
"Version": "2012-10-17",
"Statement": [{"Effect": "Allow", "Action": "kms:Decrypt", "Resource": "$KEY_ARN"}]
}
EOF
Прикрепите эту встроенную политику к роли читателя. Встроенная политика принадлежит этой роли и может быть отдельно удалена при очистке. Предоставленный ключ использует стандартную политику ключа для того же аккаунта, которая позволяет разрешениям IAM авторизовать эту роль.
aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json
Теперь восстановите зашифрованные байты с сеансом читателя. Команда выбирает поле открытого текста в base64, декодирует его и записывает восстановленный экспорт без отображения содержимого.
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json
cmp сравнивает действительные байты файлов. С && сообщение выводится только при успешном сравнении.
cmp private-export.json restored-export.json && echo "Original export bytes recovered"
Ожидайте Original export bytes recovered. AWS View должен показывать политику читателя для точного ключа и разрешённый Decrypt роли читателя, восстановленные байты которого совпадают с экспортом. Ограничьте эту роль действием Decrypt для вашего ключа.

Диагностика трёх причин неудачной расшифровки
На этом шаге вы различите ошибки контекста, разрешений и состояния ключа. Используйте один и тот же шифротекст во всех проверках, чтобы у каждого результата была ясная причина. Приведённые ниже неудачные команды намеренно выбирают только идентификатор ключа, никогда не открытый текст.
Сначала измените только значение контекста. Даже читатель с разрешением не может расшифровать шифротекст с неправильным контекстом.
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=wrong-context --query KeyId --output text
Ожидайте InvalidCiphertextException. Ключ и разрешение роли по-прежнему существуют, но контекст не совпадает с использованным при Encrypt.
Затем удалите разрешение роли и повторите запрос с правильным контекстом. Удаление встроенной политики изменяет авторизацию, не меняя ключ или шифротекст.
aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text
Ожидайте отказ в доступе. Восстановите узкое разрешение перед следующей проверкой.
aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json
Наконец отключите ключ. Отключённый ключ остаётся в перечне ресурсов, но не может выполнять криптографические операции. Используйте профиль оператора, у которого есть разрешение, чтобы изолировать ошибку состояния ключа.
aws kms disable-key --key-id "$KEY_ARN"
aws kms decrypt --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text
Ожидайте DisabledException. Включите ключ и повторите успешное восстановление читателем, чтобы подтвердить возврат нормального поведения.
aws kms enable-key --key-id "$KEY_ARN"
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json
cmp private-export.json restored-export.json && echo "Reader access restored"
Проверьте таблицу Cryptographic requests в AWS View. Сравните вызывающего, контекст и результат отклонённых запросов. Разрешение роли не может исправить несовпадение контекста или отключённый ключ.

Безопасный вывод ключа упражнения из использования
На этом шаге вы удалите разрешение читателя и псевдоним, затем запланируете удаление только своего ключа экспорта. Удаление ключа KMS имеет период ожидания: PendingDeletion — ожидаемое непосредственное состояние, а не доказательство того, что ключ уже исчез. В течение этого периода ключ не может расшифровывать данные.
Перед планированием удаления подтвердите, что ARN по-прежнему принадлежит вашему ключу экспорта.
aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[Description,KeyState]' --output text
Ожидайте labex-sec01-owned-export и Enabled. Удалите только добавленное вами разрешение роли и созданный вами псевдоним.
aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms delete-alias --alias-name alias/labex-sec01-private-export
Запланируйте удаление ключа с минимальным семидневным периодом ожидания.
aws kms schedule-key-deletion --key-id "$KEY_ARN" --pending-window-in-days 7 --query DeletionDate --output text
Команда возвращает запланированную дату удаления. Подтвердите действительное состояние ключа отдельным чтением и сохраните несвязанный эталонный ключ.
aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms describe-key --key-id alias/labex-sec01-reference --query KeyMetadata.KeyState --output text
Ожидайте PendingDeletion для вашего ключа и Enabled для эталона. AWS View должен показывать отсутствие разрешения читателя и Reference preserved. Используйте rm -f, чтобы удалить только названные локальные файлы экспорта; команда допускает отсутствие файла, не удаляя другие файлы проекта.
rm -f private-export.json private-export.kms restored-export.json read-export.json
Выполните проверку этого шага, пока профиль оператора ещё доступен. После её успешного завершения удалите временные профили CLI этой VM и сбросьте переменную ключа. Это удаляет локальные учётные данные сеанса; запланированное удаление облачного ключа не отменяется.
rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset KEY_ARN
Резюме
Вы зашифровали действительные байты экспорта ключом KMS под управлением клиента с несекретным контекстом, предоставили одной роли читателя Decrypt для точного ключа и восстановили исходные байты. Неправильный контекст, удалённое разрешение и отключённый ключ вызвали разные ошибки. Затем вы вывели ключ упражнения из использования через период ожидания удаления, сохранив несвязанный эталон.



