【问题标题】:How do I grant a rotation Lambda access to AWS Secrets Manager如何授予对 AWS Secrets Manager 的轮换 Lambda 访问权限
【发布时间】:2019-11-28 19:58:34
【问题描述】:

使用无服务器框架,我正在尝试构建存储在 AWS Secrets Manager 中的 a Lambda function that periodically rotates a secret

我在配置 Secret Manager 执行 Lambda 所需的角色时遇到问题。在我的serverless.yml 中,我定义了以下资源:

resources:
  Resources:
    RotateKeysRole:
      Type: AWS::IAM::Role
      Properties:
        RoleName: rotate-keys-role
        ManagedPolicyArns:
          - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        AssumeRolePolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
                  - secretsmanager.amazonaws.com
              Action: sts:AssumeRole

并像这样将此角色附加到旋转 Lambda:

functions:
  rotateKeys:
    handler: lambdas.rotate_keys.handler
    role: RotateKeysRole

然而,当我尝试设置 Secrets Manager 以使用此 Lambda 来轮换密钥时,我会收到以下错误消息:

Secrets Manager 无法调用指定的 Lambda 函数。确保 功能策略授予对主体的访问权限 secretsmanager.amazonaws.com

这让我感到困惑,因为这个主体是指定的。在 IAM 控制台中检查角色并没有发现任何对我来说似乎有问题的地方。

在这种情况下如何正确配置角色设置?

【问题讨论】:

  • 我目前正在尝试配置我的凭证轮换,stackoverflow.com/questions/59932893/… 我只是想知道 Lambda 是否强制配置轮换,你介意在我的问题中描述你是如何做到的,非常感谢。

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


【解决方案1】:

我今天遇到了同样的问题。我运行了它,它对我有用:

aws lambda add-permission \
  --function-name ARN_of_lambda_function \
  --principal secretsmanager.amazonaws.com \
  --action lambda:InvokeFunction \
  --statement-id SecretsManagerAccess

https://docs.aws.amazon.com/secretsmanager/latest/userguide/troubleshoot_rotation.html

【讨论】:

  • 这确实允许我成功地轮换我的秘密,但我仍然不知道如何在我的 serverless.yml 文件中执行此操作。你也在使用无服务器吗?
【解决方案2】:

您的政策不正确。 该服务是 secretsmanager,但您定义的操作是来自 AWS Security Token Service 的 sts:AssumeRole。

完整的访问策略是:

Effect: "Allow"
Action: "secretsmanager:*"
Resource: "*"

但是您应该限制 lambda 可以使用的操作和资源。 为此,您可以使用 IAM->Policies 中的policy builder

在编辑器中创建策略后,您可以单击 JSON 选项卡并查看格式。然后您需要将其调整为您的无服务器 yaml 格式。

希望能帮到你!

多米尼克

【讨论】:

  • 这不会允许 Lambda 使用 Secrets Manager 吗?我正在寻找相反的情况,我需要允许 Secrets Manager 调用我的 Lambda。
【解决方案3】:

文档中解释了为轮换 AWS Secrets Manager 密钥的 lambda 函数设置权限的过程。 [1]

简而言之,你需要两个步骤:

  • 向 lambda 函数添​​加信任策略。这可以使用 serverless.yml 文件中的 CloudFormation 资源 AWS::Lambda::Permission 来实现。但是,设置它有点棘手,因为您需要依赖于正在创建的函数。这就是为什么 DependsOn 是必要的,并且它的值必须按如下方式构造:<function-name-with-first-letter-uppercase>LambdaFunction
  • 为 lambda 函数添​​加语句以调用 AWS Secrets Manager API 来更新密钥。在以下示例中,我将这些语句(对于 单用户轮换 案例 - 请参阅文档 [1])添加到名为 rotateKeysPolicy 的客户管理策略中。

注意:函数名称在 DependsOn 属性中引用。它还在条件 StringEquals 和属性 FunctionName 中引用为:arn:aws:lambda:${self:custom.region}:${self:custom.accountId}:function:${self:service}-${self:provider.stage}-rotateKeys。如果您更改函数名称,请记住更改它们。

以下是 serverless.yml 文件的外观:

service:
  name: <your-service-name>

provider:
  name: aws
  region: '<your-region>'

custom:
  region: ${self:provider.region}
  accountId: <your-account-id>

resources:
  Resources:
    FunctionRole:
      Type: AWS::IAM::Role
      Properties:
        RoleName: basic-function-role
        ManagedPolicyArns:
          - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        Policies:
          - PolicyName: rotateKeysPolicy
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
                - Effect: Allow
                  Action:
                    - secretsmanager:DescribeSecret
                    - secretsmanager:GetSecretValue
                    - secretsmanager:PutSecretValue
                    - secretsmanager:UpdateSecretVersionStage
                  Resource: '*'
                  Condition:
                    StringEquals:
                      'secretsmanager:resource/AllowRotationLambdaArn': "arn:aws:lambda:${self:custom.region}:${self:custom.accountId}:function:${self:service}-${self:provider.stage}-rotateKeys"
                - Effect: Allow
                  Action:
                  - secretsmanager:GetRandomPassword
                  Resource: '*'
                - Effect: Allow
                  Action:
                    - ec2:CreateNetworkInterface
                    - ec2:DeleteNetworkInterface
                    - ec2:DescribeNetworkInterfaces
                  Resource: '*'
        AssumeRolePolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
              Action: sts:AssumeRole         
    LambdaInvokePermission:
      Type: AWS::Lambda::Permission
      DependsOn: RotateKeysLambdaFunction
      Properties:
        FunctionName: "arn:aws:lambda:${self:custom.region}:${self:custom.accountId}:function:${self:service}-${self:provider.stage}-rotateKeys"
        Action: lambda:InvokeFunction
        Principal: 'secretsmanager.amazonaws.com'

functions:
  rotateKeys:
    handler: lambdas.rotate_keys.handler
    role: FunctionRole

您必须替换 &lt;your-service-name&gt;&lt;your-region&gt;&lt;your-account-id&gt; 并使用例如上传您的轮换代码package -&gt; include 属性。

注意:有用于更新机密的 lambda 函数的模板。 [2][3]

还请记住正确配置您的 VPC,以便 lambda 函数能够通过网络访问 AWS Secrets Manager 服务。 [4]

参考文献

[1]https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-required-permissions.html
[2]https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-create-generic-template.html
[3]https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas
[4]https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotation-network-rqmts.html

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2020-08-27
    • 2016-02-16
    • 2020-09-28
    • 2023-01-01
    • 2023-04-03
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多