AssumeRoleについて~実践1~

この記事で分かること

  • sts get-caller-identityについて
  • AssumeRole実践1

はじめに

AssumeRoleを実際に使ってみたいと思います。基礎編で説明した内容を踏まえた各種パターンでAssumeRoleを試します。実際に出力される生データをお届けしたいので基本的にはアクセスキー等生データを貼付し、アカウント番号のみ匿名化します。(この記事のためだけに作成したユーザ等を利用するので問題なし。皆さんは気を付けてください)

AssumeRoleの基礎についての記事は以下をご覧ください。

AssumeRoleについて~基礎1~
AssumeRoleについて~基礎1~
AWSにおける重要なセキュリティ要素であるAssumeRoleについてできるだけ簡単に基礎をまとめました。
AssumeRoleについて~基礎2:Principal~
AssumeRoleについて~基礎2:Principal~
AWSにおける重要なセキュリティ要素であるAssumeRoleについてRoleを「貸す側」についての記事になります。

sts get-caller-identityについて

AssumeRoleに移る前に一つだけコマンドを説明します。

sts get-caller-identityは現在自分がどういったロールやユーザであるのかを調べるコマンドとなります。

コマンドサンプル
aws sts get-caller-identity

出力サンプル(JSON)
{
    "UserId": "AIDASAMPLEUSERID",
    "Account": "012345678901",
    "Arn": "arn:aws:iam::012345678901:user/AssumeRoleUser"
}

非常に特殊なコマンドで、sts get-caller-identityを「deny」していたとしても情報を取得することができます。

AssumeRoleの実践1

概要

AssumeRoleのみ実行できるAssumeRoleUserがS3のListBucket権限を持つロールにAssumeRoleし、S3バケットのリストを確認

AssumeRoleの実践1の概要図

準備

◆IAMユーザ作成

AssumeRoleのみできるAssumeRoleUserというIAMユーザを作成します。IAMユーザの作成は以下を参考にしてください。

ユーザにアタッチするポリシーは以下の通りで和訳すると「012345678901」アカウント内にある全てのroleに対してAssumeRoleを要請する権限を持つ。(基礎のPrincipalで述べましたが、権限を持っているからと言ってもAssumeRoleできるとは限らない。あくまでAssumeRoleしたい!と手を挙げるところまで。)

