🤖

(AWS CLI)IAMユーザーがロールを引き受ける流れの説明

2023/08/19に公開

はじめに

この記事は書籍「AWSの知識地図」の非公式な補足記事です。著者や出版社へのお問い合わせはお控えください。

AWSの知識地図の第3章(3.1.6 IAMロール)にて次のような説明がされています。以下、本文から引用します。

IAMロールを用いることで、必要な時に必要な人やリソースが、AWSへのアクセス権限を得られます。これにより、実行頻度の低いアクションをIAMユーザーに対して許可しなくても、必要な時にIAMロールを引き受けて、適切な権限を付与する、といったセキュアな運用が可能になります。

リソース(EC2インスタンス)がロールを引き受ける流れについては書籍の第2章で説明されています。

この記事では人、つまりIAMユーザーがロールを引き受ける流れを説明します。

前提

  • 作業にあたり、AdministratorAccess権限を持つIAMユーザーは作成済みとします。
  • AWS CLIについて、記事を投稿した時点で最新のバージョン(2.9.15)で動作確認をしました。

ロール引き受けの流れ

それでは、IAMユーザーがロールを引き受ける流れを説明します。

(Step 1)IAMユーザーの作成

まずはIAMユーザーを作成します。以下のコマンドを実行してください。

aws iam create-user \
  --user-name 'testuser'

IAMユーザーの名前は何でも構いません。ここでは仮にtestuserとしました。

(Step 2)アクセスキーの作成と設定

続いてアクセスキーを作成します。以下のコマンドを実行してください。

aws iam create-access-key \
  --user-name testuser

成功すると以下のようなレスポンスが表示されます。AccessKeyIdとSecretAccessKeyは伏せ字にしてあります。

{
  "AccessKey": {
    "UserName": "testuser",
    "AccessKeyId": "xxxxxxxx",
    "Status": "Active",
    "SecretAccessKey": "xxxxxxxx",
    "CreateDate": "2023-08-19T01:33:23+00:00"
  }
}

続けて認証情報を設定します。以下のコマンドを実行してください。

aws configure \
  --profile testuser

コマンド実行後の入力欄は以下のように記入してください。

AWS Access Key ID [None]: レスポンスのAccessKeyId
AWS Secret Access Key [None]: レスポンスのSecretAccessKey
Default region name [None]: ap-northeast-1
Default output format [None]: json

(Step 3)権限の確認

この時点でtestuserには何の権限も付与されていません。試しにEC2インスタンスの種類一覧を取得して、失敗することを確認しましょう。

aws ec2 describe-instance-types \
  --profile testuser

以下のように権限が不足している旨のエラーが表示されます。

An error occurred (UnauthorizedOperation) when calling the DescribeInstanceTypes operation: You are not authorized to perform this operation.

(Step 4)ポリシーの作成

続いてポリシーを作成します。例としてEC2インスタンスの種類一覧を取得する権限(ec2:DescribeInstanceTypes)のみ許可したポリシーを作成します。

以下の内容をtoy-policy.jsonファイルとして保存してください。保存場所は作業中のディレクトリでも構いませんし、/tmpなど適当なディレクトリでも構いません。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "ec2:DescribeInstanceTypes"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

ファイルを作成したら、以下のコマンドを実行してください。

aws iam create-policy \
  --policy-name 'ToyPolicy'
  --policy-document 'file:///path/to/toy-policy.json'

例えば、jsonファイルのパスが/tmp/toy-policy.jsonであれば、--policy-document 'file:///tmp/toy-policy.json'と指定してください。

成功すると以下のようなレスポンスが表示されます。

{
  "Policy": {
    "PolicyName": "ToyPolicy",
    "PolicyId": "ANPATE7HL3I5XLFITIPVL",
    "Arn": "arn:aws:iam::123456789:policy/ToyPolicy",
    "Path": "/",
    "DefaultVersionId": "v1",
    "AttachmentCount": 0,
    "PermissionsBoundaryUsageCount": 0,
    "IsAttachable": true,
    "CreateDate": "2023-08-19T01:55:30+00:00",
    "UpdateDate": "2023-08-19T01:55:30+00:00"
  }
}

