在权限策略中将AWS Lambda设置为主体

时间:2019-05-17 19:59:01

标签: amazon-web-services aws-lambda amazon-iam

我有一个非常特定的AWS Lambda函数,我想制定“ AWS Secret Manager委托人”权限策略,以便它可以检索机密。

我想只将此权限授予我的Lambda。我创建了一个角色并将该角色分配给策略。

但是,我希望能够显式地编写Principal(用于学习并一眼知道它的作用)。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Lambda Get Secret File",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXX:role/My-Lambda"    
            },
            "Resource": "arn:aws:secretsmanager:us-west-2:XXXXXX:secret:My-Secret"
        }
    ]
}

这是不允许的。 用什么方式写这个?

我看到的一切都是Lambda旋转的,我不想旋转。

2 个答案:

答案 0 :(得分:1)

在使用AWS身份/权限时,了解两种策略非常重要:

  1. 基于身份的策略(您将其附加到身份上)
  2. 基于资源的策略(您将其附加到资源上)

以前的基于身份的策略附加到IAM用户,组或角色。这些策略使您可以指定身份(用户,组或角色)可以做什么。这些策略 not 没有Principal元素,因为该策略所应用的主体隐式地是提供凭据的用户/进程。

后者是基于资源的策略,附加到资源上。这些策略指定谁可以访问给定资源以及他们可以做什么。最常见的是,您会在S3存储桶中看到它们,但它们也可以与其他资源类型关联。这些策略要做具有并要求有Principal元素。

在这种情况下,您应该为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

答案 1 :(得分:0)

在《 AWS IAM用户指南》中,有一章涉及AWS JSON Policy Elements: Principal。如果您向下滚动页面,则会看到有关 AWS服务的段落:

  

服务主体是用于向服务授予权限的标识符。标识符包括服务名称的长版本,通常采用以下格式:

     

long_service-name.amazonaws.com

因此,由于它是您正在处理的Lambda函数,主体元素应显示为:

"Principal": {
  "Service": "lambda.amazonaws.com"
},