IAMポリシーをシミュレーションする2つの方法 – IAM Policy Simulator / –dryrun

目次

IAMポリシーをシミュレーションする2つの方法 – IAM Policy Simulator / –dryrun

AWS APIを実行する際に、用意したIAMポリシーで権限が足りているか、あるいは実際にどのような動作をするかを事前に確認する方法をご紹介します。

本ページでは、IAM Policy Simulatorを使う方法と、AWS CLIで–dryrunオプションを有効化する方法をご紹介します。

構築する環境

Diagram of two ways to simulate IAM policies - IAM Policy Simulator / --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インスタンスを作成します。

ユーザデータを使用して、インスタンス作成時の初期化処理を設定します。
ユーザデータを使用した初期化処理に関しては、以下のページをご確認ください。

あわせて読みたい
Linuxインスタンスの初期化方法4選 【Linuxインスタンスを初期化する4つの方法】 EC2インスタンスの起動時に初期化処理を実行する方法を考えます。 EC2インスタンスを構築時に初期化する以下の4つの手法を...

初期化処理として、最新バージョンの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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • EC2インスタンス:i-03d7ae8bb2366711f
  • IAMロール:dva-02-003-EC2Stack-1PUIWNGAOWZ9R-InstanceRole-RXZNG70RRR4A
  • S3バケット:dva-02-003

AWS Management Consoleから各リソースを確認します。

IAMロールを確認します。

Detail of IAM 1.

EC2インスタンス用のIAMロールが作成されています。
インラインポリシーとして、S3バケットにオブジェクトを保存する権限が与えられていることがわかります。

動作確認

IAM Policy Simulator

準備が整いましたので、IAM Policy Simulatorで権限をチェックします。

Detail of IAM 2.

「Simulate」ボタンを押下します。

Detail of IAM 3.

IAM Policy Simulatorのページにアクセスできました。

今回作成したIAMロールを検索します。

Detail of IAM 4.

該当するものがありましたので、これを押下します。

Detail of IAM 5.

IAMロールに関連づいているIAMポリシーが表示されます。
今回はインラインポリシーの「AccessS3Policy」を指定します。

このインラインポリシーに対するアクションを検証します。
検証したいIAMアクションを設定します。
今回はS3の以下の2つのアクションを検証します。

  • DeleteObject
  • PutObject

どちらのアクションも、テスト用バケットdva-02-003に対して実行するものとして設定します。

Detail of IAM 6.

設定が完了したら、「Run Simulator」を押下します。

以下が実行結果です。

Detail of IAM 7.

「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の詳細につきましては、以下のページをご確認ください。

あわせて読みたい
LinuxインスタンスにSSM Session Manager経由でアクセスする 【LinuxインスタンスにSSM Session Manager経由でアクセスする】 EC2インスタンスにSSM Session Manager経由でアクセスする構成を確認します。 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オプションを有効化する方法をご紹介しました。

目次