Cifrar y descifrar una exportación privada con KMS

AWSBeginner
Practicar Ahora

Introducción

Una exportación privada necesita cifrado antes de almacenarse. Cifrarás un pequeño archivo sintético, permitirás que un lector recupere sus bytes originales, diagnosticarás descifrados fallidos y programarás la limpieza de tu clave.

Completa primero Empezar con AWS en LabEx, Dar mínimo privilegio a un lector de informes y Usar credenciales temporales con un rol de IAM. Esta VM nueva proporciona su propio archivo, sesión del rol lector y clave de referencia.

Relación con las certificaciones

Este laboratorio ofrece práctica para los siguientes temas de examen.

Cifrar la exportación privada

En este paso, crearás una clave de AWS Key Management Service (KMS) y convertirás la exportación suministrada en texto cifrado. Usa el archivo sintético suministrado private-export.json en lugar de datos personales. El perfil export-reader usa una sesión temporal del rol lector preparado, inicialmente sin permiso KMS. Conserva alias/labex-sec01-reference.

Abre AWS View, junto a Terminal, para comparar el estado de claves, las concesiones del lector y los resultados de solicitudes criptográficas. Sus hashes de bytes permiten comparar resultados sin mostrar datos privados.

Una clave simétrica usa el mismo material protegido de clave para cifrar y descifrar; KMS mantiene ese material de clave dentro del servicio. Un alias da un nombre legible a una clave sin sustituir su ARN único.

Comienza en el directorio de proyecto suministrado. cd cambia tu directorio actual; la consulta del llamante confirma la identidad del operador preparado sin imprimir credenciales.

cd /home/labex/project
aws sts get-caller-identity --query Arn --output text

Espera el ARN de usuario labex-sec01-operator. Crea tu propia clave. --query selecciona un campo de la respuesta, --output text elimina las comillas JSON y $(...) almacena ese resultado en una variable del shell para comandos posteriores.

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

Espera Enabled y SYMMETRIC_DEFAULT. No uses ni modifiques la clave de referencia.

Configuración de clave en la Console oficial de AWS KMS

Referencia de la Console oficial: el alias, el estado Enabled y el ARN corresponden a la identidad y el estado de la clave que acabas de consultar. Son valores de ejemplo de AWS; sigue usando tu propio KEY_ARN en Terminal.

Fuente: AWS KMS.

Un contexto de cifrado es un conjunto de etiquetas no secretas vinculadas al texto cifrado. El descifrado debe proporcionar las mismas etiquetas. Aquí Purpose=private-export identifica el uso previsto de esta exportación. Los valores de contexto no son un lugar para contraseñas ni datos personales.

KMS Encrypt maneja textos en claro pequeños; esta exportación preparada está muy por debajo del límite de 4 KiB. fileb:// lee la entrada como bytes binarios. La CLI representa el texto cifrado devuelto como base64; base64 --decode lo convierte de nuevo en un archivo binario. La tubería envía la salida al siguiente comando y > escribe el resultado en el archivo indicado.

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

Compara hashes de bytes con sha256sum. Los hashes distintos muestran que el texto cifrado difiere de los datos originales; esto por sí solo no es evidencia de permisos.

sha256sum private-export.json private-export.kms

Abre AWS View. Customer key inventory debe mostrar tu clave habilitada, mientras Cryptographic requests muestra una solicitud Encrypt permitida del operador cuya entrada coincide con la exportación.

Conceder acceso a un rol lector

En este paso, permitirás que el lector de la aplicación descifre únicamente con tu clave de exportación. Un permiso de rol IAM especifica tanto una acción como el recurso al que se aplica. kms:Decrypt permite recuperar bytes; no concede cifrado ni administración de claves.

Límite de descifrado de KMS

El lector necesita el contexto correcto, una concesión Decrypt y una clave habilitada para recuperar la exportación.

Primero prueba el perfil lector antes de añadir una concesión. --profile export-reader selecciona la sesión temporal preparada del rol en lugar del operador. El comando debe fallar con una respuesta de acceso denegado y no debe devolver texto en claro.

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

Crea un documento de política. El here-document escribe las líneas entre <<EOF y EOF en read-export.json; el shell expande $KEY_ARN al ARN exacto de la clave. Esta concesión no usa una acción comodín ni un recurso comodín.

cat > read-export.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [{"Effect": "Allow", "Action": "kms:Decrypt", "Resource": "$KEY_ARN"}]
}
EOF

