Cifrado en reposo: Cómo utilizar claves administradas por el cliente para cifrar tablas en Amazon Keyspacess. - Amazon Keyspaces (para Apache Cassandra)

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Cifrado en reposo: Cómo utilizar claves administradas por el cliente para cifrar tablas en Amazon Keyspacess.

Puede utilizar la consola o instrucciones CQL para especificar la AWS KMS key para las tablas nuevas y actualizar las claves de cifrado de las tablas existentes en Amazon Keyspaces. En el siguiente tema se describe cómo implementar claves administradas por el cliente para tablas nuevas y existentes.

Requisitos previos: Crear una clave administrada por el cliente utilizando AWS KMS y conceder permisos a Amazon Keyspaces

Para poder proteger una tabla de Amazon Keyspaces con una clave administrada por el cliente, primero debe crear la clave en AWS Key Management Service (AWS KMS) y, a continuación, autorizar a Amazon Keyspaces para que utilice dicha clave.

Paso 1: Crear una clave administrada por el cliente utilizando AWS KMS

Para crear una clave administrada por el cliente a fin de utilizarla para proteger una tabla de Amazon Keyspaces, puede seguir los pasos indicados en Creación de claves KMS de cifrado simétrico con la consola o la API de AWS.

Paso 2: Autorizar el uso de su clave administrada por el cliente

Para que pueda elegir una clave administrada por el cliente para proteger una tabla de Amazon Keyspaces, las políticas de dicha clave administrada por el cliente deben conceder a Amazon Keyspaces permiso para utilizarla en su nombre. Usted tiene el control total sobre las políticas y concesiones de la clave administrada por el cliente. Puede proporcionar estos permisos en una política de claves, una política de IAM o una concesión.

Amazon Keyspaces no necesita autorización adicional para utilizar la Clave propiedad de AWS predeterminada para proteger las tablas de Amazon Keyspaces en su cuenta de AWS.

En los siguientes temas se muestra cómo configurar los permisos necesarios mediante las políticas de IAM y las concesiones que permiten que las tablas de Amazon Keyspaces utilicen una clave administrada por el cliente.

Política de claves para claves administradas por el cliente

Al seleccionar una clave administrada por el cliente para proteger una tabla de Amazon Keyspaces, Amazon Keyspaces obtiene permiso para utilizar la clave administrada por el cliente en nombre de la entidad principal que realiza la selección. Esa entidad principal, un usuario o rol debe tener en la clave administrada por el cliente los permisos que Amazon Keyspaces requiere.

Como mínimo, Amazon Keyspaces requiere los siguientes permisos en una clave administrada por el cliente:

Política de claves de ejemplo

Por ejemplo, la política de claves de ejemplo siguiente proporciona solo los permisos necesarios. La política tiene las siguientes consecuencias:

  • Permite a Amazon Keyspaces utilizar la clave administrada por el cliente en operaciones de cifrado y crear concesiones, pero solo cuando actúa en nombre de entidades principales de la cuenta que tienen permiso para utilizar Amazon Keyspaces. Si las entidades principales especificadas en la declaración de la política no tienen permiso para utilizar Amazon Keyspaces, la llamada falla, aunque proceda del servicio Amazon Keyspaces.

  • La clave de condición kms:ViaService solo permite los permisos cuando la solicitud procede de Amazon Keyspaces en nombre de las entidades principales indicadas en la instrucción de la política. Estas entidades principales no pueden llamar a estas operaciones directamente. Tenga en cuenta que el valor kms:ViaService, cassandra.*.amazonaws.com, tiene un asterisco (*) en la posición Región. Amazon Keyspaces exige que el permiso sea independiente de cualquier Región de AWS en particular.

  • Otorga a los administradores de la clave administrada por el cliente (usuarios que pueden asumir la función db-team) acceso de solo lectura a la clave administrada por el cliente y permiso para revocar concesiones, incluyendo las concesiones que Amazon Keyspaces requiere para proteger la tabla.

  • Otorga a Amazon Keyspaces acceso de solo lectura a la clave administrada por el cliente. En este caso, Amazon Keyspaces puede llamar directamente a estas operaciones. No tiene que actuar en nombre de una entidad principal de la cuenta.

Antes de utilizar una política de claves de ejemplo, sustituya las entidades principales de ejemplo por las entidades principales reales de su cuenta de Cuenta de AWS.

