IAM再入門として、ひとつひとつ理解していこうの会
AssumeRole(アシュームロール)について理解する
今回は何も権限を付与していないIAMユーザに、信頼関係を結んだIAMロールの権限を一時的付与してみる。
・IAMユーザと信頼関係を結んだIAMロールの権限で、一時的なCredentialsを発行する。
・一時的なCredentialsを使用して、リソースにアクセスする。
図にするとこんな感じ、なんでも図にしようの会
Windows環境でAWSCLI(コマンドプロンプト)環境で実施しています。
Powershellも追加しました。
まずは以下の2つを作成する。
・権限を付与していないIAMユーザ
・信頼関係を結んだIAMロール(IAMロールには確認用にS3フルアクセスを付与)
①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ロールの信頼関係の定義用ファイルを作成し「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
①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" }
$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.
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" } }
①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" }
$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 #バケット一覧が取得できます。
手入力が面倒だったので、スクリプトを作成しました。
ps1で保存してPowerShell内から呼び出してください。
対話式でスイッチするロールARNを聞かれるので、ロールのARNを入力するだけです。
$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