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.
- Cloud Practitioner (CLF-C02) · Tarea 2.2: Cifrado KMS, permisos de descifrado y estados de claves.
- Solutions Architect – Associate (SAA-C03) · Tarea 1.3: Cifrado KMS, permisos de descifrado y estados de claves.
- Developer – Associate (DVA-C02) · Tarea 2.2: Cifrado KMS, permisos de descifrado y estados de claves.
- CloudOps Engineer – Associate (SOA-C03) · Tarea 4.2: Cifrado KMS, permisos de descifrado y estados de claves.
- Security – Specialty (SCS-C03) · Tarea 5.3: Práctica de fundamentos: Cifrado KMS, permisos de descifrado y estados de claves.
- Data Engineer – Associate (DEA-C01) · Tarea 4.3: Práctica de fundamentos: Cifrado KMS, permisos de descifrado y estados de claves.
- DevOps Engineer – Professional (DOP-C02) · Tarea 6.2: Práctica de fundamentos: Cifrado KMS, permisos de descifrado y estados de claves.
- Solutions Architect – Professional (SAP-C02) · Tarea 2.3: Práctica de fundamentos: Cifrado KMS, permisos de descifrado y estados de claves.
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.

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.

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.

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.

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.