{ "Id": "key-policy-cassandra", "Version":"2012-10-17", "Statement": [ { "Sid" : "Allow access through Amazon Keyspaces for all principals in the account that are authorized to use Amazon Keyspaces", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey", "kms:CreateGrant" ], "Resource": "*", "Condition": { "StringLike": { "kms:ViaService" : "cassandra.*.amazonaws.com" } } }, { "Sid": "Allow administrators to view the customer managed key and revoke grants", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/db-team" }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource": "*" } ] }

Uso de concesiones para autorizar a Amazon Keyspaces

Además de las políticas de claves, Amazon Keyspaces utiliza concesiones para establecer permisos en una clave administrada por el cliente. Para ver las concesiones de una clave administrada por el cliente en su cuenta, utilice la operación ListGrants. Amazon Keyspaces no necesita concesiones, ni ningún permiso adicional, para utilizar la Clave propiedad de AWS para proteger su tabla.

Amazon Keyspaces utiliza los permisos de concesión cuando realiza tareas de mantenimiento del sistema en segundo plano y de protección continua de datos. También utiliza las concesiones para generar las claves de la tabla.

Cada concesión es específica de una tabla. Si la cuenta incluye múltiples tablas cifradas bajo la misma clave administrada por el cliente, existe una concesión de cada tipo para cada tabla. La concesión está limitada por el contexto de cifrado de Amazon Keyspaces, que incluye el nombre de la tabla y el ID de la Cuenta de AWS. La concesión incluye el permiso para retirar la concesión si ya no fuera necesaria.

Para crear las concesiones, Amazon Keyspaces debe tener permiso para llamar a CreateGrant en nombre del usuario que creó la tabla cifrada.

La política de claves también puede permitir a la cuenta revocar la concesión en la clave administrada por el cliente. Sin embargo, si revoca la concesión en una tabla cifrada activa, Amazon Keyspaces no podrá proteger ni mantener la tabla.

Paso 3: Especificar una clave administrada por el cliente para una tabla nueva

Siga estos pasos para especificar la clave administrada por el cliente en una tabla nueva mediante la consola de Amazon Keyspaces o CQL.

Creación de una tabla cifrada utilizando una clave administrada por el cliente (consola)

  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon Keyspaces en https://console.aws.amazon.com/keyspaces/home.

  2. En el panel de navegación, elija Tables (Tablas) y, a continuación, seleccione Create table (Crear tabla).

  3. En la página Crear tabla, en la sección Detalles de la tabla, seleccione un espacio de claves y proporcione un nombre para la nueva tabla.

  4. En la sección Esquema, cree el esquema para su tabla.

  5. En la sección Configuración de la tabla, elija Personalizar configuración.

  6. Continúe en Configuración del cifrado.

    En este paso, usted selecciona la configuración del cifrado para la tabla.

    En la sección Cifrado en reposo, en Elegir una AWS KMS key, elija la opción Elegir una clave KMS diferente (avanzada) y, en el campo de búsqueda, elija una AWS KMS key o introduzca un nombre de recurso de Amazon (ARN).

    nota

    Si la clave que ha seleccionado no es accesible o carece de los permisos necesarios, consulte Solución de problemas de acceso a la clave en la Guía para desarrolladores de AWS Key Management Service.

  7. Elija Crear para crear la tabla cifrada.

Creación de una tabla nueva mediante una clave administrada por el cliente para el cifrado en reposo (CQL)

Para crear una nueva tabla que utilice una clave administrada por el cliente para el cifrado en reposo, puede utilizar la instrucción CREATE TABLE como se muestra en el siguiente ejemplo. Asegúrese de sustituir el ARN de la clave por el ARN de una clave válida con permisos concedidos a Amazon Keyspaces.

CREATE TABLE my_keyspace.my_table(id bigint, name text, place text STATIC, PRIMARY KEY(id, name)) WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111' } };

Si recibe una Invalid Request Exception, debe confirmar que la clave administrada por el cliente sea válida y que Amazon Keyspaces disponga de los permisos necesarios. Para confirmar que la clave se haya configurado correctamente, consulte Solución de problemas de acceso a la clave en la Guía para desarrolladores de AWS Key Management Service.

Paso 4: Actualizar la clave de cifrado de una tabla existente

También puede utilizar la consola de Amazon Keyspaces o CQL para cambiar las claves de cifrado de una tabla existente entre una Clave propiedad de AWS y una clave KMS administrada por el cliente en cualquier momento.

Actualización de una tabla existente con la nueva clave administrada por el cliente (consola)

  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon Keyspaces en https://console.aws.amazon.com/keyspaces/home.

  2. En el panel de navegación, elija Tables (Tablas).

  3. Elija la tabla que desee actualizar y luego la pestaña Configuración adicional.

  4. En la sección Cifrado en reposo, elija Administrar cifrado para editar la configuración del cifrado de la tabla.

    En Elegir una AWS KMS key, elija la opción Elegir una clave KMS diferente (avanzada) y, en el campo de búsqueda, elija una AWS KMS key o introduzca un nombre de recurso de Amazon (ARN).

    nota

    Si la clave que ha seleccionado no es válida, consulte Solución de problemas de acceso a la clave en la Guía para desarrolladores de AWS Key Management Service.

    Como alternativa, también puede elegir una Clave propiedad de AWS para una tabla que esté cifrada con una clave administrada por el cliente.

  5. Elija Guardar para guardar los cambios en la tabla.

Actualización de la clave de cifrado utilizada en una tabla existente

Para cambiar la clave de cifrado de una tabla existente, utilice la instrucción ALTER TABLE para especificar una clave administrada por el cliente para el cifrado en reposo. Asegúrese de sustituir el ARN de la clave por el ARN de una clave válida con permisos concedidos a Amazon Keyspaces.

ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111' } };

Si recibe una Invalid Request Exception, debe confirmar que la clave administrada por el cliente sea válida y que Amazon Keyspaces disponga de los permisos necesarios. Para confirmar que la clave se haya configurado correctamente, consulte Solución de problemas de acceso a la clave en la Guía para desarrolladores de AWS Key Management Service.

Para volver a cambiar la clave de cifrado a la opción predeterminada de cifrado en reposo con las Claves propiedad de AWS, puede utilizar la instrucción ALTER TABLE como se muestra en el siguiente ejemplo.

ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type' : 'AWS_OWNED_KMS_KEY' } };

Paso 5: Utilizar el contexto de cifrado de Amazon Keyspaces en los registros

Un contexto de cifrado es un conjunto de pares de clave-valor que contienen datos no secretos arbitrarios. Cuando se incluye un contexto de cifrado en una solicitud para cifrar datos, AWS KMS vincula criptográficamente el contexto de cifrado a los datos cifrados. Para descifrar los datos, es necesario pasar el mismo contexto de cifrado.

Amazon Keyspaces utiliza el mismo contexto de cifrado en todas las operaciones de cifrado de AWS KMS. Si utiliza una clave administrada por el cliente para proteger su tabla de Amazon Keyspaces, puede utilizar el contexto de cifrado para identificar el uso de la clave administrada por el cliente en los registros de auditoría y en los registros. También aparece en texto sin formato en los registros, como en los registros de AWS CloudTrail y en los Registros de Amazon CloudWatch.

En su solicitudes a AWS KMS, Amazon Keyspaces utiliza un contexto de cifrado con tres pares clave-valor.

"encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "mytable" "aws:cassandra:subscriberId": "111122223333" }
  • Espacio de claves: el primer par clave-valor identifica el espacio de claves que incluye la tabla que Amazon Keyspaces está cifrando. La clave es aws:cassandra:keyspaceName. El valor es el nombre del espacio de claves.

    "aws:cassandra:keyspaceName": "<keyspace-name>"

    Por ejemplo:

    "aws:cassandra:keyspaceName": "my_keyspace"
  • Tabla: el segundo par clave-valor identifica la tabla que Amazon Keyspaces está cifrando. La clave es aws:cassandra:tableName. El valor es el nombre de la tabla.

    "aws:cassandra:tableName": "<table-name>"

    Por ejemplo:

    "aws:cassandra:tableName": "my_table"
  • Cuenta: el tercer par clave-valor identifica la Cuenta de AWS. La clave es aws:cassandra:subscriberId. El valor es el ID de la cuenta.

    "aws:cassandra:subscriberId": "<account-id>"

    Por ejemplo:

    "aws:cassandra:subscriberId": "111122223333"

Paso 6: Configurar el monitoreo con AWS CloudTrail

Si utiliza una clave administrada por el cliente para proteger sus tablas de Amazon Keyspaces, puede utilizar los registros de AWS CloudTrail para realizar un seguimiento de las solicitudes que Amazon Keyspaces envía a AWS KMS en su nombre.

Las solicitudes GenerateDataKey, DescribeKey, Decrypt y CreateGrant se tratan en esta sección. Además, Amazon Keyspaces utiliza una operación RetireGrant para eliminar una concesión cuando usted elimina una tabla.

GenerateDataKey

Amazon Keyspaces crea una clave de tabla única para cifrar los datos en reposo. Envía una solicitud GenerateDataKey a AWS KMS que especifica la clave KMS de la tabla.

El evento que registra la operación GenerateDataKey es similar al siguiente evento de ejemplo. El usuario es la cuenta de servicio de Amazon Keyspaces. Los parámetros incluyen el Nombre de recurso de Amazon (ARN) de la clave administrada por el cliente, un especificador de clave que requiere una clave de 256 bits y el contexto de cifrado que identifica la tabla y la Cuenta de AWS.

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T04:56:05Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keySpec": "AES_256", "encryptionContext": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" }, "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" }, "responseElements": null, "requestID": "5e8e9cb5-9194-4334-aacc-9dd7d50fe246", "eventID": "49fccab9-2448-4b97-a89d-7d5c39318d6f", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012", "sharedEventID": "84fbaaf0-9641-4e32-9147-57d2cb08792e" }
DescribeKey

