Trabajar con políticas basadas en recursos en Lambda
Con las políticas de permisos basadas en recursos, puede conceder a otras Cuentas de AWS, usuarios, organizaciones y Servicios de AWS acceso a sus funciones de Lambda. Una política basada en recursos es un documento JSON que contiene una o varias instrucciones. Cada instrucción define lo siguiente:
-
Principal: la entidad a la que desea conceder permisos (otro Servicio de AWS, un rol o usuario de IAM u otra Cuenta de AWS) -
Action: una lista de las acciones de la API que desea permitir o denegar para la entidad principal especificada -
Effect: si desea permitir o denegar a la entidad principal la capacidad de utilizar las acciones de API elegidas -
Resource: la función de Lambda, la versión o el alias a los que desea que se aplique la instrucción (también puede utilizar un carácter comodín para especificar todas las versiones y alias de la función)
También puede usar elementos opcionales como Sid (un identificador de instrucción) y Condition (condiciones lógicas para un control de acceso detallado). Para obtener una lista completa de los elementos de política compatibles, consulte Referencia sobre los elementos de política JSON de IAM en la Guía del usuario de AWS Identity and Access Management.
Adición de permisos basados en recursos a una función de Lambda
Puede agregar permisos basados en recursos a la función de Lambda mediante dos métodos:
-
Política de JSON completa: utilice la consola de Lambda, la AWS CLI o la acción de la API PutResourcePolicy para agregar un documento de política de JSON completo. Con una política de JSON completa, puede utilizar toda la gama de claves de condición globales de IAM, agregar varias instrucciones con varias entidades principales y crear instrucciones de
Denyexplícitas. El tamaño máximo para una política basada en recursos JSON es de 20 KB. -
Permisos individuales: use la consola o la acción de la API AddPermission para agregar instrucciones de
Allowúnicas. Los permisos individuales solo admiten un conjunto limitado de claves de condición (aws:SourceArn,aws:SourceAccountyaws:PrincipalOrgID).
Le recomendamos que defina políticas JSON completas para agregar permisos basados en recursos a su función. La creación de una política JSON completa le brinda más flexibilidad y un control detallado de sus permisos.
importante
El uso de put-resource-policy reemplaza cualquier política basada en recursos existente en el recurso. Si el recurso ya tiene los permisos definidos con add-permission, put-resource-policy los sobrescribe. Use get-resource-policy para recuperar la política existente antes de realizar cambios.
Permisos necesarios
Para usar las acciones de API PutResourcePolicy, GetResourcePolicy y DeleteResourcePolicy, necesita los siguientes permisos de IAM:
| Acción de la API | Permisos necesarios |
|---|---|
| PutResourcePolicy | lambda:PutResourcePolicy, lambda:AddPermission, y lambda:RemovePermission |
| GetResourcePolicy | lambda:GetResourcePolicy y lambda:GetPolicy |
| DeleteResourcePolicy | lambda:DeleteResourcePolicy y lambda:RemovePermission |
Visualización de la política basada en recursos de una función
Eliminación de la política basada en recursos de una función
Actualización de políticas existentes
Al actualizar los permisos basados en recursos existentes de una función, el comportamiento depende del método que utilice:
-
put-resource-policy/ PutResourcePolicy: reemplaza toda la política existente. Se sobrescriben todos los permisos individuales que se hayan agregado anteriormente. -
add-permission/ AddPermission: agrega una instrucción a la política existente sin sobrescribirla. Si llama aadd-permissiondespués deput-resource-policy, la nueva instrucción se anexa a la política JSON existente.
Para evitar sobrescribir involuntariamente los permisos existentes al utilizar put-resource-policy, primero recupere la política existente de su función. El resultado de get-resource-policy incluye un campo RevisionId.
aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function
Cuando adjunte una nueva política, proporcione el valor RevisionId con el parámetro --revision-id para asegurarse de que está actualizando la última versión. Si proporciona un ID de revisión anterior, Lambda no actualiza la política de la función.
aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function\ --policy file://policy.json \ --revision-ida1b2c3d4-5678-90ab-cdef-EXAMPLE11111
nota
Las políticas basadas en recursos existentes que se crearon con AddPermission seguirán funcionando sin modificaciones. No es necesario realizar cambios en el código de la función para utilizar la nueva API PutResourcePolicy.
Prácticas recomendadas de seguridad
Con las políticas JSON basadas en recursos, puede seguir los patrones de acceso con privilegio mínimo. También puede cumplir con los requisitos reglamentarios en materia de denegaciones explícitas. Con las políticas JSON completas, puede:
-
Crear instrucciones de
Denyexplícitas para bloquear entidades principales o condiciones específicas. -
Utilizar las condiciones organizativas (
aws:PrincipalOrgID,aws:PrincipalOrgPaths) para restringir el acceso a sus organizaciones sin enumerar las cuentas individuales. -
Limitar los permisos a cuentas de origen o ARN específicos utilizando toda la gama de claves de condición globales de IAM.
Ejemplos de políticas basadas en recursos
ejemplo Concesión de permiso a Amazon S3 con una instrucción de denegación
La siguiente política concede a todos los buckets de Amazon S3 de una cuenta permiso para invocar una función, excepto un bucket que se deniega de forma explícita.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } }, { "Sid": "deny-s3-bucket", "Effect": "Deny", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:111122223333:function:my-function", "arn:aws:lambda:us-east-2:111122223333:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } } ] }
ejemplo Concesión de permisos a cuentas de una organización
La siguiente política concede acceso de invocación a todas las Cuentas de AWS de una organización.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "org-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }
ejemplo Concesión de permisos a varios roles de IAM con condiciones
La siguiente política concede permiso a dos roles de IAM para utilizar la acción CreateAlias desde una dirección IP específica.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-roles", "Effect": "Allow", "Action": "lambda:CreateAlias", "Principal": { "AWS": [ "arn:aws:iam::444455556666:role/role-name", "arn:aws:iam::444455556666:role/role-name2" ] }, "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "IpAddress": { "aws:SourceIp": "192.0.2.0" } } } ] }
ejemplo Denegar el acceso a menos que la persona que llama forme parte de una organización específica
{ "Version": "2012-10-17", "Statement": [ { "Sid": "deny-access", "Effect": "Deny", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } }, { "Sid": "allow-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAnyValue:StringLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } } ] }
Acciones de la API admitidas
Las siguientes acciones de la API de Lambda admiten las políticas basadas en recursos:
-
InvokeFunctionUrl (solo con permiso)