三歩あるけば物も忘れる

お腹のお肉がメタボックル

ユーザ用ツール

サイト用ツール


Aws:IAM:IssueTemporaryCredentialsWithAssumeRole

10.AssumeRoleで一時的なCredentialsを発行する

IAM再入門として、ひとつひとつ理解していこうの会
AssumeRole(アシュームロール)について理解する

今回は何も権限を付与していないIAMユーザに、信頼関係を結んだIAMロールの権限を一時的付与してみる。
IAMユーザと信頼関係を結んだIAMロールの権限で、一時的なCredentialsを発行する。
・一時的なCredentialsを使用して、リソースにアクセスする。

図にするとこんな感じ、なんでも図にしようの会

前提

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を入力するだけです。

AssumeRole.ps1
$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
Aws/IAM/IssueTemporaryCredentialsWithAssumeRole.txt · 最終更新: 2021/02/08 by 127.0.0.1