IAM角色限制sts:AssumeRole到一个AWS Lambda函数

时间:2017-03-10 11:34:46

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

我担心安全问题。 IAM角色的创建具有很高的安全风险,而且您只能指定AWS Lambda是可以承担角色的角色,这一事实并不足以让IMO感到高兴。如果不小心对待,可能会有特权升级。

如何创建特定于某些Lambda函数的IAM角色?

我没有找到类似的东西,但我相信它可能是有可能的。

此角色还附带一些政策:

{
  "Action": "sts:AssumeRole",
  "Principal": {
    "Service": "lambda.amazonaws.com"
  },
  "Effect": "Allow",
  "Sid": ""
}

通常,在其他角色中,您可以使用Principal子句来决定哪些帐户可以担任该角色。

{
 "Effect": "Allow",
 "Principal": {
   "AWS": "arn:aws:iam::123456789:root"
 },
 "Action": "sts:AssumeRole"
}

根据@Michael的评论,我不得不说哪些用户可以在哪些角色上使用传递角色,因此问题是,如何确定哪些用户可以完全通过此角色?

如果是这样,这个问题的答案将分两步解决。使这个角色只能由Lambda服务(因为它已经是)来假设,然后为每个用户制定一个具有PassRole限制的策略。

4 个答案:

答案 0 :(得分:1)

我认为您将无法实现这一目标。如果您考虑在创建时需要将IAM角色分配给AWS::Lambda::Function,则需要在Lambda函数执行之前存在该IAM角色。但是,要将AWS::IAM::Role的假设限制为单个Lambda函数,则该函数必须首先存在-您不能同时满足这两个条件。

我假设您在这里使用CloudFormation创建基础架构。也许有一些方法可以通过在AWS控制台中手动创建基础架构来实现,但是即使有可能,出于跨环境/区域可复制性的考虑,这本身也不是最佳实践。

可以通过以下几种组合缓解您的安全隐患:

  • AWS CloudFormation漂移检测。
  • 限制CloudFormation以及可能的IAM访问受限的一组开发人员(例如团队负责人)。
  • 正如@milan所建议的,在不同的帐户中保留不同的环境。

唯一的另一种选择(对您无济于事)是将一个IAM角色的承担限制为另一个角色的负责人,例如:

{
  "Action": "sts:AssumeRole",
  "Principal": {
    "AWS": { "Fn::Sub": "arn:aws:iam::${AWS::AccountId}:role/role-name"}
  },
  "Effect": "Allow"
}

此解决方案仅将问题掩盖了一层-您将sts:AssumeRole限制在包含权限的角色上,但仍可以在不同的lambda上担任该父角色。

(我知道我回到一个老问题,但是我一直在研究类似的事情,即从S3加载加密对象时,将KMS密钥资源限制在特定的Lambda上。)

答案 1 :(得分:1)

我问过AWS支持这件事。他们说,他们目前*不支持假定_角色/信任策略中的条件,以通过匹配功能名称模式来限制哪些功能可以承担该角色。

相反,他们建议在执行策略中添加条件(而不是假设/信任策略):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "WhitelistSpecificLambdaFunction",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "AROAUISMSUAFHSJDJURKJ:TestLambda"
                }
            }
        }
    ]
}

-此策略拒绝访问所有Lambda函数,但特定的Lambda函数的名称在“ aws:userid”条件键中提及。其他Lambda函数将能够担当此角色,但是它们将被拒绝执行任何操作,但如果它们只是打印或返回任何变量/数据,则该函数将起作用。

->注意:条件键“ aws:userid”指定当前角色的唯一ID,并且该键的对应值具有以下格式:“ role-id:role-session-name”。

-对于我使用的示例角色,IAM角色ID为“ AROAUISMSUAFHSJDJURKJ”。

-对于Lambda函数,角色-会话名称与Lambda函数名称相同。在此示例中,它是“ TestLambda”,因此aws:userid变为“ aws:userid”:“ AROAUISMSUAFHSJDJURKJ:TestLambda”

*他们将我的名字添加到了添加此功能的现有请求中

答案 2 :(得分:0)

如前所述,您可以为每个环境使用不同的帐户,并控制谁有权访问生产。

让我们深入探讨您的问题:

  1. 如何创建特定于某些Lambda函数的IAM角色?您可以定义限制Lambda服务的主体和/或添加使用键lambda:FunctionArn定位的条件特定的lambda。缺点是,lambda必须在角色之前存在,因为您需要arn

  2. 如何确定哪些用户可以完全通过此角色?创建不同的组并选择要访问的组:CreateRoleAttach*Policy。向CreatePolicy的开发人员提供自由,但要求以资源arn为目标的政策(再次,条件)或将IAM完全限制为仅负责访问控制和用户管理的一组用户。

答案 3 :(得分:0)

为了扩展 Steamer25 here 提供的答案,确认您仍然不能在 IAM 角色的代入角色信任策略中使用条件,而必须在 IAM 附带的相关 IAM 策略文档中使用条件代替角色。

经过对其他全局条件键的大量测试,aws:userid 键仍然是实现这一目标的最有效方法。但是,为了简化 steamer25 提供的实现,只需使用以下内容:

"Condition": {
    "StringLike": {
        "aws:userid": "*:<FUNCTION_NAME>"
    }
}

其中 是您的 Lambda 函数的名称。通配符代表 IAM 角色的 ID,但是,就条件而言,通配符可以正常工作。