ポリシーサンプル
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::012345678901:role/*"
        }
    ]
}

AssumeRoleUserのアクセスキー等を発行し、自宅PC(AWSCLI)環境にセットします。アクセスキーの発行から設定までは以下を参照してください。

完了したらsts get-caller-identityを実行してみて、設定したユーザであれば設定完了です。

サンプルコマンド結果
PersonalPC >aws sts get-caller-identity
{
    "UserId": "AIDA5CBGTQAFY45JZ3ADQ",
    "Account": "012345678901",
    "Arn": "arn:aws:iam::012345678901:user/AssumeRoleUser"
}

AssumeRoleUserでs3コマンドを実行してもエラーになることが確認できます。

サンプルコマンド結果
PersonalPC>aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: User: arn:aws:iam::012345678901:user/AssumeRoleUser is not authorized to perform: s3:ListAllMyBuckets because no identity-based policy allows the s3:ListAllMyBuckets action

 

◆ポリシーとロール作成

次に、AssumeRoleUserのAssume先のロールを作成します。ロールにはポリシーを付与してあげる必要があり、今回は自作の(カスタムの)IAMポリシーも作成して付与します。作り方の基本的な流れはIAMユーザの作成と同じですので、サンプルポリシーと注意点のみ記載します。

IAMポリシーは以下のとおりで、s3ListBucketOnlyというポリシー名にしました。ポリシーの中身としては「test-bucket-012345678901」バケットだけを対象にs3listBucketをできるポリシーとなります。

サンプルポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::test-bucket-012345678901"
        }
    ]
}

もしS3バケットを作っていない場合は以下の記事を参考に作成してください。

ロールは「信頼されたエンティティタイプ」というタイプを選択してください。これを選択することで信頼関係の記述をイチから記述できます。信頼されたエンティティのサンプルコードは以下の通りです。

サンプルコード
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::012345678901:user/AssumeRoleUser"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

また、ロールにアタッチするポリシーは先ほど作成した「s3ListBucketOnly」ポリシーを選択します。

以上で準備完了です。

実践

現在自宅PC(AWSCLI)環境は「AssumeRoleUser」であり、S3コマンドは権限が無くエラーになった状態だと思います。この状態からAssumeRoleを実行します。AssumeRoleには二つの必須オプションがあり、「--role-arn」と「--role-session-name」です。セッション名は任意となります。

コマンド実行結果は実際のデータを体感してもらいたいので、そのまま転記します。

コマンド実行結果
PersonalPC>aws sts assume-role --role-arn "arn:aws:iam::012345678901:role/S3ListBucketOnly" --role-session-name "MySession"
{
    "Credentials": {
        "AccessKeyId": "ASIA5CBGTQAFUESGZ2IU",
        "SecretAccessKey": "PhXj7gaEFSTxqlNx+jKrrvt7/Dg/Dk6P+e/aNB4R",
        "SessionToken": "IQoJb3JpZ2luX2VjEMb//////////wEaDmFwLW5vcnRoZWFzdC0xIkYwRAIgeAO6rg1+ECBWlWRi7ZQcOfHpI5R0hdhevvwyh4Qlv8cCIFpExwEZOxO89x70ER0AwGUr1Je28SnpiPCRZRckl10hKpYCCC8QABoMODk3NzI5MTM0NjAzIgwumjpH7pBdMnRMB1cq8wGyhg3j2xrRx4UK+6vWrBsVh0i2NgvFhf+jB35hEXEMjfVzcVNM+cLEthJjrVXqmvO5GwzUReLL4ZkQdfA5GbK7DoC8V+xdHEQN0QLNTe3gmbU/UIa2KLha85WCgKytY0YFXWFulJtKnB26kW4nZtndi3kAF4Iev1vNfPhko25E8EO64+q8JSVNCrlLco7xtSbtbe7EEfiYnzK+aD2EEqcmzbelJ0bs7qvemOJzApobrdxN1RKoD1xPIHvpLlMI5SSB3Q9g8JIktaEKme4oRy0ofySVuPeePUuprNIJXi4ex4PugLgbFfVjKM2g0Fy3SRYUuQgwhIiQvwY6ngHdPdWc/FnoBMjGsSqGGoxPAKAhzgyuWJJLllgFN6etJuYknshbhNv2ErIGnVZolXeWo2PQpwLfB/EKfy2b3swmiMrxi9drLFl0SBzEq2IOSB8AzEnBGf+22O/NJ8sQaojM8qHAfDaWyY20MHv3sebZ4unfBLDCZ7pBwF6zPCmLxdKSBGVfyh4EDrkJU4rhiAXj7whWmpZL98qCjZuc2g==",
        "Expiration": "2025-03-26T14:41:24+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA5CBGTQAFRYSXYWROB:MySession",
        "Arn": "arn:aws:sts::012345678901:assumed-role/S3ListBucketOnly/MySession"
    }
}

ここで注意点として基礎の方でも述べましたが「AssumeRole」コマンドを実行しただけではAssumeRoleはされないということです。この時点ではあくまでロールのKey情報と払い出されたToken情報を取得しただけになります。試しに「aws sts get-caller-identity」を実行してみると、まだAssumeRoleUserであることが分かります。

コマンド実行結果
PersonalPC >aws sts get-caller-identity
{
    "UserId": "AIDA5CBGTQAFY45JZ3ADQ",
    "Account": "012345678901",
    "Arn": "arn:aws:iam::012345678901:user/AssumeRoleUser"
}

そこで取得したKey情報とToken情報を環境変数に登録します。(Windowsなら「set」、UNIX系ならば「export」)

Key情報とToken情報の登録
PersonalPC>set AWS_ACCESS_KEY_ID=ASIA5CBGTQAFUESGZ2IU

PersonalPC>set AWS_SECRET_ACCESS_KEY=PhXj7gaEFSTxqlNx+jKrrvt7/Dg/Dk6P+e/aNB4R

PersonalPC>set AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEMb//////////wEaDmFwLW5vcnRoZWFzdC0xIkYwRAIgeAO6rg1+ECBWlWRi7ZQcOfHpI5R0hdhevvwyh4Qlv8cCIFpExwEZOxO89x70ER0AwGUr1Je28SnpiPCRZRckl10hKpYCCC8QABoMODk3NzI5MTM0NjAzIgwumjpH7pBdMnRMB1cq8wGyhg3j2xrRx4UK+6vWrBsVh0i2NgvFhf+jB35hEXEMjfVzcVNM+cLEthJjrVXqmvO5GwzUReLL4ZkQdfA5GbK7DoC8V+xdHEQN0QLNTe3gmbU/UIa2KLha85WCgKytY0YFXWFulJtKnB26kW4nZtndi3kAF4Iev1vNfPhko25E8EO64+q8JSVNCrlLco7xtSbtbe7EEfiYnzK+aD2EEqcmzbelJ0bs7qvemOJzApobrdxN1RKoD1xPIHvpLlMI5SSB3Q9g8JIktaEKme4oRy0ofySVuPeePUuprNIJXi4ex4PugLgbFfVjKM2g0Fy3SRYUuQgwhIiQvwY6ngHdPdWc/FnoBMjGsSqGGoxPAKAhzgyuWJJLllgFN6etJuYknshbhNv2ErIGnVZolXeWo2PQpwLfB/EKfy2b3swmiMrxi9drLFl0SBzEq2IOSB8AzEnBGf+22O/NJ8sQaojM8qHAfDaWyY20MHv3sebZ4unfBLDCZ7pBwF6zPCmLxdKSBGVfyh4EDrkJU4rhiAXj7whWmpZL98qCjZuc2g==


登録が済んだら再度「aws sts get-caller-identity」を実行すると、S3ListBucketOnlyロールにAssumeRole成功が確認でき、さらにS3ListBucketコマンド成功が確認できると思います。

コマンド実行結果
PersonalPC>aws sts get-caller-identity
{
"UserId": "AROA5CBGTQAFRYSXYWROB:MySession",
"Account": "012345678901",
"Arn": "arn:aws:sts::012345678901:assumed-role/S3ListBucketOnly/MySession"
}


PersonalPC>aws s3 ls s3://test-bucket-012345678901
PRE test/
2025-03-26 22:30:50 1002 test.txt

さいごに

AssumeRoleの実践の初歩を紹介しました。まずはAssumeRoleの動きを理解できるところを目標に書きました。AssumeRoleは奥が深いのでいくつか記事を書きたいと思います。

-IAM