## 10.AssumeRoleで一時的なCredentialsを発行する IAM再入門として、ひとつひとつ理解していこうの会 AssumeRole(アシュームロール)について理解する 今回は何も権限を付与していないIAMユーザに、信頼関係を結んだIAMロールの権限を一時的付与してみる。IAMユーザと信頼関係を結んだIAMロールの権限で、一時的なCredentialsを発行する。 ・一時的なCredentialsを使用して、リソースにアクセスする。 図にするとこんな感じ、なんでも図にしようの会 {{:Aws:IAM:pasted:20210210-111653.png?nolink 500x0}} ## 前提 Windows環境でAWSCLI(コマンドプロンプト)環境で実施しています。 Powershellも追加しました。 ### 環境準備 ※AdministratorAccessなどのIAM作成可能な権限で実施します。 まずは以下の2つを作成する。 ・権限を付与していないIAMユーザ ・信頼関係を結んだIAMロール(IAMロールには確認用にS3フルアクセスを付与) #### 権限を付与していないIAMユーザ作成 ①IAMユーザ作成 aws iam create-user --user-name sts-user { "User": { "Path": "/", "UserName": "sts-user", "UserId": "AIDAQIJIFR4VAWHG4KDHF", "Arn": "arn:aws:iam::012345678999:user/sts-user", "CreateDate": "2021-02-07T13:53:33+00:00" } } ②アクセスキー発行 aws iam create-access-key --user-name sts-user { "AccessKey": { "UserName": "sts-user", "AccessKeyId": "AXXXXXXXXXXXXXXXXXXX", "Status": "Active", "SecretAccessKey": "FXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "CreateDate": "2021-02-07T13:53:57+00:00" } } #### 権限を付与するIAMロール作成 ①IAMロールの信頼関係の定義用ファイルを作成し「c:\Users\[ユーザ名]\.aws」に格納します。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012345678999:user/sts-user" }, "Action": "sts:AssumeRole" } ] } ②IAMロールの作成 aws iam create-role --role-name sts-role --assume-role-policy-document file://.aws/sts-role.json { "Role": { "Path": "/", "RoleName": "sts-role", "RoleId": "AROAQIJIFR4VCIFWASFYN", "Arn": "arn:aws:iam::012345678999:role/sts-role", "CreateDate": "2021-02-07T14:31:40+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012345678999:user/sts-user" }, "Action": "sts:AssumeRole" } ] } } } ③作成したIAMロールにS3FullAccessポリシーをアタッチ aws iam attach-role-policy --role-name sts-role --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess ### 動作確認 ※作成したIAMユーザに切替て実施します。 #### 作成したIAMユーザで権限確認 ①%%AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY%%の環境変数を作成したIAMユーザの情報で設定します。 %%AWS_SESSION_TOKEN、AWS_SECURITY_TOKEN%%はおまじないです。 ②「aws sts get-caller-identity」で資格情報を確認します。 ##### コマンドプロンプト set AWS_ACCESS_KEY_ID=AXXXXXXXXXXXXXXXXXXX set AWS_SECRET_ACCESS_KEY=FXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX set AWS_SESSION_TOKEN= set AWS_SECURITY_TOKEN= aws sts get-caller-identity { "UserId": "AIDAQIJIFR4VAWHG4KDHF", "Account": "012345678999", "Arn": "arn:aws:iam::012345678999:user/sts-user" } ##### PowerShell $env:AWS_ACCESS_KEY_ID="AYYYYYYYYYYYYYYYYYYY" $env:AWS_SECRET_ACCESS_KEY="FYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" $env:AWS_SESSION_TOKEN="" $env:AWS_SECURITY_TOKEN="" aws sts get-caller-identity { "UserId": "AIDAQIJIFR4VAWHG4KDHF", "Account": "012345678999", "Arn": "arn:aws:iam::012345678999:user/sts-user" } ③「aws s3 ls」コマンドで一覧取得(当然失敗する) aws s3 ls An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records. #### 一時的なCredentialsを発行します aws sts assume-role --role-arn "arn:aws:iam::012345678999:role/sts-role" --role-session-name "sts-role-session" --duration-seconds "3600" { "Credentials": { "AccessKeyId": "AYYYYYYYYYYYYYYYYYYY", "SecretAccessKey": "FYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", "SessionToken": "IYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", "Expiration": "2021-02-07T15:57:59+00:00" }, "AssumedRoleUser": { "AssumedRoleId": "QYYYYYYYYYYYYYYYYYYYY:sts-role-session", "Arn": "arn:aws:sts::012345678999:assumed-role/sts-role/sts-role-session" } } #### 一時的なCredentialsで動作確認をする ①%%AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN%%の環境変数を発行したCredentialsの情報で設定します。 %%AWS_SECURITY_TOKEN%%はおまじないです。 ②「aws sts get-caller-identity」で資格情報を確認します。 ##### コマンドプロンプト set AWS_ACCESS_KEY_ID=AYYYYYYYYYYYYYYYYYYY set AWS_SECRET_ACCESS_KEY=FYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY set AWS_SESSION_TOKEN=IYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY set AWS_SECURITY_TOKEN= aws sts get-caller-identity { "UserId": "AROAQIJIFR4VJHUJOFG4V:sts-role-session", "Account": "012345678999", "Arn": "arn:aws:sts::012345678999:assumed-role/sts-role/sts-role-session" } ##### PowerShell $env:AWS_ACCESS_KEY_ID="AYYYYYYYYYYYYYYYYYYY" $env:AWS_SECRET_ACCESS_KEY="FYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" $env:AWS_SESSION_TOKEN="IYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" $env:AWS_SECURITY_TOKEN="" aws sts get-caller-identity { "UserId": "AROAQIJIFR4VJHUJOFG4V:sts-role-session", "Account": "012345678999", "Arn": "arn:aws:sts::012345678999:assumed-role/sts-role/sts-role-session" } ③「aws s3 ls」コマンドで一覧取得 aws s3 ls #バケット一覧が取得できます。 ## スクリプト 手入力が面倒だったので、スクリプトを作成しました。 ### PowerShell版 ps1で保存してPowerShell内から呼び出してください。 対話式でスイッチするロールARNを聞かれるので、ロールのARNを入力するだけです。 {{:Aws:IAM:pasted:20210625-141704.png?direct 600x0}} $env:AWS_ACCESS_KEY_ID="" $env:AWS_SECRET_ACCESS_KEY="" $env:AWS_SESSION_TOKEN="" $env:AWS_SECURITY_TOKEN="" $SwitchRole = Read-Host "スイッチするロールARN" $RoleSessionName = "sts-role-session" $DurationSeconds = 3600 $Credentials = aws sts assume-role --role-arn $SwitchRole --role-session-name $RoleSessionName --duration-seconds $DurationSeconds $env:AWS_ACCESS_KEY_ID=($Credentials | ConvertFrom-Json).Credentials.AccessKeyId $env:AWS_SECRET_ACCESS_KEY=($Credentials | ConvertFrom-Json).Credentials.SecretAccessKey $env:AWS_SESSION_TOKEN=($Credentials | ConvertFrom-Json).Credentials.SessionToken $env:AWS_SECURITY_TOKEN="" aws sts get-caller-identity {{tag>AWS IAM sts AssumeRole}}