【问题标题】:determine required permissions for AWS CDK确定 AWS CDK 所需的权限
【发布时间】:2020-07-08 21:53:33
【问题描述】:

我正在使用 AWS CDK,每次创建新资源(CodePipeline、VPC 等)时,我都会进入同一个循环......

  • 尝试部署
  • “您无权 foo:CreateBar”
  • 更新 IAM 权限
  • 尝试部署
  • “您无权使用 baz:CreateZzz”
  • 更新 IAM 权限

...一遍又一遍。然后我cdk destroy时也是这样,但是对于“foo:DeleteFoo”

是否有更有效的方法来确定策略执行特定 CDK 操作所需的权限?也许在我可以参考的文档中的某个地方?

谢谢

【问题讨论】:

  • 你能分享一个特定资源有特定错误的例子吗?
  • 是的,如果我更新我能够部署堆栈的权限。但是随着堆栈变得越来越大,失败是很耗时的,所以我想知道是否有办法提前(在部署失败之前)知道部署用户需要什么权限(通过 cli 命令、文档、或其他)。
  • 有两种方法,这两种方法都不是那么可口,因此我不提供它们作为答案:使用管理策略运行或为资源类型执行 cdk synth 和 grep,然后构建你的基于创建和销毁这些资源所需的权限的角色和策略。拒绝简单地走管理员访问路线,我使用了多种后者,随着时间的推移,我建立了一个开发角色,涵盖了我的大部分 CDK 用例。无论哪种方式都不理想。
  • 我认为这是不可行的。理论上可以分析合成的模板。尽管这可能会比您描述的烦人的循环花费您更多的时间。作为替代方案,允许通过 CloudFormation 触发的所有内容,并明确拒绝您不希望由 CFN 管理的内容。这不是最小特权原则,而是不要对每一个微小的变化都发疯的原则。 ;) 这是执行此操作的政策:stackoverflow.com/a/61102280/2753241
  • 这并不是一个专门的 CDK 问题 - 在 AWS 中获得正确的权限是一项挑战,他们可以通过文档做得更好。此外,由于 CDK 是 Cloudformation 之上的抽象,因此它变得更加困难。但是正如上面提到的那样,如果您运行 cdk synth 并检查正在创建的资源的类型,例如类型:AWS::Cognito::UserPool 应该让您大致了解您需要授予的权限,这可能是一个有用的参考docs.aws.amazon.com/service-authorization/latest/reference/…

标签: amazon-cloudformation aws-cdk


【解决方案1】:

这是一个脚本,它将执行您传递给它的任何内容,但还将捕获您传递给它的内容与完成执行之间的时间戳,并将打印配置的默认 aws 用户使用 cloudtrail 捕获的所有 AWS API 事件。操作可能需要大约 20 分钟才能显示在 cloudtrail 中,但脚本会每分钟检查一次,直到获得该时间范围内的结果。如果在该时间范围内没有进行任何 AWS api 调用,则不会返回任何结果。这是一个简单的脚本,没有最大超时或任何东西。

#!/bin/bash -x

user_name=`aws sts get-caller-identity | jq -r '.Arn' | sed -e 's/user\// /g' | awk '{print $2}'`
sleep 5 # Sleep to avoid getting the sts call in our time range

start_time=`date`
sleep 1 # Sleep to avoid millisecond rounding issues

eval $@

sleep 1 # Sleep to avoid millisecond rounding issues
end_time=`date`

actions=""
while [ -z "$actions" ]; do
sleep 60
echo "Checking for events from $start_time to $end_time..."
actions=`aws cloudtrail lookup-events --lookup-attributes AttributeKey=Username,AttributeValue=${user_name} --start-time "${start_time}"  --end-time "${end_time}" | jq -r '.Events[].CloudTrailEvent' | jq -s | jq -r '.[] | "\(.eventSource) \(.eventName)"' | sed -e 's/.amazonaws.com /:/g' | sed -e 's/[0-9]//g' | sort | uniq`
done

echo "AWS Actions Used:"
echo "$actions"

我称之为 get-aws-actions.sh,它需要安装 aws cli 和 jq。对于 cdk 我会这样使用它

./get-aws-actions.sh "cdk deploy && cdk destroy"

我将我的管理员级别凭据配置为默认配置文件,因此我知道部署不会因为权限问题而失败,然后我使用此脚本返回的结果将权限长期授予更具体的部署用户/角色术语使用。您可能遇到的问题是您第一次可能只看到一堆 :Create* 或 :Add* 操作,但实际上您需要为您看到的操作添加所有生命周期操作。因此,如果您看到 dynamodb:CreateTable,您需要确保还添加了 UpdateTable 和 DeleteTable。如果您看到 s3:PutBucketPolicy,您还需要 s3:DeleteBucketPolicy。

说实话,任何不处理允许访问数据的 API 调用的服务,我都会做 :*。一个例子可能是 ECS。我不能使用 ECS API 调用来调用 API 对容器执行 CloudFormation 管理服务不需要执行的任何操作。因此,对于该服务,如果我知道我在做容器,我只需将 ecs:* on * 授予我的部署者角色。像 s3、lambda、sqs、sns 这样的服务,可以通过 API 进行数据访问和资源创建访问,我需要更加谨慎地授予权限。我的部署者角色不应该有权从所有存储桶中读取所有数据或执行函数,但它确实需要创建存储桶和函数。

【讨论】:

  • 不知道两年前我怎么错过了这个,我会责怪covid tho。标记为most helpful 接受,因为似乎没有直接的 AWS 方式来完成我们在这里寻找的内容。非常感谢您在回复中付出的努力,谢谢。 cmets 中关于原始问题的一些好信息以及回复:'Access Adviser'。
猜你喜欢
  • 2021-04-14
  • 2020-04-12
  • 2018-07-31
  • 1970-01-01
  • 2022-12-15
  • 2018-03-04
  • 1970-01-01
  • 2021-04-12
  • 2020-11-27
相关资源
最近更新 更多