## 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}}