如何在 ECS/Fargate 容器中找到我的 IAM 委托人 ARN 或用户 ID?



在 AWS 中处理 S3 存储桶策略和其他与 IAM 相关的策略时,您有时希望根据委托人允许或拒绝。但是,当您的 ECS 任务具有任务角色时,当任务实际运行时,您的主体是什么并不明显。

我为此挣扎了几个小时,AWS文档和google/Stack Overflow都没有提供太多帮助,所以我想为未来像我这样的奋斗者写下我的发现。

使用 get-caller-identity

当您的 ECS 容器运行时,您可以调用 STS 函数 GetCallerIdentity 来检索有关当前 IAM 详细信息的信息。

它将返回,其中包括:

  • 你的"arn",类似于arn:aws:sts::#########:assumed-role/YourRoleName/[uuid representing the ECS container ID].请注意,末尾的位是一个动态的 uuid,而不是像ecs-tasks.amazonaws.com
  • 您的"用户 ID",类似于AROA###############:[uuid representing the ECS container ID].

(注意:您需要将其作为容器运行的代码的一部分调用,并且需要记录输出,以便可以看到它。

(注意:这将适用于其他 AWS 位置,例如 CLI 等,以为您提供 arn 和用户 ID)

使用委托人的策略

ECS 容器的Principal是您从get-caller-identity获得的arn值。

如果需要在策略中指定委托人,可以尝试编写如下内容:

"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:sts::########:assumed-role/YourRoleName/*"
]
}
// statement continues...

(通配符是因为每个容器在 arn 末尾的 uuid 都不同。

但是,这是行不通的。主体可以是"*",但不能包含通配符。(对我来说似乎很疯狂...但显然这是真的:链接,链接)

这意味着您将无法通过其 arn 来引用您的角色,因为尾随的 uuid 总是会发生变化。

但是,如这些链接文章中所述,您可以改用ConditionStringLikeaws:userid

(不幸的是,这些"条件"不允许您引用委托人/arn,只允许用户ID和其他一些信息。

用户 ID 从get-caller-identity返回(按该名称)。

因此,策略声明最终可能如下所示:

"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Condition": {
"StringLike": {
"aws:userid": "AROA##############:*"
}
}
// statement continues...

这也适用于相反,除了StringNotLike之外,您要DENY的地方。

相关内容

  • 没有找到相关文章

最新更新