IAMポリシーをシミュレーションする2つの方法 – IAM Policy Simulator / –dryrun
AWS APIを実行する際に、用意したIAMポリシーで権限が足りているか、あるいは実際にどのような動作をするかを事前に確認する方法をご紹介します。
本ページでは、IAM Policy Simulatorを使う方法と、AWS CLIで–dryrunオプションを有効化する方法をご紹介します。
構築する環境
S3 APIを対象として、Policy Simulatorと–dryrunオプションを検証を行います。
VPC内のプライベートサブネットにEC2インスタンスを配置します。
このインスタンスはNAT Gatway経由でS3バケットにアクセスします。
このインスタンスに、S3バケットに関する権限を持ったIAMロールを関連づけます。
また先述のIAMロール権限をIAM Policy Simulatorで検証します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-dva/blob/main/02/003/dva-02-003.yaml
テンプレートファイルのポイント解説
EC2インスタンス
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
IamInstanceProfile: !Ref InstanceProfile
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref InstanceSubnet
GroupSet:
- !Ref InstanceSecurityGroup
UserData: !Base64 |
#!/bin/bash -xe
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
Code language: YAML (yaml)
EC2インスタンスを作成します。
ユーザデータを使用して、インスタンス作成時の初期化処理を設定します。
ユーザデータを使用した初期化処理に関しては、以下のページをご確認ください。
初期化処理として、最新バージョンのAWS CLIをインストールします。
実行するコマンドについては、以下のページを参考に設定しました。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
IAMロール
Resources:
InstanceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
Service:
- ec2.amazonaws.com
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
Policies:
- PolicyName: AccessS3Policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- s3:PutObject
Resource:
- !Sub "arn:aws:s3:::${BucketName}/*"
Code language: YAML (yaml)
EC2インスタンスに関連づけるIAMロールです。
インラインポリシーとしてS3バケットに関する権限を設定します。
具体的には、テスト用バケットに対するオブジェクトのアップロードを許可する内容です。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- EC2インスタンス:i-03d7ae8bb2366711f
- IAMロール:dva-02-003-EC2Stack-1PUIWNGAOWZ9R-InstanceRole-RXZNG70RRR4A
- S3バケット:dva-02-003
AWS Management Consoleから各リソースを確認します。
IAMロールを確認します。
EC2インスタンス用のIAMロールが作成されています。
インラインポリシーとして、S3バケットにオブジェクトを保存する権限が与えられていることがわかります。
動作確認
IAM Policy Simulator
準備が整いましたので、IAM Policy Simulatorで権限をチェックします。
「Simulate」ボタンを押下します。
IAM Policy Simulatorのページにアクセスできました。
今回作成したIAMロールを検索します。
該当するものがありましたので、これを押下します。
IAMロールに関連づいているIAMポリシーが表示されます。
今回はインラインポリシーの「AccessS3Policy」を指定します。
このインラインポリシーに対するアクションを検証します。
検証したいIAMアクションを設定します。
今回はS3の以下の2つのアクションを検証します。
- DeleteObject
- PutObject
どちらのアクションも、テスト用バケットdva-02-003に対して実行するものとして設定します。
設定が完了したら、「Run Simulator」を押下します。
以下が実行結果です。
「Permission」の列に実行結果が表示されました。
DeleteObjectの方は失敗し、PutObjectの方は成功しました。
この実行結果は、インラインポリシーの設定内容と合致します。
このようにIAM Policy Simulatorを使用することによって、作成したIAMポリシーの権限が足りているかを事前に確認することができます。
–dryrunオプション
続いてAWS CLIの–dryrunオプションを確認します。
確認はEC2インスタンスにアクセスして行います。
インスタンスへのアクセスはSSM Session Managerを使用します。
% aws ssm start-session --target i-03d7ae8bb2366711f
...
sh-4.2$
Code language: Bash (bash)
SSM Session Managerの詳細につきましては、以下のページをご確認ください。
ユーザーデータによるインスタンスの初期化処理の実行状況を確認します。
AWS CLIのバージョンを確認します。
sh-4.2$ aws --version
aws-cli/2.9.23 Python/3.9.11 Linux/4.14.301-224.520.amzn2.aarch64 exe/aarch64.amzn.2 prompt/off
Code language: Bash (bash)
Amazon Linux 2の場合、デフォルトですと、1系のAWS CLIがインストールされていますが、現在、2系がインストールされていますので、正常に初期化処理が実行されたことがわかります。
テスト用のファイルを作成します。
sh-4.2$ touch /home/ssm-user/test.txt
Code language: Bash (bash)
このファイルをテスト用バケットにアップロードすることを考えます。
アップロード用のコマンドのオプションを確認します。
sh-4.2$ aws s3 cp help
...
--dryrun (boolean) Displays the operations that would be performed
using the specified command without actually running them.
Code language: Bash (bash)
–dryrunオプションを使用すると、アップロード時の挙動をシミュレーションできることがわかります。
–dryrunオプションを有効化した上で、アップロードコマンドを実行します。
sh-4.2$ aws s3 cp /home/ssm-user/test.txt s3://dva-02-003 --dryrun
(dryrun) upload: ../../home/ssm-user/test.txt to s3://dva-02-003/test.txt
Code language: Bash (bash)
アップロードがシミュレーションされました。
出力されたメッセージの文頭に「(dryrun)」がありますので、実際に実行されたわけではないことわかります。
次はオプションをつけずにアップロードを行います。
sh-4.2$ aws s3 cp /home/ssm-user/test.txt s3://dva-02-003
upload: ../../home/ssm-user/test.txt to s3://dva-02-003/test.txt
Code language: Bash (bash)
こちらは通常通り、アップロードが実行されました。
次にオブジェクトを削除することを考えます。
削除用のコマンドのオプションを確認します。
sh-4.2$ aws s3 rm help
...
--dryrun (boolean) Displays the operations that would be performed
using the specified command without actually running them.
Code language: Bash (bash)
こちらも削除時の挙動をシミュレーションできることがわかります。
–dryrunオプションを有効化した上で、削除コマンドを実行します。
sh-4.2$ aws s3 rm s3://dva-02-003/hoge.txt --dryrun
(dryrun) delete: s3://dva-02-003/hoge.txt
Code language: Bash (bash)
削除アクションがシミュレーションされました。
本来、このEC2インスタンスに関連づいているIAMロールでは、削除の権限(DeleteObject)は与えられていませんが、それにも関わらずシミュレーションされました。
このことから、S3関連の–dryrunオプションは、与えられているIAMポリシーのパーミッションに関係なく、動作がシミュレーションされるということがわかります。
オプションを付けずに削除を実行します。
sh-4.2$ aws s3 rm s3://dva-02-003/hoge.txt
delete failed: s3://dva-02-003/hoge.txt An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
Code language: Bash (bash)
削除に失敗しました。
やはりこのインスタンスに関連づいているIAMロールでは、削除に関する権限は与えられていないため失敗しました。
このことからも、–dryrunオプションを有効化した際の結果は、必ずしもIAMポリシーが評価されたものではないことがわかります。
まとめ
AWS APIを実行する際に、用意したIAMポリシーで権限が足りているか、あるいは実際にどのような動作をするかを事前に確認する方法として、IAM Policy Simulatorを使う方法と、AWS CLIで–dryrunオプションを有効化する方法をご紹介しました。