微调策略的“资源和条件”部分
您可以通过在 AWS Identity and Access Management (IAM) 策略中指定资源和条件来限制用户权限的范围。策略中的每个操作都支持资源和条件类型的组合,这些类型根据操作的行为而有所不同。
每条 IAM 策略语句为对一个资源执行的一个操作授予权限。如果操作不对指定资源执行操作,或者您授予对所有资源执行操作的权限,则策略中资源的值为通配符(*
)。对于许多操作,可以通过指定资源的 Amazon 资源名称(ARN)或与多个资源匹配的 ARN 模式来限制用户可修改的资源。
按资源类型划分,限制操作范围的一般设计如下:
函数 – 对函数进行的操作可以通过函数、版本或别名 ARN 限制到特定函数上。
-
事件源映射 – 可以通过 ARN 将操作限制到特定的事件源映射资源上。事件源映射始终与函数相关联,所以也可以使用
lambda:FunctionArn
条件来限制关联函数的操作。 层 – 与层使用和权限相关的操作作用于层的版本。
代码签名配置 – 可以通过 ARN 将操作限制到特定的代码签名配置资源上。
标签 – 使用标准标签条件。有关更多信息,请参阅 在 Lambda 中使用基于属性的访问控制。
要按资源限制权限,请指定资源的 ARN。
Lambda 资源 ARN 格式
-
函数 –
arn:aws:lambda:
us-west-2
:123456789012
:function:my-function
-
函数版本 –
arn:aws:lambda:
us-west-2
:123456789012
:function:my-function
:1
-
函数别名 –
arn:aws:lambda:
us-west-2
:123456789012
:function:my-function
:TEST
-
事件源映射 –
arn:aws:lambda:
us-west-2
:123456789012
:event-source-mapping:fa123456-14a1-4fd2-9fec-83de64ad683de6d47
-
层 –
arn:aws:lambda:
us-west-2
:123456789012
:layer:my-layer
-
层版本 –
arn:aws:lambda:
us-west-2
:123456789012
:layer:my-layer
:1
-
代码签名配置 –
arn:aws:lambda:
us-west-2
:123456789012
:code-signing-config:my-csc
例如,以下策略允许 AWS 账户 123456789012
中的用户调用美国西部(俄勒冈)AWS 区域中名为 my-function
的函数。
例 调用函数策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Invoke", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ],
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function"
} ] }
这是一种特殊情形,其中,操作标识符 (lambda:InvokeFunction
) 不同于 API 操作 (Invoke)。对于其他操作,操作标识符为操作名称加上 lambda:
前缀。
了解策略中的“条件”部分
条件是可选的策略元素,它应用其他逻辑来确定是否允许执行操作。除了所有操作支持的公用条件之外,Lambda 定义了一些条件类型,您可以用来限制某些操作的额外参数的值。
例如,lambda:Principal
条件允许您限制用户可以根据函数的基于资源的策略授予调用访问权限的服务或账户。以下策略允许用户授予对 Amazon Simple Notification Service (Amazon SNS) 主题的权限,以调用名为 test
的函数。
例 管理函数策略权限
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ManageFunctionPolicy", "Effect": "Allow", "Action": [ "lambda:AddPermission", "lambda:RemovePermission" ], "Resource": "arn:aws:lambda:us-west-2:123456789012:function:test:*",
"Condition": { "StringEquals": { "lambda:Principal": "sns.amazonaws.com" } }
} ] }
该条件要求委托人是 Amazon SNS 而不是其他服务或账户。资源模式要求函数名称为 test
并包含版本号或别名。例如:test:v1
。
有关 Lambda 和其他 AWS 服务的资源和条件的更多信息,请参阅服务授权参考中的 AWS 服务的操作、资源和条件键。
在策略的“资源”部分中引用函数
您可以使用 Amazon Resource Name(ARN)在策略语句中引用 Lambda 函数。函数 ARN 的格式取决于您是要引用整个函数(无限定)、某个函数版本,还是别名(限定)。
调用 Lambda API 时,用户可以通过在 GetFunction FunctionName
参数中传递版本 ARN 或别名 ARN,或者通过在 GetFunction Qualifier
参数中设置值,来指定一个版本或别名。Lambda 通过比较 IAM 策略中的资源元素与在 API 调用中传递的 FunctionName
和 Qualifier
来做出授权决策。如果不匹配,Lambda 会拒绝该请求。
无论您是允许还是拒绝某个函数操作,都必须在策略声明中使用正确的函数 ARN 类型才能获得预期的结果。例如,假设您的策略引用了非限定 ARN,Lambda 会接受引用非限定 ARN 的请求,但拒绝引用限定 ARN 的请求。
注意
不能使用通配符 (*) 匹配账户 ID。有关接受的语法的更多信息,请参阅《IAM 用户指南》中的 IAM JSON 策略参考。
例 允许调用非限定 ARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction"
} ] }
如果您的策略引用了特定的限定 ARN,Lambda 会接受引用该 ARN 的请求,但拒绝引用非限定 ARN 的请求(例如 myFunction:2
)。
例 允许调用特定的限定 ARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:1"
} ] }
如果您的策略引用了任何限定 ARN:*
,Lambda 会接受任何限定 ARN,但拒绝引用非限定 ARN 的请求。
例 允许调用任何限定 ARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:*"
} ] }
如果您的策略引用了任何使用 *
的 ARN,Lambda 会接受任何限定或非限定 ARN。
例 允许调用任何限定或非限定 ARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction*"
} ] }
支持的 IAM 操作及函数行为
操作定义了可通过 IAM 策略允许的内容。有关 Lambda 中支持的操作列表,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for AWS Lambda。在大多数情况下,如果 IAM 操作允许 Lambda API 操作,则 IAM 操作的名称与 Lambda API 操作的名称相同,但以下情况除外:
API 操作 | IAM 操作 |
---|---|
Invoke | lambda:InvokeFunction |
lambda:GetLayerVersion |
除了《Service Authorization Reference》中定义的资源和条件,Lambda 还支持某些操作的以下资源和条件。其中许多资源和条件与策略“资源”部分中的引用函数有关。对函数进行的操作可以通过函数、版本或别名 ARN 限制为特定函数,如下表中所述。
操作 | 资源 | Condition |
---|---|---|
Invoke – 权限: |
函数版本 函数别名 |
不适用 |
不适用 |
|
|
函数别名 |
不适用 |