ポリシーのARNはレスポンスの5行目に表示されています。文字列の中の123456789はAWSアカウントのIDです。この数値は例ですので各自で読み替えてください。

ポリシーのARNは後ほど利用しますのでメモしてください。

AWS Policy Generator

ポリシーのJSONを一から作成するのは面倒です。そんなときはAWS Policy Generatorを使いましょう。

指示に従って項目を選択するとポリシーが生成されます。AWSの公式ツールですから安心して利用できます。

参考までに、Step 4で作成したtoy-policy.jsonの生成手順を示します。

  1. Select Type of Policy→IAM Policyを選択
  2. Effect→ Allowを選択
  3. AWS Service→Amazon EC2を選択
  4. -- Select Actions→DescribeInstanceTypesを選択
  5. Amazon Resource Name (ARN)→*と入力
  6. Add Statementボタンを押す
  7. Generate Policyボタンを押す

以上でポリシーのJSONが生成されます。

なお、生成されたJSONには"Sid": "StmtXXXXXXXX",という行が含まれています。

これは複数のステートメント(権限)を区別するため自動的に割り振られたIDです。今回は1つのポリシーに1つの権限しか含めていないため、Sidは削除して構いません。

(Step 5)ロールの作成

続いてロールを作成します。まずはIAMユーザーtestuserのARNを確認するため、以下のコマンドを実行してください。

aws sts get-caller-identity \
  --profile testuser

成功すると以下のようなレスポンスが表示されます。4行目がIAMユーザーtestuserのARNですからメモしてください。

{
  "UserId": "AIDATE7HL3I553M2LGSQD",
  "Account": "123456789",
  "Arn": "arn:aws:iam::123456789:user/testuser"
}

次は信頼ポリシーのjsonファイルを作成します。以下の内容をtrust-policy.jsonファイルとして保存してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "IAMユーザー(testuser)のARN"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

ファイルを作成したら、以下のコマンドを実行してください。

aws iam -create-role \
  --role-name toy-role \
  --assume-role-policy-document 'file:///path/to/trust-policy.json'

成功すると以下のようなレスポンスが表示されます。

{
  "Role": {
    "Path": "/",
    "RoleName": "toy-role",
    "RoleId": "AROATE7HL3I55QTWJYHKT",
    "Arn": "arn:aws:iam::123456789:role/toy-role",
    "CreateDate": "2023-08-19T02:06:43+00:00",
    "AssumeRolePolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::123456789:user/testuser"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  }
}

ロールのARNは6行目に表示されています。後ほど利用しますのでメモしてください。

(Step 6)ポリシーの割り当て

以下のコマンドを実行してください。

aws iam attach-role-policy \
  --role-name toy-role \
  --policy-arn 'ポリシーのARN'

実行後にレスポンスが表示されなければ成功ですので安心してください。上記のコマンドは失敗した場合にエラーを表示しますが、成功した場合には何も表示しません。

(Step 7)~/.aws/credentialsファイルの編集

最後の手順です。~/.aws/credentialsファイルを以下のように変更してください。

変更前

[testuser]
aws_access_key_id = xxxxxxxx
aws_secret_access_key = xxxxxxxx

変更後

[testuser]
role_arn = ロールのARN
source_profile = testuser
aws_access_key_id = xxxxxxxx
aws_secret_access_key = xxxxxxxx

(Step 8)権限の再確認

ロールを引き受ける準備が整いました。試しにEC2インスタンスの種類一覧を取得してみましょう。

aws ec2 describe-instance-types \
  --profile testuser

コマンドは成功するはずです。

権限のない操作も試してみましょう。試しにVPC一覧を取得した結果を示します。

aws ec2 describe-vpcs \
  --profile testuser

以下のように権限が不足している旨のエラーが表示されます。

An error occurred (UnauthorizedOperation) when calling the DescribeVpcs operation: You are not authorized to perform this operation.

以上でロールの引き受け後に許可された操作のみ実行できることを確認できました。

参考資料

  1. AWS JSON policy elements/ Principal - AWS Identity and Access Management
  2. Use an IAM role in the AWS CLI - AWS Command Line Interface
  3. aws-cliでAssumeRoleを実行してみる sts assume-roleコマンドパターン・config+credentialsパターン - Qiita

Discussion