View a markdown version of this page

Trabajar con políticas basadas en recursos en Lambda - AWS Lambda

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 Deny explí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:SourceAccount y aws: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
Console
Creación de una política basada en recursos de JSON completa
  1. Abra la página de Funciones en la consola de Lambda.

  2. Seleccione la función a la que quiere conceder acceso y, a continuación, seleccione la pestaña Configuración.

  3. Seleccione Permisos.

  4. En la sección Instrucciones de política basada en recursos, seleccione Editar. Esta acción abre el editor de políticas JSON.

  5. Agregue instrucciones a la política de su función. Puede seleccionar acciones de la API, agregar entidades principales de distintos tipos (servicios, cuentas, roles de IAM) y agregar claves de condición para controlar el acceso.

  6. Seleccione Save.

También puede editar la política basada en recursos de su función directamente en el panel Política.

AWS CLI
Adición de una política basada en recursos de JSON completa

Para agregar una política JSON completa a su función, use el comando put-resource-policy de la AWS CLI.

El siguiente comando de ejemplo agrega una política basada en recursos a su función mediante una política definida en un archivo llamado policy.json en su máquina local. Ejecute el comando desde el directorio que contiene el archivo. resource-arn puede especificar una versión o un alias de la función, o puede utilizar el ARN de la función no cualificada para aplicar la política a toda la función.

aws lambda put-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \ --policy file://policy.json
Lambda APIs

Para agregar una política de permisos JSON completa a su función, use la acción de la API PutResourcePolicy. También puede eliminar la política de una función mediante la acción DeleteResourcePolicy o recuperar la política actualmente asociada a una función mediante la acción GetResourcePolicy.

Para agregar permisos individuales a la política de una función, use la acción de la API AddPermission.

Visualización de la política basada en recursos de una función

Console
Visualización de la política basada en recursos de una función
  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija una función.

  3. Elija Configuración y, a continuación, seleccione Permisos.

  4. Desplácese hacia abajo hasta Instrucciones de política basada en recursos para ver la política.

AWS CLI

Para ver la política basada en recursos de una función, utilice el comando get-resource-policy. Puede usar el ARN no cualificado de su función o especificar una versión o un alias.

aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

También puede utilizar el comando get-policy:

aws lambda get-policy \ --function-name my-function \ --output text
Lambda APIs

Para recuperar la política basada en recursos de una función, use la acción de la API GetResourcePolicy. Puede usar el ARN no cualificado de su función o especificar un ARN de alias o versión.

También puede usar la acción de la API GetPolicy.

Eliminación de la política basada en recursos de una función

Console
Eliminación de la política basada en recursos de una función
  1. Abra la página de Funciones en la consola de Lambda.

  2. Seleccione la función para la que desea eliminar la política de permisos.

  3. Seleccione la pestaña Configuración y, a continuación, Permisos.

  4. En la sección Instrucciones de política basada en recursos, seleccione Eliminar.

AWS CLI

Para eliminar la política de la función, utilice el comando delete-resource-policy y especifique el ARN de la función, la versión o el alias de los que desea eliminar la política.

aws lambda delete-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

Para eliminar instrucciones individuales, utilice remove-permission.

aws lambda remove-permission \ --function-name example \ --statement-id sns
Lambda APIs

Para eliminar la política basada en recursos asociada a una función, versión de función o alias de función, utilice la acción de la API DeleteResourcePolicy.

Para eliminar instrucciones individuales de una política, use la acción de la API RemovePermission.

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 a add-permission después de put-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-id a1b2c3d4-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 Deny explí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: