在 Lambda 中使用基于资源的策略
借助基于资源的权限策略,您可以向其他 Amazon Web Services 账户、用户、组织及 Amazon Web Services 服务授予访问您 Lambda 函数的权限。基于资源的策略是包含一条或多条语句的 JSON 文档。每条语句皆定义如下内容:
-
Principal:待授予权限的实体(其他 Amazon Web Services 服务、IAM 角色或用户,或其他 Amazon Web Services 账户) -
Action:针对指定主体,允许或拒绝的 API 操作列表 -
Effect:是否允许或拒绝主体执行选定的 API 操作 -
Resource:该语句作用的 Lambda 函数、版本或别名(也可使用通配符,指定该函数全部版本与别名)
您还可使用可选元素,例如 Sid(语句标识符)和 Condition(用于细粒度访问控制的逻辑条件)。如需受支持策略元素的完整列表,请参阅《Amazon Identity and Access Management 用户指南》内的 IAM JSON 策略元素参考。
为 Lambda 函数添加基于资源的权限
您可通过两种方式为 Lambda 函数添加基于资源的权限:
-
完整 JSON 策略:使用 Lambda 控制台、Amazon CLI 或 PutResourcePolicy API 操作添加完整 JSON 策略文档。使用完整 JSON 策略时,可使用全部 IAM 全局条件键,添加包含多个主体的多条语句,并创建显式
Deny语句。基于资源的 JSON 策略最大为 20 KB。 -
单独权限:使用控制台或 AddPermission API 操作添加单条
Allow语句。单独权限仅支持有限的条件键(aws:SourceArn、aws:SourceAccount、aws:PrincipalOrgID)。
建议编写完整 JSON 策略,为函数添加基于资源的权限。创建完整 JSON 策略,可让您更灵活地对权限执行细粒度控制。
重要
使用 put-resource-policy 将替换该资源上所有现有的基于资源的策略。若资源已通过 add-permission 定义了权限,则 put-resource-policy 会覆盖这些权限。进行修改前,请使用 get-resource-policy 获取现有策略。
所需的权限
若要使用 PutResourcePolicy、GetResourcePolicy、DeleteResourcePolicy API 操作,您需要以下 IAM 权限:
| API 操作 | 所需的权限 |
|---|---|
| PutResourcePolicy | lambda:PutResourcePolicy、lambda:AddPermission 和 lambda:RemovePermission |
| GetResourcePolicy | lambda:GetResourcePolicy和lambda:GetPolicy |
| DeleteResourcePolicy | lambda:DeleteResourcePolicy和lambda:RemovePermission |
查看函数基于资源的策略
删除函数基于资源的策略
更新现有策略
更新函数现有的基于资源的权限时,具体行为取决于所用方法:
-
put-resource-policy/PutResourcePolicy:替换全部现有策略。此前添加的所有单独权限均会被覆盖。 -
add-permission/AddPermission:向现有策略添加语句,不会覆盖原有内容。若在put-resource-policy之后调用add-permission,新语句将附加至现有 JSON 策略。
使用 put-resource-policy 时,为防止意外覆盖现有权限,请先获取函数的现有策略。get-resource-policy 的输出包含 RevisionId 字段。
aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function
附加新策略时,请通过 --revision-id 参数传入 RevisionId 值,确保更新的是最新版本。若传入旧修订版 ID,Lambda 不会更新该函数策略。
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
注意
通过 AddPermission 创建的现有基于资源的策略,无需修改可持续生效。使用全新 PutResourcePolicy API,无需修改函数代码。
安全最佳实践
借助 JSON 基于资源的策略,即可遵循最低权限访问原则。您还可满足显式拒绝相关的合规监管要求。使用完整 JSON 策略,您可执行以下操作:
-
创建显式
Deny语句,用于阻止指定主体或条件。 -
可使用组织条件(
aws:PrincipalOrgID、aws:PrincipalOrgPaths)限制对 Organizations 的访问,无需逐个枚举账户。 -
可使用全部 IAM 全局条件键,将权限限定至指定来源账户或 ARN。
基于资源的策略示例
例通过拒绝语句向 Amazon S3 授予权限
以下策略为账户内全部 Amazon S3 存储桶授予调用函数权限,但对其中一个存储桶显式拒绝访问。
{ "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" } } } ] }
例向组织内账户授予权限
以下策略为组织内全部 Amazon Web Services 账户授予调用访问权限。
{ "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" } } } ] }
例在附带条件的情况下向多个 IAM 角色授予权限
以下策略为两个 IAM 角色授予权限,允许其从指定 IP 地址执行 CreateAlias 操作。
{ "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" } } } ] }
例除非调用方属于指定组织,否则拒绝访问
{ "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/*" ] } } } ] }
支持的 API 操作
以下 Lambda API 操作支持基于资源的策略:
-
InvokeFunctionUrl(仅权限)