

# Cifrado de los paquetes de implementación .zip de Lambda
<a name="encrypt-zip-package"></a>

Lambda siempre proporciona cifrado en el servidor en reposo para los paquetes de implementación .zip y los detalles de configuración de las funciones con una AWS KMS key. De forma predeterminada, Lambda utiliza una [Clave propiedad de AWS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk). Si este comportamiento predeterminado se ajusta a su flujo de trabajo, no tiene que configurar nada más. AWS no cobra por usar esta clave.

Si lo prefiere, puede proporcionar una clave administrada por el cliente de AWS KMS en su lugar. Puede hacerlo para tener control sobre la rotación de la clave de KMS o para cumplir con los requisitos de su organización para administrar claves de KMS. Cuando usa una clave administrada por el usuario, solo los usuarios de su cuenta con acceso a la clave de KMS pueden ver o administrar el código o la configuración de la función.

Las claves administradas por el cliente ocasionan cargos de AWS KMS estándar. Para más información, consulte [Precios de AWS Key Management Service](https://aws.amazon.com/kms/pricing/).

## Crear una clave administrada por el cliente
<a name="create-key"></a>

 Puede crear una clave simétrica administrada por el cliente a través de la Consola de administración de AWS o las API de AWS KMS.

**Para crear una clave simétrica administrada por el cliente**

Siga los pasos de [Creación de cifrado simétrico y creación de claves de KMS simétricas](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) en la *Guía para desarrolladores de AWS Key Management Service*.

### Permisos
<a name="enable-zip-permissions"></a>

**Política de claves**

Las [políticas de clave](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) controlan el acceso a la clave administrada por el cliente. Cada clave administrada por el cliente debe tener exactamente una política de clave, que contiene instrucciones que determinan quién puede usar la clave y cómo puede utilizarla. Para obtener más información, consulte [Cómo cambiar una política de claves](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to) en la *Guía para desarrolladores de AWS Key Management Service*.

Cuando se utiliza una clave administrada por el cliente para cifrar un paquete de implementación de .zip, Lambda no agrega ninguna [concesión](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html) a la clave. En su lugar, su política de claves de AWS KMS debe permitir a Lambda llamar a las siguientes operaciones de la API de AWS KMS en su nombre:
+ [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

El siguiente ejemplo de política de claves permite que todas las funciones de Lambda de la cuenta 111122223333 llamen a las operaciones de AWS KMS requeridas para la clave administrada por el cliente especificada:

**Example AWS KMSPolítica de claves de**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringLike": {
                "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:*"
                }
            }
        }
    ]
}
```

Para obtener información sobre la [solución de problemas de acceso a las claves](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html#example-no-iam), consulte la *Guía para desarrolladores de AWS Key Management Service*.

**Permisos de entidades principales**

Cuando se utiliza una clave administrada por el cliente para cifrar un paquete de implementación .zip, solo las [entidades principales](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html) con acceso a esa clave pueden acceder al paquete de implementación .zip. Por ejemplo, las entidades principales que no tienen acceso a la clave administrada por el cliente no pueden descargar el paquete .zip mediante la URL de S3 prefirmada que se incluye en la respuesta de [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html). Se devuelve una `AccessDeniedException` en la sección `Code` de la respuesta.

**Example AWS KMS AccessDeniedException**  

```
{
    "Code": {
        "RepositoryType": "S3",
        "Error": {
            "ErrorCode": "AccessDeniedException",
            "Message": "KMS access is denied. Check your KMS permissions. KMS Exception: AccessDeniedException KMS Message: User: arn:aws:sts::111122223333:assumed-role/LambdaTestRole/session is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:111122223333:key/key-id with an explicit deny in a resource-based policy"
        },
        "SourceKMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id"
    },
	...
```

Para obtener más información sobre los permisos para las claves de AWS KMS, consulte [Autenticación y control de acceso para AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html).

## Uso de una clave administrada por el cliente para el paquete de implementación .zip
<a name="enable-zip-custom-encryption"></a>

Utilice los siguientes parámetros de la API para configurar las claves administradas por el cliente para los paquetes de implementación .zip:
+ [SourceKMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionCode.html#lambda-Type-FunctionCode-SourceKMSKeyArn): cifra el paquete de implementación .zip de origen (el archivo que se carga).
+ [KMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-KMSKeyArn): cifra las [variables de entorno](configuration-envvars-encryption.md) y las instantáneas de [Lambda SnapStart](snapstart.md).

Cuando `SourceKMSKeyArn` y `KMSKeyArn` se especifican, Lambda utiliza la clave `KMSKeyArn` para cifrar la versión descomprimida del paquete que Lambda usa para invocar la función. Cuando se especifica `SourceKMSKeyArn`, pero no `KMSKeyArn`, Lambda utiliza una [Clave administrada de AWS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) para cifrar la versión descomprimida del paquete.

------
#### [ Lambda console ]

**Cómo agregar una clave de cifrado administrada por el cliente al crear una función**

1. Abra la página de [Functions](https://console.aws.amazon.com/lambda/home#/functions) (Funciones) en la consola de Lambda.

1. Seleccione **Creación de función**.

1. Elija **Author from scratch** (Crear desde cero) o **Container image** (Imagen de contenedor). 

1. Bajo **Basic information (Información básica)**, haga lo siguiente:

   1. En **Nombre de la función**, escriba el nombre de la función.

   1. Para **Runtime (Tiempo de ejecución)**, elija la versión del idioma que desea utilizar para su función.

1. Expanda **Configuración avanzada** y, a continuación, seleccione **Habilitar el cifrado con una clave administrada por el cliente de AWS KMS**.

1. Elija una clave administrada por el cliente.

1. Seleccione **Creación de función**.

Para eliminar el cifrado de clave administrada por el cliente o utilizar una clave diferente, debe volver a cargar el paquete de implementación .zip.

**Cómo agregar el cifrado de clave administrada por el cliente a una función existente**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Elija el nombre de una función.

1. En el panel **Código fuente**, elija **Cargar desde**.

1. Elija el **archivo .zip** o la **ubicación de Amazon S3**.  
![\[\]](http://docs.aws.amazon.com/es_es/lambda/latest/dg/images/upload-zip.png)

1. Cargue el archivo o introduzca la ubicación de Amazon S3.

1. Elija **Habilitar el cifrado con una clave administrada por el cliente de AWS KMS**.

1. Elija una clave administrada por el cliente.

1. Seleccione **Save**.

------
#### [ AWS CLI ]

**Cómo agregar una clave de cifrado administrada por el cliente al crear una función**

En el siguiente ejemplo de [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html):
+ `--code`: especifica la ruta local al paquete de implementación .zip (`ZipFile`) y la clave administrada del cliente para cifrarla (`SourceKMSKeyArn`).
+ `--kms-key-arn`: especifica la clave administrada por el cliente para cifrar las variables de entorno y la versión descomprimida del paquete de implementación.

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x \
  --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code ZipFile=fileb://myFunction.zip,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

En el siguiente ejemplo de [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html):
+ `--code`: especifica la ubicación del archivo .zip en un bucket de Amazon S3 (`S3Bucket`, `S3Key`, `S3ObjectVersion`) y la clave administrada del el cliente para cifrarla (`SourceKMSKeyArn`).
+ `--kms-key-arn`: especifica la clave administrada por el cliente para cifrar las variables de entorno y la versión descomprimida del paquete de implementación.

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

**Cómo agregar el cifrado de clave administrada por el cliente a una función existente**

En el siguiente ejemplo de [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html):
+ `--zip-file`: especifica la ruta local del paquete de implementación .zip.
+ `--source-kms-key-arn`: especifica la clave administrada por el cliente para cifrar la versión comprimida del paquete de implementación. Lambda utiliza una clave propiedad de AWS para cifrar el paquete descomprimido durante las invocaciones de la función. Si desea utilizar una clave administrada por el cliente para cifrar la versión descomprimida del paquete, ejecute el comando [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) con la opción `--kms-key-arn`.

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip \
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

En el siguiente ejemplo de [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html):
+ `--s3-bucket`: especifica la ubicación del archivo .zip en un bucket de Amazon S3.
+ `--s3-key`: especifica la clave de Amazon S3 del paquete de implementación.
+ `--s3-object-version`: para objetos con control de versiones, la versión del objeto del paquete de implementación que se va a utilizar.
+ `--source-kms-key-arn`: especifica la clave administrada por el cliente para cifrar la versión comprimida del paquete de implementación. Lambda utiliza una clave propiedad de AWS para cifrar el paquete descomprimido durante las invocaciones de la función. Si desea utilizar una clave administrada por el cliente para cifrar la versión descomprimida del paquete, ejecute el comando [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) con la opción `--kms-key-arn`.

```
aws lambda update-function-code \
  --function-name myFunction \
  --s3-bucket amzn-s3-demo-bucket \
  --s3-key myFileName.zip \
  --s3-object-version myObject Version
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

**Cómo eliminar el cifrado de clave administrada por el cliente de una función existente**

En el siguiente ejemplo de [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html), `--zip-file` especifica la ruta local al paquete de implementación .zip. Al ejecutar este comando sin la opción `--source-kms-key-arn`, Lambda utiliza una clave propia de AWS para cifrar la versión comprimida del paquete de implementación.

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip
```

------