Шифрование и расшифровка приватного экспорта с KMS

AWSBeginner
Практиковаться сейчас

Введение

Приватный экспорт необходимо зашифровать перед хранением. Вы зашифруете небольшой синтетический файл, позволите одному читателю восстановить его исходные байты, диагностируете неудачную расшифровку и запланируете очистку своего ключа.

Сначала выполните Начало работы с AWS на LabEx, Предоставление читателю отчётов минимальных привилегий и Использование временных учётных данных с ролью IAM. Эта новая VM предоставляет собственный файл, сеанс роли читателя и эталонный ключ.

Связь с сертификацией

Эта лабораторная работа помогает на практике изучить следующие темы экзаменов.

Шифрование приватного экспорта

На этом шаге вы создадите ключ 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. Не используйте и не изменяйте эталонный ключ.

Настройка ключа в официальной консоли AWS KMS

Пример официальной консоли: псевдоним, статус 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 разрешает восстановление байтов; оно не предоставляет шифрование или администрирование ключа.

Граница расшифровки KMS

Для восстановления экспорта читателю нужны правильный контекст, разрешение 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 View с разрешением читателю для точного ключа и реальным восстановлением байтов

Диагностика трёх причин неудачной расшифровки

На этом шаге вы различите ошибки контекста, разрешений и состояния ключа. Используйте один и тот же шифротекст во всех проверках, чтобы у каждого результата была ясная причина. Приведённые ниже неудачные команды намеренно выбирают только идентификатор ключа, никогда не открытый текст.

Сначала измените только значение контекста. Даже читатель с разрешением не может расшифровать шифротекст с неправильным контекстом.

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. Сравните вызывающего, контекст и результат отклонённых запросов. Разрешение роли не может исправить несовпадение контекста или отключённый ключ.

Пример 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 для точного ключа и восстановили исходные байты. Неправильный контекст, удалённое разрешение и отключённый ключ вызвали разные ошибки. Затем вы вывели ключ упражнения из использования через период ожидания удаления, сохранив несвязанный эталон.