我被告知将我的Cloudformation限制为仅需要的命令。有角色。为了创建角色,我可以花几个月的时间浏览我的模板,以确定启动 EC2 实例实际上涉及 10 个不同的 IAM 项目(如创建标签、网络接口、卷等),并找出所有有问题的 ARN 等等。(由于这些资源尚未创建,因此下次我需要大量*
才能使此角色有用。
或者,有没有工具可以为我做到这一点?我想象提供我的模板和工具消失并完成大部分角色。也许需要根据参数更改模板的位置
。或者,如果我在启用 Cloudtrail 的情况下创建堆栈,是否有工具可以将 cloudtrail 日志转换为策略文档?
或者任何其他方法可以避免几个月的工作?
您要求将 CloudFormation 的执行角色限制为仅限制它所需的命令绝对是最佳实践,并且在 CloudFormation 控制台中,当您启动模板时,有一个"权限"选项,上面写着:
选择一个 IAM 角色以明确定义 CloudFormation 如何创建、修改或删除堆栈中的资源。如果您不选择角色,CloudFormation 会根据您的用户凭证使用权限。
这是指在部署模板时,CloudFormation 可以使用您的用户权限来部署模板中定义的服务,或者根据最佳实践和最低权限原则,CloudFormation 可以承担已设计和定义的角色,该角色具有特定于此特定模板的权限。 这是最佳做法,因为我们希望确定正在使用和执行的服务和资源。
有几种方法可以实现确定 CloudFormation 部署模板所需的权限的目标。就您而言,我想您有很多资源,因此这似乎是一项艰巨的任务,需要几个月的时间才能弄清楚,但现实是只需要几个小时。我会建议两种方法来实现这一点......让我们开始:
-
命令行界面
- 从我的 CLI 创建一个没有权限的新角色。请务必创建信任关系以允许 CloudFormation 代入角色。
- 创建一个新的空白策略文档,并将该策略附加到您刚刚创建的角色。
- 为我刚刚创建的新策略添加允许
iam:PutRolePolicy
。 - 代入 CLI 中的新角色,以便您以后使用该角色
-
创建一个 bash 脚本,该脚本将反复尝试部署 CloudFormation 模板,直到成功部署它。假设模板的格式正确,则每次脚本尝试部署模板时,都会收到权限错误,因为在步骤 2 中担任的角色没有正确的权限。该错误将如下所示:
ClientError: An error occurred (AccessDeniedException) when calling the xxxxxxxxxxxx operation: User: arn:aws:sts::[ACCOUNT-NUMBER]:assumed-role/[my-Role-Name]/[Logged In Username] is not authorized to perform: iam:PassRole on resource: xxxxxxxxxxxxx
在上面的示例中,我们的模板需要执行
iam:PassRole
但承担的角色没有执行此操作的权限,因此出现了错误。 要解决此问题,让脚本从错误(即它所需的权限)中解析iam:PassRole
,然后通过aws iam put-role-policy
命令向上述步骤 2 中创建的角色添加iam:PassRole
内联策略(此处为语法和完整要求)。将策略附加到 IAM 角色后,脚本应循环并尝试再次部署模板。它应该继续这样做,直到模板成功部署,或者直到它收到一些不相关的其他错误并且完全停止执行。成功部署后,你现在将拥有一个角色,该角色通过内联策略具有部署模板所需的确切权限。
注意 1:根据您的帐户设置和/或模板中的资源数量,您很容易发现自己达到权限边界或超出策略大小限制,这些都超出了本问题的范围,但您可能会发现自己需要解决这些问题。
注意 2:可以肯定的是,这是一种潜在的危险技术,这种脚本只能在开发环境中运行,以防止不必要的结果。如果您在不知不觉中在 CloudFormation 模板中进行了破坏性操作并在生产账户中运行了该操作,则此类脚本可能会导致灾难事件;谨慎的做法是只在 dev 中运行这样的脚本,以便能够查看创建的所有权限,确定是否有任何意外或不需要的操作/权限,然后可以为生产帐户中的部署制定适当的角色和策略具有必要的权限。
-
采用基于控制台的部署的云跟踪
一种不太高级的方法是在非生产账户中使用 CloudTail 来审核 CloudFormation 使用的权限,并从中制定策略(实际上是您问题中的第二个选项)。 我不知道有任何现成的脚本来解析 CloudTrail 日志和创建策略文档,但手动执行此操作并不困难,也可以编写脚本。当然,如果您确实使用此选项,在此阶段,我建议您坚持使用控制台,因为您很快就能看到您需要的内容。
- 使用具有管理员权限的用户登录到非生产帐户
- 转到 CloudFormation 并使用登录用户权限(即管理员)部署模板
- 部署完成后,请转到 CloudTrail 查找该用户在部署期间使用的所有权限;按
User name
筛选列表,然后从事件中查看使用了哪些权限。 - 制定具有 CloudFormation 使用的权限的策略
- 采用该策略并将其添加到 CloudFormation 将在生产账户中使用的部署角色
根据您的 bash 脚本编写技能,这两个选项应该花费大约相同的时间; 几个小时,甚至一天,绝对不是几个月。
祝你好运!