AWS IAM假设具有会话标签的相同角色,用于租户隔离



我正在开发一个由API网关和AWS lambda驱动的无服务器应用程序。每个lambda都有一个独立的角色,用于最低权限访问。对于租户隔离,我正在处理ABAC和IAM

<TenantID>为前缀提供s3桶get对象访问权限的角色示例。角色名称:test-role

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
],
"Resource": "arn:aws:s3:::test-bucket/${aws:PrincipalTag/TenantID}/*"
},
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole",
],
// Same role ARN: Ability to assume itself
"Resource": "arn:aws:iam::<aws-account-d>:role/test-role"
}
]
}

我在lambda中假设相同的角色,但会话标签为

const credentials = await sts.assumeRole({
RoleSessionName: 'hello-world',
Tags: [{
Key: 'TenantID',
Value: 'tenant-1',
}],
RoleArn: 'arn:aws:iam::<aws-account-d>:role/test-role'
}).promise();

我正在尝试用单个角色而不是两个角色实现ABAC(一个角色仅具有角色权限,另一个角色具有实际的s3权限),以便更容易管理角色,也不会达到5000的硬限制。这样做是一种好的实践吗,还是这种方法存在安全漏洞?

应该可以工作,但是像这样重用角色感觉有点奇怪。对我来说,为lambda函数设置一个角色和为lambda函数使用的s3访问设置一个角色(总共两个角色)会更有意义。

还要确保代码中的TenantID值不依赖于用户输入,因为它可能被滥用来访问另一个租户的对象。

TLDR:我不建议你这样做。

自我假设能力

我想这里有些混乱。JSON文档是一个策略,而不是角色。AWS中的策略是一种安全声明,说明谁在什么条件下可以访问什么内容。角色只是"谁"的抽象。

就我对这个问题的理解,你不需要两个角色来做你需要做的事情。但是您可能需要两个策略

在AWS中有两种与这个问题相关的策略:基于身份的策略和基于资源的策略:

  • 基于身份的策略附加到一些主体,该主体可以是一个角色。
  • 基于资源的策略附加到资源-也可以是一个角色!

角色的一个常见用例&policy用于权限委派。在本例中,我们有:

  • 一个角色,其他主体可以暂时承担
  • 一个信任策略,它控制谁可以承担角色,在什么条件下,以及他们可以采取什么操作来承担角色。信任策略是资源策略的一种特殊情况,其中资源是角色本身。
  • 权限策略,被授予承担该角色的任何人。这是身份策略的一种特殊情况,它是基于角色的假设来授予的。

重点:两个策略都关联到同一个角色。有一个角色,两个策略

现在,让我们看看你们的政策。显然,它试图同时做两件事:权限策略和角色的信任策略。

这部分试图成为信任策略:

{
"Effect": "Allow",
"Action": [
"sts:AssumeRole",
],
// Same role ARN: Ability to assume itself
"Resource": "arn:aws:iam::<aws-account-d>:role/test-role"
}

由于缺少"Principal"部分,看起来它允许任何人承担此角色。这在我看来有点不可靠,尤其是因为你声明的目标之一是"最低权限访问"。

这部分试图成为权限策略:

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
],
"Resource": "arn:aws:s3:::test-bucket/${aws:PrincipalTag/TenantID}/*"
},

不需要"Principal"节,因为它是一个身份策略。

假设您拒绝策略作为给定角色的信任策略和权限策略。似乎您想避免触及此处定义的策略(不是角色)最大配额限制5000:

AWS帐户中客户管理的策略

即使它在某种程度上有效,它也没有意义,我不会这样做。例如,考虑信任策略。信任策略应该是附加在角色上的基于资源的策略。角色是资源。因此,指定"资源"在策略没有意义时,像这样:

"Resource": "arn:aws:s3:::test-bucket/${aws:PrincipalTag/TenantID}/*"
},

更糟糕的是将此包含在信任策略中:

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
],
"Resource": "arn:aws:s3:::test-bucket/${aws:PrincipalTag/TenantID}/*"
},

这到底是什么意思?

也许我误解了这个问题,但据我所知,我的建议是:

  • 保持你的一个角色-这是好的
  • 创建两个单独的策略:一个信任策略&权限策略
  • 考虑在信任策略
  • 中添加"Principal"元素
  • 附加信任&
  • 探索其他途径避免超过5000个政策限制

相关内容

  • 没有找到相关文章

最新更新