【AWS】awscli IAMユーザーに付与された権限を確認する

# 目的
AWSでの開発に必要不可欠なIAMユーザーですが、発行してもらったIAMユーザーで作業中に
「権限エラーになった:sob:」
という経験をほとんどの方がされていると思います。

そんな時に、そのIAMユーザーに割り当てられた権限をAWS CLIで確認する方法を備忘として残します。

AWSコンソール上からももちろん確認は可能です。
AWS CLIを使用するメリットとしては、
- 文字として出力しておくことで状況のエビデンスが取得できる
- 管理者等へ権限の確認や変更依頼をする時に、結局文字情報が必要になることが多い
- JSONで出力されるので、バッチ処理とか運用自動化とかにもうまく使えるかも・・・？

辺りかなと思います。

ただしこのやり方はIAM権限の読み取り（ReadOnlyAccessとか）を許可してもらえている前提であり、作業に必要なリソースしか見せてもらえない厳しい現場の場合は管理者に確認するしかありません・・・。

:::note info
AWS CLIが使用できる環境が既にある前提で話を進めます。
:::


## IAM ユーザーに直接アタッチされているポリシーを調べる
```powershell
aws sts get-caller-identity
```
このコマンドでまず自身のIAMユーザーの情報を確認します。
与えられた適切なIAMユーザーの情報をが取得できているか確認しましょう。

- 出力例
```json
{
    "UserId": "AXXXXXXXXXXXXXXX",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/user_name"
}
```

次に上記で調べたユーザーに直接アタッチされているポリシーがあるか調べます。
```powershell
aws iam list-attached-user-policies --user-name user_name
```
ただしロールベースのアクセスコントロール（RBAC）では、ユーザーグループを作成してそこにポリシーをアタッチ、ユーザーはそのユーザーグループに所属させることでポリシーを適用するという運用をされている所が多いでしょうから、IAM ユーザーに直接ポリシーはアタッチされていないかもしれません。

![スクリーンショット 2024-02-19 105015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348322/bd668148-fbd5-1b4c-7831-19349175de32.png)

- 空っぽ・・・の例
```json
{
    "AttachedPolicies": []
}
```
- 何かアタッチされている例

```json
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonEC2ReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess"
        }
    ]
}
```
## インラインポリシーの設定を調べる
上記の「list-attached-user-policies」サブコマンドの場合、IAM ユーザーに設定されたインラインの「カスタマーインライン」ポリシーは表示されません。

IAM ユーザーに直接設定するインラインポリシーは管理が煩雑になるため、AWSでもあまり推奨はされておりませんが設定自体は可能ですので、念のためその設定がないか確認します。
```powershell
aws iam list-user-policies --user-name user-name
```
```json
{
    "PolicyNames": [
        "inLinePolicy"
    ]
}
```
ポリシーの名前が分かったら、内容を確認します。
```powershell
aws iam get-user-policy --user-name user-name --policy-name PolicyName
```
```json
{
    "UserName": "user-name",
    "PolicyName": "inLinePolicy",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "ec2:Describe*",
                "Resource": "*"
            }
        ]
    }
}
```



## 所属しているユーザーグループを調べる
次に自身が所属しているユーザーグループを調べます。

```powershell
aws iam list-groups-for-user --user-name user_name
```

- 出力例
```json
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "Training",
            "GroupId": "AGPAVLODSLGGJPV5624HD",
            "Arn": "arn:aws:iam::123456789012:group/Training",
            "CreateDate": "2023-03-01T08:46:25+00:00"
        },
        {
            "Path": "/",
            "GroupName": "Test",
            "GroupId": "AGPAVLODSLGGLKXW6DDY4",
            "Arn": "arn:aws:iam::123456789012:group/Test",
            "CreateDate": "2024-02-19T00:43:12+00:00"
        }
    ]
}
```
「Training」と「Test」という2つのグループに所属していることが分かります。

## グループにアタッチされているポリシーを調べる
```powershell
aws iam list-attached-group-policies --group-name GroupName
```

- 出力例

```json
{
    "AttachedPolicies": [
        {
            "PolicyName": "IAMUserChangePassword",
            "PolicyArn": "arn:aws:iam::aws:policy/IAMUserChangePassword"
        }
    ]
}
```

ポリシーの名前が分かったので、詳細情報を確認します。
ポリシーでバージョンが指定されて公開/適用されている可能性がありますので、バージョンIDを確認します。
```powershell
aws iam get-policy --policy-arn arn:aws:iam::123456789012:policy/PolicyName
```

- 出力例
```json
{
    "Policy": {
        "PolicyName": "IAMUserChangePassword",
        "PolicyId": "ANPAJ4L4MM2A7QIEB56MS",
        "Arn": "arn:aws:iam::aws:policy/IAMUserChangePassword",
        "Path": "/",
        "DefaultVersionId": "v2",
        "AttachmentCount": 2,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "Description": "Provides the ability for an IAM user to change their own password.",
        "CreateDate": "2016-11-15T00:25:16+00:00",
        "UpdateDate": "2016-11-15T23:18:55+00:00",
        "Tags": []
    }
}
```

最後に、実際のポリシーの中身を確認します。
```powershell
aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/IAMUserChangePassword --version-id v2
```
```json
{
    "PolicyVersion": {
        "Document": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "iam:ChangePassword"
                    ],
                    "Resource": [
                        "arn:aws:iam::*:user/${aws:username}"
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "iam:GetAccountPasswordPolicy"
                    ],
                    "Resource": "*"
                }
            ]
        },
        "VersionId": "v2",
        "IsDefaultVersion": true,
        "CreateDate": "2016-11-15T23:18:55+00:00"
    }
}
```

# おしまい
この流れで調べていけば、自身のIAM ユーザーに権限が足りているのか（果たして過剰権限ではないか・・・？）が分かります。

:::note warn
AWSのポリシーは明示的なDenyが最強です。
他でAllowされていても、記述や読み取りの順に関わらずDenyが優位なので、その辺りは注意して確認する必要があります。
:::

ただ所属しているグループやポリシー名が多いと、1つ1つコマンドを打つのは大変です。
一挙に情報取得できるよう、折を見てバッチ化してみたいと考えています。