はじめに
AWSログインユーザに払い出す権限は最小権限であるべき。
しかしながら、Cloudformationでは様々なリソースを一気に作る関係上必要最小限のIAMポリシーが分からない。
最小権限を調査する方法としてはIAM Access Analyzerを利用する。
この時、一時的にでもAdmin権限を渡してCloudTrailログを解析することになる。
本記事はセキュリティ管理者に権限を申請する際、何の権限が必要なのかを調べようとしたときそのポリシーの種類と情報量に圧倒された人向けである。
TL;DL
cfn-giamを利用する
note: 筆者作成ツールであり、2022/03/01時点でデバッグ未完了。フィードバック募集中。
- AWS CLI実行可能環境を用意する(CloudShellやaws configure済みのターミナル)
- cfn-giamをインストールする
pip3 install cfngiam
- Cloudformationファイルを元にIAM Policyファイルを生成する
cfn-giam -i $yourcfn -o $exportfolder
前提
以下のコマンドを実行することでリソースタイプごとの権限を取得できる
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
cfn-giam -i ./CFn/example.yml
cfn-giam generates to "./CFn/example.json"
Cloudformation folder
cfn-giam -i ./CFn -o ./dist
cfn-giam generates to "./dist/CFn/example.json"
cfn-giam generates to "./dist/MasterPolicy.json"
Cloudformation url file
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
cfn-giam -l AWS::EC2::Instance,AWS::EC2::SecurityGroup,AWS::EC2::Instance
cfn-giam generates to "./Windows_Single_Server_SharePoint_Foundation.json"
そのほか
githubはgithub actionsにより特定フォルダ内を指定してIAM Policyを生成+アーティファクトとして格納するworkflowを用意している。
また、そのWorkflowは前提として任意のAWSアカウントと連携するためのODIC+Roleを生成する必要がある。
そのためのCloudformationファイルも用意しているため参考にされたい。