2

如何使用 AWS CLI 显示 IAM 策略的完整正文,包括效果、操作和资源语句?

“aws iam list-policies”命令列出所有策略,但不列出策略中包含的实际 JSON E、A、R 语句。

我可以使用“aws iam get-policy-version”命令,但这不会在其输出中显示策略名称。当我通过脚本运行此命令以获取数十个策略的信息时,无法知道输出将属于哪个策略。

还有另一种方法吗?

4

3 回答 3

5

如您所说,唯一这样做的方法如下:

  • 通过list-policies动词获取所有 IAM 策略。
  • 循环输出,获取“PolicyId”和“DefaultVersionId”。
  • 将这些传递到get-policy-version动词中。
  • 将迭代中的 PolicyName 映射到第二个请求中的 PolicyVersion.Document 值。
于 2020-05-24T13:09:07.583 回答
3

正如 mokugo-devops 在他的回答中所说,并且您在问题中所述,您只能使用“get-policy-version”来获取正确的 JSON。这是我的做法:

RAW_POLICIES=$(aws iam list-policies --query Policies[].[Arn,PolicyName,DefaultVersionId])
POLICIES=$(echo $RAW_POLICIES | tr -d " " | sed 's/\],/\]\n/g')
for POLICY in $POLICIES
    do echo $POLICY | cut -d '"' -f 4
    echo -e "---------------\n"
    aws iam get-policy-version --version-id $(echo $POLICY | cut -d '"' -f 6) --policy-arn $(echo $POLICY | cut -d '"' -f 2)
    echo -e "\n-----------------\n"
done

现在对脚本进行一些解释:RAW_POLICIES 将为您提供一个巨大的数组列表,每个数组都包含请求的策略名称和策略 ARN,以及需要的默认版本 ID。然而,它包含的空间会使直接在 bash 中对其进行迭代不太舒服(尽管对于足够顽固的人来说并非不可能)。

为了使即将到来的循环更容易,我们将清理空格,然后使用 sed 插入我们需要的空格。这是在定义 POLICIES 变量的第二行中完成的。

这让我们在实际循环中几乎没有什么可做的。在这里,我们只打印策略名称、一些漂亮的行并调用您预测将使用的函数 get-policy-version。

于 2020-05-25T17:28:20.043 回答
0

Slight modification to @uberhumus suggestion to reduce the number of policies that will be extracted . Use the --scope Local qualifier in the query to limit it . Otherwise it will spit out 100's of policies in the account . limiting the scope to local will only list policies which are user provisioned in the account ... Here's the modified version :

RAW_POLICIES=$(aws iam list-policies **--scope Local** --query Policies[].[Arn,PolicyName,DefaultVersionId])
POLICIES=$(echo $RAW_POLICIES | tr -d " " | sed 's/\],/\]\n/g')
for POLICY in $POLICIES
    do echo $POLICY | cut -d '"' -f 4
    echo -e "---------------\n"
    aws iam get-policy-version --version-id $(echo $POLICY | cut -d '"' -f 6) --policy-arn $(echo $POLICY | cut -d '"' -f 2)
    echo -e "\n-----------------\n"
done
于 2020-12-03T22:36:47.230 回答