Adjunta esa política insertada, o inline policy, al rol lector. Una política insertada pertenece a este rol y puede eliminarse de forma independiente durante la limpieza. La clave suministrada usa su política estándar de clave de la misma cuenta, que permite a los permisos IAM autorizar este rol.

aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json

Ahora recupera los bytes cifrados con la sesión lectora. El comando selecciona el campo de texto en claro base64, lo decodifica y escribe la exportación restaurada sin mostrar su contenido.

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 compara los bytes reales de archivos. Con &&, el mensaje se imprime únicamente cuando esa comparación tiene éxito.

cmp private-export.json restored-export.json && echo "Original export bytes recovered"

Espera Original export bytes recovered. AWS View debe mostrar la política lectora de clave exacta y un Decrypt permitido del rol lector cuyos bytes recuperados coinciden con la exportación. Mantén este rol limitado a Decrypt en tu clave.

Ejemplo de AWS View con una concesión lectora de clave exacta y recuperación real de bytes

Diagnosticar tres fallos de descifrado

En este paso, distinguirás fallos de contexto, permisos y estado de clave. Conserva el mismo texto cifrado durante todo el proceso para que cada resultado tenga una causa clara. Los comandos fallidos siguientes seleccionan intencionadamente solo un identificador de clave, nunca texto en claro.

Primero cambia únicamente el valor de contexto. Incluso un lector con permiso no puede descifrar texto cifrado con un contexto incorrecto.

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

Espera InvalidCiphertextException. La clave y la concesión del rol siguen existiendo, pero el contexto no coincide con el usado para Encrypt.

Después elimina la concesión del rol y repite la solicitud con contexto correcto. Eliminar una política insertada cambia la autorización sin modificar la clave ni el texto cifrado.

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

Espera una respuesta de acceso denegado. Restablece la concesión acotada antes de la siguiente prueba.

aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json

Por último, deshabilita la clave. Una clave deshabilitada permanece en el inventario, pero no puede realizar operaciones criptográficas. Usa el perfil del operador, que tiene permiso, para aislar el fallo de estado de clave.

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

Espera DisabledException. Habilita la clave y repite la recuperación correcta del lector para confirmar que vuelve el comportamiento normal.

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"

Inspecciona la tabla Cryptographic requests de AWS View. Compara el llamante, el contexto y el resultado de las solicitudes denegadas. Una concesión de rol no puede corregir una discrepancia de contexto ni una clave deshabilitada.

Ejemplo de AWS View con solicitudes denegadas seguidas del acceso lector restablecido

Retirar de forma segura la clave del laboratorio

En este paso, eliminarás la concesión lectora y el alias y después programarás la eliminación únicamente de tu clave de exportación. La eliminación de claves KMS tiene un periodo de espera: PendingDeletion es el estado inmediato esperado, no prueba de que una clave ya haya desaparecido. Durante ese periodo la clave no puede descifrar.

Confirma que el ARN sigue perteneciendo a tu clave de exportación del laboratorio antes de programar la eliminación.

aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[Description,KeyState]' --output text

Espera labex-sec01-owned-export y Enabled. Elimina únicamente la concesión del rol que añadiste y el alias que creaste.

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

Programa la eliminación de la clave con el periodo mínimo de espera de siete días.

aws kms schedule-key-deletion --key-id "$KEY_ARN" --pending-window-in-days 7 --query DeletionDate --output text

El comando devuelve la fecha programada de eliminación. Confirma el estado real de la clave con una lectura independiente y conserva la clave de referencia ajena al laboratorio.

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

Espera PendingDeletion para tu clave y Enabled para la referencia. AWS View debe mostrar ninguna concesión lectora y Reference preserved. Usa rm -f para eliminar únicamente los artefactos locales de exportación indicados; tolera un archivo ausente sin eliminar otros archivos del proyecto.

rm -f private-export.json private-export.kms restored-export.json read-export.json

Ejecuta la verificación de este paso mientras el perfil del operador siga disponible. Después de que pase, elimina los perfiles desechables de CLI de esta VM y borra la variable de clave. Esto elimina credenciales locales de sesión; no cancela la eliminación programada de la clave en la nube.

rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset KEY_ARN

Resumen

Cifraste bytes reales de exportación con una clave KMS del cliente y un contexto no secreto, concediste a un rol lector Decrypt en la clave exacta y recuperaste los bytes originales. Un contexto incorrecto, una concesión eliminada y una clave deshabilitada provocaron fallos distintos. Después retiraste la clave del laboratorio mediante su periodo de espera de eliminación conservando la referencia ajena a él.