【问题标题】:How custom role(of Lambda) works with EC2 role policy?自定义角色(Lambda)如何与 EC2 角色策略一起使用?
【发布时间】:2019-12-21 12:19:29
【问题描述】:

以下是使用 SAM 模板为 lambda 函数(AWS::Serverless::Function) 创建的自定义执行角色(some-role-serv-LogicalID-GDGGGGGBMW2):

{
  "permissionsBoundary": {
    "permissionsBoundaryArn": "arn:aws:iam::111222333444:policy/some-permission-boundary",
    "permissionsBoundaryType": "Policy"
  },
  "roleName": “some-role-serv-LogicalID-GDGGGGGBMW2”,
  "policies": [
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": "sqs:*",
            "Resource": "arn:aws:sqs:us-east-1:111222333444:someq*",
            "Effect": "Allow"
          },
          {
            "Action": [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:us-east-1:111222333444:log-group:*",
            "Effect": "Allow"
          }
        ]
      },
      "name": "lambda-policy",
      "type": "inline"
    }
  ],
  "trustedEntities": [
    "lambda.amazonaws.com"
  ]
}

some-permission-boundary 在哪里:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111222333444:log-group:*"
            ],
            "Effect": "Allow",
        },
        {
            "Action": [
                "sqs:DeleteMessage",
                "sqs:ReceiveMessage",
                "sqs:SendMessage",
                "sqs:ListDeadLetterSourceQueues",
                "sqs:GetQueueAttributes",
                "sqs:GetQueueUrl"
            ],
            "Resource": [
                "arn:aws:sqs:us-east-1:111222333444:someq*"
            ],
            "Effect": "Allow",
        }
    ]
}

some-role-serv-LogicalID-GDGGGGGBMW2 在 SAM 模板中被分配了一个权限边界(some-permission-boundary

Lambda 函数使用以下 SAM 模板语法代入自定义角色:

Role: !GetAtt LogicalID.Arn

在部署中,

lambda 是从 EC2 中的 docker 容器创建的(使用 sam deploy),

EC2 承担的附加角色策略(如下)在哪里:

   {
        "Condition": {
            "StringEquals": {
                "iam:PermissionsBoundary": "arn:aws:iam::111222333444:policy/some-permission-boundary"
            }
        },
        "Action": [
            "iam:CreateRole",
            "iam:AttachRolePolicy",
            "iam:PutRolePolicy",
            "iam:DetachRolePolicy",
            "iam:GetRolePolicy"
        ],
        "Resource": [
            "arn:aws:iam::111222333444:role/some-role*"
        ],
        "Effect": "Allow"
    }

此 EC2 策略应确保没有以下属性的任何自定义角色(例如 some-role-serv-LogicalID-GDGGGGGBMW2):

PermissionsBoundary: !Sub "arn:aws:iam::${AWS::AccountId}:policy/some-permission-boundary"

不应允许创建角色some-role-serv-LogicalID-GDGGGGGBMW2

创建堆栈时出现以下错误:

堆栈创建成功,但是,

1) 为什么sam deploy 命令会出现这个错误?

2)

EC2 策略是否不允许在没有权限边界 (some-permission-boundary) 的情况下创建自定义角色 (some-role-serv-LogicalID-GDGGGGGBMW2)?果然……

【问题讨论】:

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


    【解决方案1】:

    错误表明您的 EC2 实例、正在调用 sam deploy 操作的实体没有执行 iam:GetRolePolicy 的权限,这里确实是这种情况。

    问题是虽然您可以使用此条件限制其他 4 个操作

    "Condition": {
        "StringEquals": {
            "iam:PermissionsBoundary": "arn:aws:iam::111222333444:policy/some-permission-boundary"
        }
    }
    

    你不能对GetRolePolicy 做同样的事情。此动作不能受该条件限制,否则其效果无效。适用于此操作的唯一服务级别条件是iam:ResourceTag

    如果您转到管理控制台并尝试创建此类 IAM 策略,您会看到此警告是由您的条件与 iam:GetRolePolicy 操作相结合引起的。

    此政策定义了一些不适用的操作、资源或条件 提供权限。要授予访问权限,策略必须具有操作 具有适用的资源或条件。

    解决方案是将您的陈述分成两部分。首先,使用该条件限制创建没有必要权限边界的 IAM 角色以及除提到的iam:GetRolePolicy 之外的其他 IAM 操作。然后你应该创建第二个语句,只包含 iam:GetRolePolicy 而没有那个条件。

        {
            "Condition": {
                "StringEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam::111222333444:policy/some-permission-boundary"
                }
            },
            "Action": [
                "iam:CreateRole",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:DetachRolePolicy"
            ],
            "Resource": [
                "arn:aws:iam::111222333444:role/some-role*"
            ],
            "Effect": "Allow"
        }
    

       {
            "Action": [
                "iam:GetRolePolicy"
            ],
            "Resource": [
                "arn:aws:iam::111222333444:role/some-role*"
            ],
            "Effect": "Allow"
        }
    

    然后回答你的第二个问题。是的,您可以使用iam:PermissionsBoundary 条件键和iam:CreateRole 来防止创建没有特定权限边界的角色。

    【讨论】:

    • 还是不明白,为什么getRolePolicy应该是无条件的...因为,这个动作是由角色提出的(some-role)
    • 1.您不能将aws:PermissionBoundarycreatePolicy 一起使用。这也没有多大意义。 2. 因为它是这样设计的,而且它只是一个读取动作,所以你不会通过使用这个动作来修改任何东西,所以这种条件没有多大用处。您可以通过指定 resource 来限制其范围。
    • 是的,将aws:PermissionBoundary 与策略一起使用是没有意义的,因为我们只能选择在 SAM 模板中创建具有权限边界的角色,这就足够了
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2019-11-17
    • 2016-11-21
    • 2018-09-24
    相关资源
    最近更新 更多