Además, Amazon Keyspaces utiliza una operación DescribeKey para determinar si la clave KMS que ha seleccionado existe en la cuenta y región.

El evento que registra la operación DescribeKey es similar al siguiente evento de ejemplo. El usuario es la cuenta de servicio de Amazon Keyspaces. Los parámetros incluyen el ARN de la clave administrada por el cliente y un especificador de clave que requiere una clave de 256 bits.

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AIDAZ3FNIIVIZZ6H7CFQG", "arn": "arn:aws:iam::123SAMPLE012:user/admin", "accountId": "123SAMPLE012", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "admin", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-04-16T04:55:42Z" } }, "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T04:55:58Z", "eventSource": "kms.amazonaws.com", "eventName": "DescribeKey", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" }, "responseElements": null, "requestID": "c25a8105-050b-4f52-8358-6e872fb03a6c", "eventID": "0d96420e-707e-41b9-9118-56585a669658", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012" }
Decrypt

Al acceder a una tabla de Amazon Keyspaces cifrada, Amazon Keyspaces necesita descifrar la clave de la tabla de manera que pueda descifrar las claves de menor nivel en la jerarquía. A continuación, descifra los datos de la tabla. Para descifrar la clave de la tabla, Amazon Keyspaces envía una solicitud Decrypt a AWS KMS que especifica la clave KMS de la tabla.

