在使用 AWS 身份/权限时,了解以下内容非常重要:两种政策 https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html:
- 基于身份的策略(您将这些附加到身份)
- 基于资源的策略(您将这些策略附加到资源)
基于身份的策略附加到 IAM 用户、组或角色。这些策略允许您指定该身份可以执行的操作。这些政策cannot have a Principal
元素,因为策略应用到的委托人隐式是提供凭证的 IAM 委托人。
基于资源的策略附加到 AWS 资源,例如 S3 存储桶、KMS 密钥或 Lambda 函数。这些策略指定谁可以访问给定资源以及他们可以执行哪些操作。最常见的是,您会看到它们与 S3 存储桶一起使用,但它们也可以与其他资源类型关联。这些政策must have a Principal
元素以确定政策声明适用于谁。
基于资源的策略可以充当额外的安全层,允许资源所有者明确拒绝某些 IAM 委托人访问资源,即使这些 IAM 委托人拥有权限。
通常,基于身份的策略或基于资源的策略都可以允许对给定资源的访问(您不需要在这两个策略中都允许访问)。根据文档 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-basics:
如果基于身份的策略、基于资源的策略或两者都允许某个操作,则 AWS 允许该操作。这些策略中的任何一个中的显式拒绝都会覆盖允许。
在少数情况下,基于身份的策略和相应的基于资源的策略都必须允许执行操作。使用 KMS 密钥进行加密/解密就是其中一个示例。
在您的情况下,您应该为 Secrets Manager 密钥配置基于资源的策略,控制谁有权访问该密钥。
我能够将以下策略添加到 Secrets Manager 密钥中(我将此策略保存在名为mysecret.json
:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "secureme",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/mylambdarole"
},
"Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret-xyz"
}
]
}
据我所知,您无法使用 AWS 控制台将此策略应用于密钥,但您可以使用 awscli 或 SDK。我使用了 awscli,如下:
aws secretsmanager put-resource-policy \
--secret-id mysecret \
--resource-policy file://mysecret.json