Amazon web services IAM角色限制sts:将角色假定为一个AWS Lambda函数

Amazon web services IAM角色限制sts:将角色假定为一个AWS Lambda函数,amazon-web-services,aws-lambda,amazon-iam,Amazon Web Services,Aws Lambda,Amazon Iam,我担心安全问题。创建IAM角色具有很高的安全风险,而且事实上,您只能指定担任角色的角色作为AWS Lambda,这在IMO中还不够好。如果不小心处理,可能会出现权限升级 如何创建特定于某些Lambda函数的IAM角色 我还没有发现类似的东西,但我相信这是可能的 此角色还将附带一些政策: { "Action": "sts:AssumeRole", "Principal": { "Service": "lambda.amazonaws.com" }, "Effect": "A

我担心安全问题。创建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在评论中的说法,我不得不说哪些用户可以在哪些角色上使用pass角色,因此问题是,我如何才能确定哪些用户可以通过这个角色


如果是这样,这个问题的答案将分两步解决。使此角色仅可由Lambda服务假定(目前已是如此),然后为每个用户设置具有PassRole限制的策略。

我认为您无法实现这一点。如果你认为你需要在创建一个IMA:AW::Alam:::LAMBD::Actudio<代码>的时候分配一个IAM角色,这个IAM角色需要在lambda函数之前存在。但是,要将AWS::IAM::Role上的假定限制为单个Lambda函数,该函数需要先存在-不能同时满足这两个条件

我假设您正在使用CloudFormation创建基础架构。也许可以通过在AWS控制台中手动创建基础设施来实现这一点,但即使这是可能的,为了在您的环境/区域中实现可复制性,这本身也不是最佳做法

您的安全问题可以通过以下组合得到缓解:

  • AWS云层漂移检测
  • 限制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。)

正如前面所说的,您可以为每个环境拥有不同的帐户,并控制谁可以访问生产

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

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

  • 如何确定哪些用户可以通过此角色?创建不同的组并选择哪些组将有权访问:
    CreateRole
    Attach*Policy
    。允许开发人员自由使用
    CreatePolicy
    ,但需要针对资源的策略
    arn
    (同样,条件),或将IAM完全限制为仅负责访问控制和用户管理的一组用户


  • 我询问了AWS对此的支持。他们说,他们目前*不支持“假定”角色/信任策略中的条件,以限制哪些函数可以通过匹配函数名模式来假定角色

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

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

    -->注意:条件键“aws:userid”指定当前角色的唯一ID,该键的对应值具有以下格式:“角色ID:角色会话名称”

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

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


    *他们将“我的名字”添加到现有请求中,以添加此功能

    以扩展Steamer25提供的答案,确认您仍然无法使用IAM角色的“假定角色信任”策略中的条件,而必须使用附加到IAM角色的关联IAM策略文档中的条件

    在对其他全局条件键进行了大量测试之后,aws:userid键仍然是实现这一点的最有效方法。但是,要简化steamer25提供的实现,只需使用以下内容:

    "Condition": {
        "StringLike": {
            "aws:userid": "*:<FUNCTION_NAME>"
        }
    }
    
    “条件”:{
    “线状”:{
    “aws:userid”:“*:”
    }
    }
    

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

    如果您没有将角色与特定的Lambda函数关联(这需要您具有权限),那么Lambda函数就不能“决定”使用它。不清楚您为什么会在这里看到问题。当然,但我在这里看到的问题是,如果我让开发人员拥有两套在AWS Lambda中开发的权限,他们可能会通过将不应该的角色附加到这些Lambda来获得特权。我想能够决定lambda可以使用哪些角色。你是
    "Condition": {
        "StringLike": {
            "aws:userid": "*:<FUNCTION_NAME>"
        }
    }