👊

IAMロールはヘルメットじゃなくてロールセッションがヘルメットだ

2024/05/25に公開

AWS入門時に「IAMロールはヘルメットだ」と理解してしばらく経った人向けの記事です。

IAMロールがヘルメットだと何がまずいのか

IAMロールは、ヘルメットのようにIAMユーザーやAWSサービスが被って使用することができるというように説明されることがあります。

しかし、この例えではロールセッションの概念が省略されているため、ロール自身が直接使用されてアクションの実行主体になるという誤解が生まれます。

アクションの実行主体は、ロールではなく、ロールを引き受けた際に発行されたロールセッションです

AWSを使い慣れてきたら、早めにロールセッションを理解しておいた方がよいです(自戒)。そうしないと、誰がAWS上のアクションを実行するのかが理解できず、実践的なところでは例えばCloudTrailイベント履歴で「ユーザー名」に何を入力して検索すればいいのかよく分からなくなってしまいます(n敗)。

ヘルメットでないなら何が良いのか

あまり良い例は思いつきませんでしたが、少なくとも直接被って使用するものではないというイメージがあるとよいはずです

例えば、IAMロールは厳重に保管された「ヘルメットの原本」や「ヘルメットの設計図」 と言った方が、より正確に状況を説明できると思います。

この例を用いてロールの引き受け(AssumeRole)のイメージを説明すると、以下のようになります。

  1. IAMロール(ヘルメットの原本) は、STS(窓口)が管理していて、持ち出し禁止
  2. IAMユーザーがSTSに対して、ロールを引き受けたい(AssumeRole したい)と申し出る
  3. STSは、IAMロールの信頼ポリシーなどを確認して、その資格があると確認できたらIAMロールセッション(ヘルメットの複製) をIAMユーザーに渡す
  4. IAMユーザーはIAMロールセッションを使って、許可されたアクションを実行できる
  5. IAMロールセッションは一定時間経つと消滅する

まだうまく表現できていないこと

実際にはロール/ロールセッションを被ったり使ったりするのではなく、ロールを元にして力を得た式神(ロールセッション)が生まれ、その式神がアクションの主体となる、というイメージが実態に近そうです。さながら、ロールは紙人形でしょうか。

参考:IAM ロールの PassRole と AssumeRole をもう二度と忘れないために絵を描いてみた | DevelopersIO

おまけ:ロールセッション名について

IAMロールを引き受けてからアクションを実行すると、その主体はIAMロールセッションになります。

ロールセッションは arn:aws:sts::123456789012:assumed-role/role-name/role-session-name という形式のARNを持ちます。このうち最後の部分がロールセッション名です。

ロールセッションが実行したアクションが、CloudTrailで記録されると、レコードの userIdentity.arn はロールセッションARNになり、CloudTrailイベント履歴で検索できる「ユーザー名」はロールセッション名になります

ロールセッション名は、AssumeRole APIを実行する際の必須の引数(RoleSessionName)です。つまり、ロールを引き受けるときにリクエスターが決めています。マネジメントコンソールでスイッチロールしたときは、自動的にユーザー名がロールセッション名になります。Lambdaが関数に設定されたロールを引き受けるときは、関数名がロールセッション名になります。

AWS CLIで、プロファイルを使用してIAMロールを引き受けたときは、自動的に botocore-session-1609426800 のような名前がロールセッション名になります。この値は自分で設定することができるため、設定しておくとCloudTrailログの検索・追跡が楽になります。

参考:AWS CLIがAssumeRoleする際のセッション名を指定する | DevelopersIO

あとがき

IAMロールセッションや AssumeRole という概念を少し理解できて嬉しかったので、その勢いで記事を書きました。どうにも不正確な説明が混ざっている気がしています。もし気が向いた方がいましたらご指摘ください。

Discussion