Uso del ARN de la función de origen para controlar el comportamiento de acceso a la función
Es común que el código de la función de Lambda realice solicitudes de la API a otros Servicios de AWS. Para realizar estas solicitudes, Lambda genera un conjunto efímero de credenciales al asumir el rol de ejecución de la función. Estas credenciales están disponibles como variables de entorno durante la invocación de la función. Cuando trabaja con el SDK de AWS, no es necesario proporcionar las credenciales de SDK directamente en el código. De forma predeterminada, la cadena de proveedores de credenciales comprueba secuencialmente cada lugar en el que puede configurar las credenciales y elige el primero disponible, normalmente las variables de entorno (AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
, y AWS_SESSION_TOKEN
).
Lambda inyecta el ARN de la función de origen en el contexto de credenciales solo si la solicitud es una solicitud de la API de AWS que proviene de su entorno de ejecución. Lambda también inyecta el ARN de la función de origen para las siguientes solicitudes a la API de AWS que Lambda realiza fuera del entorno de ejecución en su nombre:
Servicio | Acción | Motivo |
---|---|---|
Registros de CloudWatch | CreateLogGroup , CreateLogStream , PutLogEvents |
Para almacenar los registros en un grupo de registro de los registros de CloudWatch |
X-Ray | PutTraceSegments |
Para enviar datos de seguimiento a X-Ray |
Amazon EFS | ClientMount |
Para conectar la función a un sistema de archivos Amazon Elastic File System (Amazon EFS) |
Las llamadas a la API de AWS que realiza fuera del entorno de ejecución en su nombre con el mismo rol de ejecución no contienen el ARN de la función de origen. Entre los ejemplos de llamadas a la API fuera del entorno de ejecución se incluyen los siguientes:
-
Llamadas a AWS Key Management Service (AWS KMS) para cifrar y descifrar de forma automática las variables de entorno.
-
Llamadas a Amazon Elastic Compute Cloud (Amazon EC2) para crear interfaces de red elásticas (ENI) para una función con VPC habilitada.
-
Llama a los Servicios de AWS, como Amazon Simple Queue Service (Amazon SQS), para leer desde un origen de eventos que está configurada como una asignación de orígenes de eventos.
Con el ARN de la función de origen en el contexto de credenciales, puede verificar si una llamada al recurso proviene del código de una función de Lambda específica. Para comprobarlo, utilice la clave de condición lambda:SourceFunctionArn
en una política con base en identidad de IAM o política de control de servicio (SCP).
nota
No puede utilizar la clave de condición lambda:SourceFunctionArn
en las políticas basadas en recursos.
Con esta clave de condición en las políticas basadas en la identidad o SCP, puede implementar controles de seguridad para las acciones de la API que el código de la función realiza en otros Servicios de AWS. Tiene algunas aplicaciones de seguridad clave, como ayudarlo a identificar el origen de una fuga de credenciales.
nota
La clave de condición lambda:SourceFunctionArn
es diferente de las claves de condición lambda:FunctionArn
y aws:SourceArn
. La clave de condición lambda:FunctionArn
solo se aplica a asignaciones de orígenes de eventos y ayuda a definir qué funciones puede invocar el origen de eventos. La clave de condición aws:SourceArn
se aplica solo a las políticas en las que la función de Lambda es el recurso de destino y ayuda a definir qué otros Servicios de AWS y recursos pueden invocar esa función. La clave de condición lambda:SourceFunctionArn
se puede aplicar a cualquier política basada en identidad o SCP para definir las funciones Lambda específicas que tienen permisos para hacer llamadas de la API de AWS a otros recursos.
Para utilizar lambda:SourceFunctionArn
en la política, inclúyala como condición en cualquiera de los operadores de condición ARN. El valor de la clave debe ser un ARN válido.
Por ejemplo, suponga que el código de función de Lambda hace una llamada s3:PutObject
que está dirigida a un bucket de Amazon S3 específico. Es posible que desee permitir que solo una función de Lambda específica tenga acceso a s3:PutObject
de ese bucket. En este caso, el rol de ejecución de la función debe tener una política asociada similar a la siguiente:
ejemplo política que otorga acceso a una función de Lambda específica a un recurso de Amazon S3
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleSourceFunctionArn", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::lambda_bucket/*", "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda" } } } ] }
Esta política solo permite el acceso a s3:PutObject
si el origen es la función de Lambda con el ARN arn:aws:lambda:us-east-1:123456789012:function:source_lambda
. Esta política no permite el acceso a s3:PutObject
de ninguna otra identidad de llamada. Esto se aplica incluso aunque una función o entidad diferente haga una llamada s3:PutObject
con el mismo rol de ejecución.
nota
La clave de condición lambda:SourceFunctionARN
no admite versiones de funciones de Lambda ni alias de funciones. Si usa el ARN para una versión o alias de función en particular, la función no tendrá permiso para realizar la acción que especifique. Asegúrese de utilizar el ARN incompleto para la función sin un sufijo de versión o alias.
También se puede usar lambda:SourceFunctionArn
en SCP. Por ejemplo, suponga que desea restringir el acceso al bucket a un solo código de la función de Lambda o a llamadas de una instancia específica de Amazon Virtual Private Cloud (VPC). La siguiente SCP ilustra este caso.
ejemplo política que deniega el acceso a Amazon S3 en condiciones específicas
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::lambda_bucket/*", "Effect": "Deny", "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpc": [ "vpc-12345678" ] } } }, { "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::lambda_bucket/*", "Effect": "Deny", "Condition": { "ArnNotEqualsIfExists": { "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda" } } } ] }
Esta política deniega todas las acciones de S3 a menos que provengan de una función de Lambda específica con el ARN arn:aws:lambda:*:123456789012:function:source_lambda
o de la VPC especificada. El operador StringNotEqualsIfExists
indica a IAM que procese esta condición solo si la clave aws:SourceVpc
está presente en la solicitud. Del mismo modo, IAM considera el operador ArnNotEqualsIfExists
solo si lambda:SourceFunctionArn
está presente.