AWS Cloudformationファイルを元にIAM Policyを生成する

# はじめに
AWSログインユーザに払い出す権限は最小権限であるべき。
しかしながら、Cloudformationでは様々なリソースを一気に作る関係上必要最小限のIAMポリシーが分からない。
最小権限を調査する方法としては[IAM Access Analyzer](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/what-is-access-analyzer.html)を利用する。
この時、一時的にでもAdmin権限を渡してCloudTrailログを解析することになる。

本記事はセキュリティ管理者に権限を申請する際、何の権限が必要なのかを調べようとしたときそのポリシーの種類と情報量に圧倒された人向けである。

# TL;DL
[cfn-giam](https://pypi.org/project/cfngiam/)を利用する
**note: 筆者作成ツールであり、2022/03/01時点でデバッグ未完了。フィードバック募集中。**

1. AWS CLI実行可能環境を用意する(CloudShellやaws configure済みのターミナル)
2. cfn-giamをインストールする
```sh
pip3 install cfngiam
```
3. Cloudformationファイルを元にIAM Policyファイルを生成する
```sh
cfn-giam -i $yourcfn -o $exportfolder
```

# 前提
以下のコマンドを実行することでリソースタイプごとの権限を取得できる
```sh
aws cloudformation describe-type --type RESOURCE --type-name AWS::EC2::VPC --query Schema --output text | jq .handlers
```
cfn-giamはこの機能を用いて得られた権限をIAM Policyへ変換するツール

# 詳細

### cli options

| CLI option                    | Description                                                                                                                                                                | Require   |
|-------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|
| -i, --input-path              | Cloudformationファイル、フォルダ、URLを指定する。フォルダを指定した場合、そのフォルダ下にあるすべてのファイルを再帰的に探索し、すべてを変換する。                                | yes or -l |
| -l, --input-resouce-type-list | AWS リソースタイプ名のカンマ区切り文字列リスト。例: "AWS::IAM::Role,AWS::VPC::EC2"                                                                                           | yes or -i |
| -o, --output-folderpath       | IAM Policy出力フォルダを指定する。指定しない場合、実行したカレントディレクトリまたはCloudformationファイルと同じ場所に出力する。                                                | no        |
| -v, --version                 | バージョンを表示する。                                                                                                                                                      | no        |
| -V, --verbose                 | 詳細ログを表示する。                                                                                                                                                        | no        |
| --help                        | ヘルプを表示する。                                                                                                                                                          | no        |

### cli examples

#### **Cloudformation file**
```sh
cfn-giam -i ./CFn/example.yml
```
cfn-giam generates to "./CFn/example.json"

#### **Cloudformation folder**
```sh
cfn-giam -i ./CFn -o ./dist
```
cfn-giam generates to "./dist/CFn/example.json"
cfn-giam generates to "./dist/MasterPolicy.json"

#### **Cloudformation url file**
```sh
cfn-giam -i https://s3.ap-northeast-1.amazonaws.com/cloudformation-templates-ap-northeast-1/Windows_Single_Server_SharePoint_Foundation.template
```
cfn-giam generates to "./Windows_Single_Server_SharePoint_Foundation.json"

#### **Cloudformation resouce type list**
```sh
cfn-giam -l AWS::EC2::Instance,AWS::EC2::SecurityGroup,AWS::EC2::Instance
```
cfn-giam generates to "./Windows_Single_Server_SharePoint_Foundation.json"

## そのほか
[github](https://github.com/Takenori-Kusaka/cfn-giam)はgithub actionsにより特定フォルダ内を指定してIAM Policyを生成＋アーティファクトとして格納する[workflow](https://github.com/Takenori-Kusaka/cfn-giam/blob/main/.github/workflows/CheckIAMPolicy.yml)を用意している。
また、そのWorkflowは前提として任意のAWSアカウントと連携するためのODIC+Roleを生成する必要がある。
そのための[Cloudformationファイル](https://github.com/Takenori-Kusaka/cfn-giam/blob/main/GithubOIDCRole-ReadOnly.yml)も用意しているため参考にされたい。

# 参考文献
- [最小権限のIAM Policy作成にCloudFormationのコマンドが役立つ](https://dev.classmethod.jp/articles/using-cfn-describe-type-for-least-privilege/)
- [GitHub Actions OIDCでconfigure-aws-credentialsでAssumeRoleする](https://dev.classmethod.jp/articles/github-actions-oidc-configure-aws-credentials/)
- [github](https://github.com/Takenori-Kusaka/cfn-giam)