【问题标题】:Why do I get an Access Denied message for Go AWS Lambda function using Secrets Manager API when not specifying VersionStage: AWSCURRENT?为什么我在未指定 VersionStage: AWSCURRENT 时使用 Secrets Manager API 收到 Go AWS Lambda 函数的访问被拒绝消息?
【发布时间】:2021-11-06 10:52:26
【问题描述】:

在调试 AWS SecretsManager Caching Go 的问题时,我恢复使用 AWS SecretsManager API 并遇到以下错误消息:

AccessDeniedException:用户:arn:aws:sts::redacted:assumed-role/MyLambdaFunctionName-DNV2M7OYIFMX/MyLambdaFunctionName-eoFcAmXLBOV1 无权执行:secretsmanager:GetSecretValue on resource:my_secret_name

代码是:

session := session.Must(session.NewSession(aws.NewConfig().WithRegion("us-east-1")))
secretMgr := secretsmanager.New(session)
res, err := secretMgr.GetSecretValue(
        &secretsmanager.GetSecretValueInput{
            SecretId: String("my_secret_name")
        },
    )

秘密资源策略设置为:

{
  "Version" : "2012-10-17",
  "Statement" : [ {
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::redacted:role/MyLambdaFunctionNameRole-DNV2M7OYIFMX"
    },
    "Action" : "secretsmanager:GetSecretValue",
    "Resource" : "*",
    "Condition" : {
      "ForAnyValue:StringEquals" : {
        "secretsmanager:VersionStage" : "AWSCURRENT"
      }
    }
  } ]
}

只要我更改代码以包含值为“AWSCURRENT”的 VersionStage 参数,代码就会正确执行而不会出现错误:

session := session.Must(session.NewSession(aws.NewConfig().WithRegion("us-east-1")))
secretMgr := secretsmanager.New(session)
res, err := secretMgr.GetSecretValue(
        &secretsmanager.GetSecretValueInput{
            SecretId:     String("my_secret_name"),
            VersionStage: String("AWSCURRENT"),
        },
    )

根据SecretsManager API documentation,VersionStage: "AWSCURRENT" 似乎应该是默认配置(如果未指定):

如果您未指定 VersionStage 或 VersionId,则默认是对 VersionStage 值为 AWSCURRENT 的版本执行操作。

谁能解释为什么省略 VersionStage 会导致此错误消息,和/或为什么它与 IAM 承担的角色有任何关系,因为 AWS 密钥和 lambda 函数都在同一个账户中?谢谢!

【问题讨论】:

    标签: amazon-web-services go aws-lambda amazon-iam aws-secrets-manager


    【解决方案1】:

    secretsmanager:VersionStage 条件的AWS docs 状态:

    根据请求的 VersionStage 参数中标识的暂存标签过滤请求。 我们建议您不要使用此密钥,因为如果您使用此密钥,请求必须传入暂存标签才能与此策略进行比较。

    这正是您所经历的。使用此条件时,您必须明确包含标签。它没有解释为什么 AWSCURRENT 的“默认”阶段不起作用。你可以找到一个广泛的 github 线程来讨论这个问题 here。结论基本上是文档如何制定这一点确实有点糟糕,但他们认为还没有理由实际更新文档。

    【讨论】:

    • 谢谢!这绝对解释了为什么需要它。知道为什么错误消息包含有关假定角色的内容吗?
    • 顺便说一句,更改秘密资源策略也解决了similar issue using the caching manager...不知道为什么调用GetSecretStringWithStage("my_secret","AWSCURRENT") 不起作用...
    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2021-01-08
    • 2019-03-05
    • 2020-11-27
    • 2020-09-28
    • 2023-01-01
    • 2020-10-26
    • 2021-05-19
    相关资源
    最近更新 更多