El evento que registra la operación Decrypt es similar al siguiente evento de ejemplo. El usuario es la entidad principal en su cuenta de Cuenta de AWS que está accediendo a la tabla. Los parámetros incluyen la clave cifrada de la tabla (como un blob de texto cifrado) y el contexto de cifrado que identifica la tabla y la Cuenta de AWS. AWS KMS deduce el ID de la clave administrada por el cliente a partir del texto cifrado.

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T05:29:44Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "encryptionContext": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" }, "encryptionAlgorithm": "SYMMETRIC_DEFAULT" }, "responseElements": null, "requestID": "50e80373-83c9-4034-8226-5439e1c9b259", "eventID": "8db9788f-04a5-4ae2-90c9-15c79c411b6b", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012", "sharedEventID": "7ed99e2d-910a-4708-a4e3-0180d8dbb68e" }
CreateGrant

Al utilizar una clave administrada por el cliente para proteger su tabla de Amazon Keyspaces, Amazon Keyspaces utiliza concesiones para permitir que el servicio realice tareas continuas de protección, mantenimiento y durabilidad de los datos. Estas concesiones no son necesarias en las Claves propiedad de AWS.

Las concesiones que Amazon Keyspaces crea son específicas de una tabla. El principal en la solicitud CreateGrant es el usuario que creó la tabla.

El evento que registra la operación CreateGrant es similar al siguiente evento de ejemplo. Los parámetros incluyen el ARN de la clave administrada por el cliente para la tabla, la entidad principal que recibe la concesión y la entidad principal que la retira (el servicio Amazon Keyspaces), y las operaciones que cubre la concesión. También incluye una restricción que exige que todas las operaciones de cifrado utilicen el contexto de cifrado especificado.

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AIDAZ3FNIIVIZZ6H7CFQG", "arn": "arn:aws:iam::arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111:user/admin", "accountId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "admin", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-04-16T04:55:42Z" } }, "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T05:11:10Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keyId": "a7d328af-215e-4661-9a69-88c858909f20", "operations": [ "DescribeKey", "GenerateDataKey", "Decrypt", "Encrypt", "ReEncryptFrom", "ReEncryptTo", "RetireGrant" ], "constraints": { "encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" } }, "retiringPrincipal": "cassandratest.us-east-1.amazonaws.com", "granteePrincipal": "cassandratest.us-east-1.amazonaws.com" }, "responseElements": { "grantId": "18e4235f1b07f289762a31a1886cb5efd225f069280d4f76cd83b9b9b5501013" }, "requestID": "b379a767-1f9b-48c3-b731-fb23e865e7f7", "eventID": "29ee1fd4-28f2-416f-a419-551910d20291", "readOnly": false, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012" }