(AWS CLI)IAMユーザーがロールを引き受ける流れの説明
はじめに
この記事は書籍「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
の生成手順を示します。
- Select Type of Policy→IAM Policyを選択
- Effect→ Allowを選択
- AWS Service→Amazon EC2を選択
- -- Select Actions→DescribeInstanceTypesを選択
- Amazon Resource Name (ARN)→
*
と入力 - Add Statementボタンを押す
- 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'
実行後にレスポンスが表示されなければ成功ですので安心してください。上記のコマンドは失敗した場合にエラーを表示しますが、成功した場合には何も表示しません。
~/.aws/credentials
ファイルの編集
(Step 7)最後の手順です。~/.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.
以上でロールの引き受け後に許可された操作のみ実行できることを確認できました。
Discussion