AssumeRoleクロスアカウント接続

はじめに

こんにちは!sekoguchiです。
AWSWAFログイン方法でIAM(アクセス、シークレットキー)とAssumeRoleクロスアカウント接続方法がありAssumeRoleの意味が分からなかったため勉強を兼ねてテーマにしました。

AssumeRoleクロスアカウント接続

AssumeRoleクロスアカウント接続は、信頼されたアカウントの権限を一時的に引き受けて接続する方法です。
他のAWSアカウントやサービスもIAMロールの信頼済みリストに入っていれば権限を一時的に引き受けることができます。

スイッチロール

スイッチロールとは使用用途によってアカウントを変える際に、使用用途全てをアカウントとして保持するのではなくロールにすることにより、無駄なアカウント管理する必要がなくなります。

スイッチ先がスイッチ元を許可するロールを作成し、スイッチ元はスイッチロールで作成したロールを入力することで権限を入手できます。
この作業をすれば次回からは簡単にスイッチロールすることができます。

AssumeRole

AssumeRoleの英語の意味はAssume(引き受ける)Role(役割)です。
これはIAMロールの役割を一時的に引き受けることができると解釈できます。

AssumeRoleはどのような動きをするのでしょうか?

使用するサービスがAWS Security Token Service(STS)です。
STSは次の図のように認証情報を渡すサービスです。これにより一時的にIAMロールの権限を付与できます。

プログラムでアクセスする例

IAMロールに下記JSON書き換えによって登録したIAMユーザーからAssumeRoleを通じて権限を一時的に付与できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "IAMユーザーarn"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

例えばS3にアクセスしたいIAMユーザーがいます。
S3にアクセス権限を持ったIAMロールをあらかじめ用意し、IAMロールに信頼するユーザーを登録。

IAMユーザーはSTSを使用しIAMロールに権限使用申請をします。
信頼されているユーザーであれば一時的に権限を付与します。
これでようやくIAMユーザーはS3にアクセスすることができます。

信頼されたアカウントであれば権限を付与できるため、アクセスしたいユーザーを信頼済みに追加すれば一時的な権限を得ることができます。
ではなぜAssumeRoleクロスアカウント接続する必要があるのでしょうか。

1. たくさんのIAMユーザーのアカウントを作成・管理する必要が無い

別のユーザーに接続する場合接続先にアカウントを作らなくてもロールを作成しておけば
AssumeRoleにて接続することができ、わざわざアカウントを作成しなくてよいため
アカウント管理を削減できる。

IAMユーザーを複数作成しなくてもIAMロールの信頼済みにすることにより
IAMユーザー一つで運用することができます。これによりユーザー管理が楽になります。

2. AssumeRoleを使用することでセキュリティを強固にできる

IAMユーザーを複数作成するとその分アクセスキーとシークレットキーが必要になります。
一つ二つなら管理は楽ですが、たくさんアカウントがあるとそれだけキーの管理が必要となり
漏洩リスクが高まります。IAMユーザーに権限を持たせると漏洩時その権限を使用し操作が可能になります。

AssumeRoleを使用することでIAMユーザーを減らしキーの管理が容易であり
認証情報が一時的なため、万が一アクセスキーが漏洩してもAssumeRoleのみにしておけば漏洩しても
AssumeRoleしか権限がないため被害を最小限に抑えることができます。
またAssumeRoleはSTSを使用するため接続を複雑にすることができ、セキュリティ面を強化できます。

まとめ

IAM接続するよりもAssumeRoleクロスアカウント接続ではSTSを使用し、信頼関係を結んだアカウントからしか接続できない方法のためAssumeRoleクロスアカウント接続のほうがセキュリティをより強固なものにできる。