AWSのIAMロールの「信頼されたエンティティ」に外部アカウントが設定されているロールを抽出したい with ChatGPT

組織で長くAWSを使用していると一貫した管理を継続していくことは難しくなってきます。

AWSのIAMロールの「信頼されたエンティティ」に外部アカウントを設定することはよくあると思いますが、今どんな外部アカウントが設定されているか抽出したいとなった時、AWSコンソールで1つ1つ見ていくのは面倒なので、一発で抽出したいですよね。

昨日2023年5月26日に日本でも使えるようになったChatGPTのiOSアプリで聞いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41382/3b9e3ded-d5b3-3168-52ea-e5d7014ae6dd.png)


## 質問
あなたはawsの専門家です。
awsでiamロールの信頼ポリシーに外部のアカウントが設定されているものを抽出して確認するにはどうすればよいですか？

## 回答
AWS IAMロールの信頼ポリシーを確認して、外部のAWSアカウントが設定されているかどうかを確認するには、以下の手順を参考にしてみてください。

1. AWS Management Consoleにサインインします。

1. [Services] を選択し、[Security, Identity, & Compliance] セクションから [IAM] を選択します。

1. ナビゲーションパネルの [Roles] を選択します。

1. 個々のロールをクリックして、その詳細と信頼関係を確認します。信頼関係タブにある信頼ポリシー文書に、 "sts:AssumeRole"というアクションで、外部のAWSアカウントIDが "Principal"としてリストされているかどうかを確認します。

しかし、大量のロールを手動で確認するのは非効率的です。そのため、スクリプトを使って自動化することをお勧めします。AWS CLIやAWS SDKを使ってこれを実現できます。

たとえば、AWS CLIを使用すると次のようなコマンドを実行できます：

```
aws iam list-roles | jq -r '.Roles[] | select(.AssumeRolePolicyDocument.Statement[0].Principal.AWS != null) | .RoleName'
```

これは、すべてのIAMロールをリストアップし、その中で信頼ポリシーにAWSアカウントIDが "Principal"として設定されているロールの名前を表示します。

注意: このコマンドは jq を使用しています。jq はコマンドラインJSONプロセッサで、Linux, OS X, Windowsなどの多くのプラットフォームで利用可能です。

これらの手順を利用して、IAMロールの信頼ポリシーに設定されている外部のAWSアカウントを確認してみてください。

## 実際に実行
見事に目的通り、ロールが抽出できました。出力イメージは以下のようなものになります。

```
ロール名1
ロール名2
```

上記のコマンドだとロール名だけが表示されますが、どの外部アカウントかの情報も欲しいですね。
追加で質問してみます。

## 質問2
ありがとうございます。そのコマンドだとロール名だけが出力されますが、外部アカウントIDも出力するコマンドを教えてください。

## 回答2
AWS CLIと`jq`を使用して、IAMロール名とそれに関連する外部アカウントIDを出力するためには、以下のようなコマンドを実行することができます：

```bash
aws iam list-roles | jq -r '.Roles[] | select(.AssumeRolePolicyDocument.Statement[0].Principal.AWS != null) | {RoleName: .RoleName, TrustAccount: .AssumeRolePolicyDocument.Statement[0].Principal.AWS}'
```

このコマンドは、信頼ポリシーにAWSアカウントIDが"Principal"として設定されているIAMロールの名前と、それらのロールが信頼しているAWSアカウントIDをJSON形式で出力します。

ただし、このコマンドはロールに対する信頼ポリシーが一つだけの場合にのみ正常に機能します。信頼ポリシーが複数ある場合は、このコマンドの修正が必要となります。


## 実際に実行2
ロール名と外部アカウントが抽出できました。出力イメージは以下のようなものになります。

```
{
  "RoleName": "ロール名1",
  "TrustAccount": "arn:aws:iam::AWSアカウントID:ユーザー名"
}
{
  "RoleName": "ロール名2",
  "TrustAccount": "arn:aws:iam::AWSアカウントID:role/ロール名"
}
```

## 補足
AWS CLIでプロファイルを設定している場合は、以下のように `--profile` を付ける必要があります。
```
aws iam list-roles --profile <your-profile-name> | jq ...
```


## Web版だとイマイチな結果が返ってきた
iOSアプリでのやりとりの後、同じ質問をWeb版でしてみたのですが、違う回答になりました。


## Web版回答
AWS Identity and Access Management(IAM)のロールの信頼ポリシーを抽出し、外部アカウントが設定されているか確認するには、AWS CLIまたはAWS SDKを使うことができます。

以下に、AWS CLIを使用してIAMロールの信頼ポリシーを抽出し、外部アカウントが設定されているかどうかを確認する一般的な手順を示します：

1. AWS CLIをインストールおよび設定します。

2. 以下のコマンドを実行して、すべてのIAMロールのリストを取得します：

   ```
   aws iam list-roles
   ```

   このコマンドは、ロール名、ロールID、ロールARN、作成日、ロールの信頼関係など、アカウントにあるすべてのIAMロールに関する情報を出力します。

3. 各ロールの信頼関係を取得するには、以下のコマンドを実行します：

   ```
   aws iam get-role --role-name {role-name}
   ```

   ここで{role-name}は調査する特定のIAMロールの名前です。このコマンドは、指定したロールの詳細情報を出力します。その出力の一部として、ロールの信頼ポリシー（Trust Policy）が含まれています。

4. 上記の手順で取得した信頼ポリシーの中から、以下のような形式のものを探します：

   ```
   "Principal": {
     "AWS": "arn:aws:iam::ACCOUNT_ID:root"
   }
   ```

   ここでACCOUNT_IDは信頼する外部アカウントのIDです。このIDがあなたのAWSアカウントIDと異なる場合、そのIAMロールは外部アカウントに信頼されていると考えられます。

上記の手順は手動で行わなければなりませんが、これを自動化するスクリプトを書くことも可能です。ただし、そのスクリプトはあなたの独自の要件とセキュリティポリシーに準拠していることを確認する必要があります。


# 感想
ChatGPTすごい。楽。

iOS版とWeb版で回答が違ったんですが、こういうことはよくあるんですかね。

Web版でも追加で「自動化スクリプトを書いてもらえませんか」と言ったら、PythonでAWS SDK使ったスクリプトを書いてくれました。素晴らしい。
jqの方が簡単に実行できるので良いなとは思いましたが。