Amazon web services IAM角色限制sts:将角色假定为一个AWS Lambda函数
我担心安全问题。创建IAM角色具有很高的安全风险,而且事实上,您只能指定担任角色的角色作为AWS Lambda,这在IMO中还不够好。如果不小心处理,可能会出现权限升级 如何创建特定于某些Lambda函数的IAM角色 我还没有发现类似的东西,但我相信这是可能的 此角色还将附带一些政策: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
{
"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所建议的,在不同的账户中保留不同的环境
{
"Action": "sts:AssumeRole",
"Principal": {
"AWS": { "Fn::Sub": "arn:aws:iam::${AWS::AccountId}:role/role-name"}
},
"Effect": "Allow"
}
此解决方案只将问题隐藏了一层-您将sts:AssumeRole
限制在包含权限的角色上,但您仍然可以跨不同的lambda承担此父角色
(我知道我又回到了一个老问题,但我一直在研究类似的问题,即在从S3加载加密对象时将KMS密钥资源限制为特定的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>"
}
}