Cifrado de los datos de ejecución duradera de AWS Lambda
Con las funciones duraderas de AWS Lambda, puede crear aplicaciones resilientes de varios pasos que se ejecutan durante un máximo de un año y utilizan puntos de comprobación para recuperar cada ejecución tras un error mediante la reproducción del trabajo completado.
Lambda siempre cifra en reposo los datos de ejecución duradera. También es posible configurar en la función una clave de AWS KMS propia administrada por el cliente para controlar la rotación, disponer de visibilidad para las auditorías o cumplir los requisitos de conformidad. Con una clave administrada por el cliente, solo las entidades principales autorizadas pueden leer los datos de ejecución.
Funcionamiento del cifrado
Una ejecución duradera de Lambda utiliza durante toda su duración la misma clave de KMS con la que se inició. El cambio o la eliminación de la clave de la función solo afecta a las ejecuciones que se inicien después del cambio. Consulte Cuando la clave administrada por el cliente no está disponible para obtener información sobre el comportamiento de una ejecución duradera cuando su clave no está disponible.
Las claves administradas por el cliente ocasionan cargos de AWS KMS estándar. Para obtener más información sobre precios, consulta precios de AWS Key Management Service
Qué se cifra
Cuando se configura una clave administrada por el cliente en una función duradera, Lambda utiliza esa clave para cifrar en reposo los siguientes datos de la ejecución duradera:
La carga útil de entrada que se proporciona con cada solicitud
Invoke.Los datos de los puntos de comprobación que conserva la API
CheckpointDurableExecution, incluidos los resultados y errores de los pasos, así como las entradas de invocación procesadas.Los resultados y errores de la ejecución.
Los resultados y errores de devolución de llamada que se envían mediante
SendDurableExecutionCallbackSuccessySendDurableExecutionCallbackFailure.
Las claves de nivel de función y de ejecución duradera son independientes
El KMSKeyArn de nivel de función que cifra las variables de entorno, los paquetes de implementación .zip y las instantáneas de SnapStart es independiente de la KMSKeyArn deDurableConfig que cifra los datos de ejecución duradera. Configurar una no configura la otra. Puede usar la misma clave de KMS para ambas o claves de KMS diferentes.
Configuración del cifrado con una clave administrada por el cliente
La configuración del cifrado con una clave administrada por el cliente para una función duradera consta de tres pasos. Realice los siguientes pasos en el orden indicado.
Crear una clave administrada por el cliente
Las funciones duraderas admiten claves de KMS de cifrado simétrico en la misma región de AWS que la función. No se admiten claves entre regiones. Para crear una clave simétrica administrada por el cliente, siga los pasos de creación de claves de KMS de cifrado simétrico que se indican en la Guía para desarrolladores de AWS Key Management Service.
Permisos
Los permisos AWS KMS se conceden mediante la política de claves de KMS.
La configuración de una clave administrada por el cliente requiere permisos AWS KMS para la entidad principal que crea o actualiza la función. La invocación de una función duradera no requiere que el autor de la llamada tenga permisos AWS KMS. Lambda realiza el cifrado mediante su entidad principal de servicio.
Política de claves
Las políticas de clave controlan el acceso a la clave administrada por el cliente. Cada clave administrada por el cliente debe tener exclusivamente una política de clave. En una política de claves, Resource: "*" hace referencia únicamente a la clave de KMS a la que está asociada la política, no a todas las claves de KMS de la cuenta.
La política de claves de una función duradera concede a cada entidad principal únicamente las acciones AWS KMS que necesita, con un ámbito limitado por el servicio y el ARN de la función. En las siguientes secciones se describen las declaraciones, las condiciones y un ejemplo completo.
Declaraciones de política obligatorias
La política concede las siguientes capacidades:
Habilitación de permisos de usuario de IAM Concede al usuario raíz de la cuenta acceso incondicional para administrar la clave. Esta declaración no usa condiciones porque limitar su ámbito impediría rotar, actualizar o eliminar la clave.
Permitir que Lambda use esta clave para las funciones duraderas. Concede a la entidad principal de servicio de Lambda los permisos
kms:GenerateDataKeyykms:Decrypt.Permitir que el rol de ejecución de la función descifre los datos de ejecución duradera. Concede al rol de ejecución el permiso
kms:Decryptpara leer el estado y hacer avanzar la ejecución.Permitir que el autor de la función describa esta clave. Concede el permiso
kms:DescribeKeypara que Lambda pueda validar que la clave sea simétrica y esté habilitada duranteCreateFunctionoUpdateFunctionConfiguration.Permitir que el autor de la función valide esta clave para una función específica. Concede los permisos
kms:GenerateDataKeyykms:Decryptpara que Lambda pueda validar los permisos y el acceso a la clave con el contexto de cifrado de la función duranteCreateFunctionoUpdateFunctionConfiguration. Esto confirma que la política de claves acepta llamadas para esta función específica antes de crearla o actualizarla.Permitir operadores de ejecución duradera. Concede a los operadores el permiso
kms:Decryptpara las llamadas aGetDurableExecutionyGetDurableExecutionHistoryconIncludeExecutionData=true,GetDurableExecutionStateyStopDurableExecution, así como para las API de devolución de llamada.
Como práctica recomendada, use entidades principales diferentes para el rol de ejecución, el autor de la función y el operador de ejecución duradera, de modo que cada identidad disponga únicamente de las capacidades que necesita.
Condiciones de política recomendadas
La política usa las siguientes condiciones para limitar el ámbito del acceso:
kms:ViaServicerestringe el uso de la clave a las solicitudes que se enrutan mediante Lambda. La aplicación de esta condición a las declaraciones del rol de ejecución, del autor de la función y del operador impide que usen la clave directamente mediante AWS KMS.aws:SourceArnyaws:SourceAccountprotegen contra el problema del delegado confundido entre servicios. Lambda reenvía estos valores cuando llama a AWS KMS con sus propias credenciales de servicio. Esta condición se aplica únicamente a la declaración de la entidad principal de servicio de Lambda. Las declaraciones del rol de ejecución, del autor de la función y del operador llaman a AWS KMS con las credenciales de sesión de acceso reenviado del autor de la llamada, que no incluyen estos encabezados.kms:EncryptionContext:aws:lambda:FunctionArnlimita el ámbito de la clave a una función específica. Lambda agrega este valor al contexto de cifrado en cada llamada a AWS KMS relacionada con los datos de ejecución duradera.
En el siguiente ejemplo se combinan las declaraciones y condiciones anteriores.
ejemplo Política de claves para funciones duraderas
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow Lambda to use this key for durable functions", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "aws:SourceArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function execution role to decrypt durable execution data", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/myDurableFunctionRole" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function author to describe this key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com" } } }, { "Sid": "Allow the function author to validate this key for a specific function", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow durable execution operators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/DurableExecutionOperator" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } } ] }
Para obtener más información sobre las políticas de claves de AWS KMS, consulte Cómo cambiar una política de claves en la Guía para desarrolladores de AWS Key Management Service.
Configuración de una clave administrada por el cliente en una función duradera
La clave administrada por el cliente para los datos de ejecución duradera se configura mediante el campo KMSKeyArn del objeto DurableConfig. Establezca la clave al crear la función mediante CreateFunction. Para actualizarla en una función duradera existente, use UpdateFunctionConfiguration.
importante
Cada ejecución duradera utiliza la clave administrada por el cliente que estaba configurada en la función cuando se inició. El cambio o la eliminación de la clave solo afecta a las ejecuciones que se inicien después del cambio. Las ejecuciones en curso continúan usando la clave con la que se iniciaron hasta que se completen o produzcan un error.
Lectura de los datos de ejecución duradera
Dos API de lectura devuelven datos de ejecución duradera:
GetDurableExecutiondevuelve el estado actual de una ejecución individual, incluida su carga útil de entrada, los datos del punto de comprobación más reciente y la información sobre el resultado o el error.GetDurableExecutionHistorydevuelve la lista ordenada de eventos emitidos por la ejecución, que muestra las entradas y los resultados de los puntos de comprobación, las entradas y los resultados de las invocaciones encadenadas, y el resultado final.
Ambas API aceptan un parámetro de solicitud IncludeExecutionData. Cuando IncludeExecutionData es true, Lambda usa las credenciales del autor de la llamada para llamar a kms:Decrypt en la clave administrada por el cliente. A continuación, Lambda devuelve en la respuesta los datos de ejecución descifrados. La identidad del autor de la llamada debe tener el permiso kms:Decrypt en la clave administrada por el cliente.
Cuando IncludeExecutionData es false, Lambda no llama a AWS KMS ni descifra los datos de ejecución, y la respuesta establece ExecutionDataIncluded en false. La respuesta sigue incluyendo DurableConfig, que contiene el ARN de la clave administrada por el cliente que utilizó la ejecución. El valor predeterminado de IncludeExecutionData es false, por lo que los autores de llamadas que solo necesitan metadatos no requieren permisos AWS KMS.
Ejemplo: respuesta de GetDurableExecution con IncludeExecutionData=false
{ "DurableExecutionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction:execution:exec-abc123", "DurableExecutionName": "exec-abc123", "FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "StartTimestamp": 1733256000, "Status": "RUNNING", "ExecutionDataIncluded": false, "DurableConfig": { "ExecutionTimeout": 3600, "KMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id", "RetentionPeriodInDays": 30 } }
Invocaciones encadenadas
Cuando una función duradera usa una invocación encadenada para llamar a otra función duradera, Lambda considera la ejecución secundaria como una ejecución duradera independiente: tiene su propio ID de ejecución, su propia secuencia de puntos de comprobación y su propia clave administrada por el cliente. La configuración de la clave administrada por el cliente de la ejecución principal no afecta a los datos de la ejecución secundaria, y la configuración de la clave administrada por el cliente de la ejecución secundaria no afecta a los datos de la ejecución principal.
Permisos
La entidad principal de servicio de Lambda debe tener los permisos kms:GenerateDataKey y kms:Decrypt en la clave administrada por el cliente de la función secundaria. Si las funciones principal y secundaria usan claves administradas por el cliente diferentes, debe conceder por separado a la entidad principal de servicio acceso a cada clave. El rol de ejecución de la función principal no necesita permisos en la clave administrada por el cliente de la función secundaria.
Identificación de la clave que cifró cada ejecución
Tanto GetDurableExecution como ListDurableExecutionsByFunction devuelven el ARN de la clave administrada por el cliente que cifró cada ejecución. Use estas API para confirmar qué clave estaba vigente cuando se inició una ejecución principal o secundaria.
Almacenamiento en caché de claves de datos
Para reducir el volumen de llamadas a AWS KMS y mejorar la disponibilidad durante las interrupciones del servicio, Lambda almacena en caché durante un máximo de 15 minutos una clave de datos generada a partir de la clave administrada por el cliente. Mientras la caché permanece activa, Lambda reutiliza la misma clave de datos en las operaciones de una ejecución y entre las ejecuciones iniciadas durante el intervalo de caché.
Coste
El costo de AWS KMS por ejecución se mantiene bajo, ya que Lambda llama a GenerateDataKey como máximo una vez por intervalo de caché, no una vez por cada punto de comprobación. Con tasas de solicitudes elevadas, el costo por ejecución disminuye aún más porque un mayor número de ejecuciones comparte cada clave de datos almacenada en caché. Se le cobran las llamadas AWS KMS que Lambda realiza efectivamente, no cada punto de comprobación ni cada lectura.
Estabilidad estática
Las claves de datos permanecen almacenadas en caché durante un máximo de 15 minutos. Los cambios en la clave surten efecto en la siguiente actualización de la caché. Durante interrupciones prolongadas del servicio, Lambda continúa respondiendo desde la caché, lo que permite que las ejecuciones en curso sigan en funcionamiento.
CloudTrail
Debido al almacenamiento en caché de las claves de datos, en CloudTrail se muestran menos eventos GenerateDataKey que ejecuciones o puntos de comprobación. Consulte Supervisión de las claves de KMS para funciones duraderas para ver ejemplos de eventos.
Cuando la clave administrada por el cliente no está disponible
Si la clave administrada por el cliente con la que se inició una ejecución está desactivada, está programada para su eliminación o se ha revocado el acceso mediante la política de claves, la ejecución no puede continuar. En el siguiente punto de comprobación, Lambda marca la ejecución como fallida con un error AWS KMS que no admite reintentos. Restablecer el acceso a la clave no reanuda automáticamente la ejecución. Debe iniciar una nueva ejecución.
Las API que leen o escriben cargas útiles también fallan cuando la clave no está disponible. Pueden devolver una de las siguientes excepciones:
KMSAccessDeniedException: Lambda no pudo descifrar los datos de ejecución duradera porque se denegó el acceso a la clave de KMS.KMSDisabledException: Lambda no pudo descifrar los datos de ejecución duradera porque la clave de KMS está desactivada.KMSInvalidStateException: Lambda no pudo descifrar los datos de ejecución duradera porque el estado de la clave de KMS no es válido paraDecrypt.KMSNotFoundException: Lambda no pudo descifrar los datos de ejecución duradera porque no se encontró la clave de KMS.
Al restablecer el acceso a la clave de KMS, estas API de lectura vuelven a funcionar para las ejecuciones que ya fallaron. Las ejecuciones fallidas permanecen en ese estado. Debe iniciar una nueva ejecución.
Para consultar los metadatos de una ejecución mientras la clave de KMS no está disponible, llame a GetDurableExecution con IncludeExecutionData=false. Esta operación devuelve el estado de la ejecución, las marcas de tiempo y DurableConfig, incluido el ARN de la clave de KMS, sin llamar a AWS KMS.
Como Lambda almacena en caché las claves de datos, la desactivación de una clave no surte efecto de inmediato. Para obtener más información, consulte Almacenamiento en caché de claves de datos.
importante
La eliminación de una clave de KMS de la que aún dependen ejecuciones en curso o retenidas destruye de forma permanente esas ejecuciones y su historial.
Supervisión de las claves de KMS para funciones duraderas
Cuando se usa una clave administrada por el cliente con una función duradera, se puede utilizar AWS CloudTrail para realizar un seguimiento de las llamadas a AWS KMS que Lambda efectúa en su nombre. Para obtener orientación general sobre la búsqueda de eventos AWS KMS, consulte Búsqueda de actividad de la API de AWS KMS.
Para confirmar que Lambda usa la clave según lo previsto, busque los siguientes campos en cada evento:
eventName: uno deGenerateDataKey,DecryptoDescribeKeyeventSource:kms.amazonaws.comuserIdentity.invokedBy:lambda.amazonaws.comrequestParameters.encryptionContext.aws:lambda:FunctionArn: el ARN de la función duradera
Los siguientes ejemplos corresponden a eventos de CloudTrail generados por una llamada a CreateFunction o UpdateFunctionConfiguration que configura una clave administrada por el cliente en una función duradera. Lambda realiza tres llamadas a AWS KMS para validar la clave: una llamada real a DescribeKey y dos llamadas de prueba, una a GenerateDataKey y otra a Decrypt.