AWS IAM

AWS IAM(Identity and Access Management)は、「誰が」「どの AWS リソースに」「何をしてよいか」を管理するサービスです。SAA では、ポリシーの評価ルール(どの許可・拒否が優先されるか)と、アクセスキーを使わずにロールで権限を渡す設計が問われます。

ひとことで言うと: AWS の「入館証」と「入ってよい部屋の一覧表」を管理する仕組みです。

たとえるなら、ユーザーは社員証を持つ個人、ロールは「必要なときだけ借りる期限付きの入館証」、ポリシーは「どの部屋に入ってよいか・いけないか」を書いた一覧表です。

このページで押さえる論点

ユーザー・グループ・ロールの使い分け

IAM の登場人物は、人や仕組みを表す IAM ユーザー・IAM グループ(ユーザーのまとまり)・IAM ロール(一時的に引き受ける権限のセット)と、権限を書いた ポリシー(JSON 形式の文書)です。ポリシーには「Effect(Allow = 許可 / Deny = 拒否)」「Action(操作。例: s3:GetObject = S3 のファイル読み取り)」「Resource(対象)」を書き、必要なら「Condition(条件)」を加えます。

種類認証情報使う場面
IAM ユーザーパスワード・アクセスキー(長期的な認証情報)長期的な認証情報がどうしても必要な場合に限る。人の日常のアクセスは、ID プロバイダーとのフェデレーション(後述)で一時的な認証情報を使うのが推奨
IAM グループなし(グループ自体ではサインインしない)複数のユーザーにまとめて権限を付ける。グループの入れ子はできない。リソースベースポリシーの Principal(許可の相手)にも指定できない
IAM ロール引き受けたときだけ発行される一時的な認証情報EC2・Lambda などの AWS サービス、別アカウントの利用者、フェデレーションでサインインした人に権限を渡す

AWS アカウントを作ったときのルートユーザーはすべての権限を持つので、日常の作業には使わず、MFA(多要素認証。パスワードに加えてワンタイムパスワードなどを求める)を設定し、アクセスキーは作りません。IAM ユーザーや管理者権限を持つ人にも MFA を必須にします。権限は最小権限の原則(必要な操作・リソースだけを許可する)で付けます。

ポリシーの種類

試験で区別が必要なのは次の 4 つです。権限を与えるものと、上限を決めるだけのものがある点が重要です。

ポリシー付ける場所役割
アイデンティティベースポリシーIAM ユーザー・グループ・ロール「この人(ロール)は何をしてよいか」を与える
リソースベースポリシーS3 バケット・SQS キュー・KMS キーなどのリソース側(ロールの信頼ポリシーもこの一種)「このリソースを誰が使ってよいか」を与える。Principal で相手(別アカウントも可)を指定する
SCP(サービスコントロールポリシー)AWS Organizations(複数アカウントをまとめて管理するサービス)のアカウントや組織単位アカウントで使える操作の上限。権限は与えない
アクセス許可の境界IAM ユーザー・ロール(グループには付けられない)そのユーザー・ロールが持てる権限の上限。権限は与えない

ポリシーの評価ルール

リクエストが来ると、AWS は関係するポリシーを全部集めて判定します。順番は「① どこかに明示的な Deny があれば拒否 → ② SCP の上限の外なら拒否 → ③ Allow があれば許可 → ④ どれにも当てはまらなければ暗黙の拒否」です。優先度でいうと 明示的な拒否 > 許可 > 暗黙の拒否 になります。何も書かれていなければ拒否(暗黙の拒否)なので、使わせたい操作は必ずどこかで Allow する必要があります。

操作できるシミュレーター

ポリシーを切り替えて s3:GetObject が通るか見てみよう

IAM ユーザーが S3 のファイルを読み取る(s3:GetObject)リクエストを送ります。ポリシーを変えると、どこで決まったかが変わります。

リクエスト: s3:GetObject ① 明示的な Deny がある? ② SCP の範囲内? ③ Allow がある?
アイデンティティベースポリシー(ユーザーに付ける)
SCP(Organizations でアカウントに付ける)

※簡略化しています: 同じアカウント内のリクエストで、IAM ユーザーに付けたアイデンティティベースポリシーと SCP だけを考えます。リソースベースポリシー(S3 のバケットポリシーなど)・アクセス許可の境界・セッションポリシー・RCP・条件(Condition)は省いています。

図では省いたものも、同じ考え方で判定に加わります。

アクセス許可の境界

アクセス許可の境界(Permissions Boundary)は、IAM ユーザーやロールに付ける管理ポリシーで、そのユーザー・ロールが持てる権限の最大値を決めます。実際に使える権限は、アイデンティティベースポリシーと境界の両方で許可された操作だけ(2 つの重なった部分)です。境界だけを付けても、権限は何も増えません。

典型的な使い方は、権限管理の委任です。たとえば開発者に「IAM ロールを作ってよい」権限を渡したいが、開発者が自分より強い権限のロールを作ってしまうのは困る、という場合に、「作るロールには必ずこの境界を付けること」を条件に作成を許可します。こうすると、開発者が作ったロールは境界の範囲を超えられません。

SCP との違いは範囲です。SCP は Organizations でアカウント全体に上限をかけ、境界は個々のユーザー・ロールに上限をかけます。

IAM ロールと AWS STS

AWS STS(Security Token Service)は、一時的な認証情報を発行するサービスです。ロールを引き受ける(AssumeRole)と、STS から「アクセスキー ID・シークレットアクセスキー・セッショントークン」の 3 つがセットになった一時的な認証情報が返ります。有効期間は 15 分から最大 12 時間(ロールに設定した最大セッション時間の範囲内)で、指定しなければ 1 時間です。ロールから別のロールを引き受けるロールの連鎖では、最大 1 時間に制限されます。

ロールには 2 種類のポリシーを付けます。「ロールで何ができるか」を書くアクセス許可ポリシーと、「誰がこのロールを引き受けてよいか」を書く信頼ポリシーです。

EC2 上のアプリから S3 を使うとき、アクセスキー(長期間使える ID とパスワードの組)をサーバーに保存すると、漏えいしたときに悪用され続ける危険があります。代わりに EC2 に IAM ロールを付けると、有効期限つきの一時的な認証情報が自動で発行・更新されます。Lambda などほかのサービスも同じ考え方で、ワークロードには IAM ロールの一時的な認証情報を使うのが推奨です。

再生型アニメ図解

ロールでアクセスキーなしに S3 へアクセスする

IAM ロール インスタンス メタデータ EC2 アプリ S3 一時的な認証情報 ✓ 許可 ↻ 期限前に自動更新 ✕ アクセスキーは保存しない

※簡略化しています: 一時的な認証情報は、裏側で AWS STS(一時的な認証情報を発行するサービス)が発行したものがインスタンスメタデータから渡されます。図ではメタデータの箱にまとめています。AWS SDK を使えば、取得と更新はアプリが意識しなくても自動で行われます。

クロスアカウントアクセス

別の AWS アカウントの人やアプリにリソースを使わせる方法は 2 つあります。どちらの場合も、リクエストする側のアカウントと、リソースを持つ側のアカウントの両方で Allow が必要です。片方だけでは拒否されます。

方法リソースを持つ側(アカウント B)リクエストする側(アカウント A)
ロールの引き受けアカウント A を信頼する信頼ポリシーと、必要な操作を許可するアクセス許可ポリシーを付けたロールを作る利用者に、そのロールへの sts:AssumeRole を許可する。利用者はロールを引き受けて一時的な認証情報でアクセスする
リソースベースポリシーS3 バケットポリシーなどで、Principal にアカウント A(またはその中のユーザー・ロール)を指定して許可する利用者のアイデンティティベースポリシーで、アカウント B のリソースへの操作を許可する

ロールを引き受けている間は、元のユーザーの権限ではなくロールの権限だけで動きます。元の権限に戻るのはロールを終了したときです。自分のアカウントのリソースと相手のリソースを同時に扱いたい処理(例: 自分のバケットから相手のバケットへコピー)では、ロールではなくリソースベースポリシーが向いています。アクセスキーやパスワードを相手に渡す方法は使いません。

Condition による制限

ポリシーの Condition(条件)に AWS 全体で使える条件キーを書くと、「どこから」「どうやって」のリクエストかでアクセスを絞れます。

条件キー意味使い方の例
aws:SourceIpリクエスト元のパブリック IP アドレス社内ネットワークの IP 範囲からの操作だけを許可する。VPC エンドポイント経由のリクエストには含まれないので、その場合は aws:VpcSourceIp などの VPC 用のキーを使う
aws:MultiFactorAuthPresentMFA で認証した一時的な認証情報かどうか削除などの重要な操作や、ロールの引き受けを MFA 済みの人だけに許可する
aws:PrincipalOrgIDリクエストした人が属する Organizations の組織 IDバケットポリシーで「自社の組織内のアカウントからだけ」許可する。アカウント ID を並べる必要がなく、アカウントが増減しても書き直さなくてよい

フェデレーションと IAM Identity Center

フェデレーションとは、社内の ID(Active Directory などで管理しているアカウント)で認証した人に、AWS 側のロールの一時的な認証情報を渡す仕組みです。社員ごとに IAM ユーザーを作らずに済み、退職者の管理も社内の ID 側だけで済みます。

AWS IAM Identity Center は、社員(ワークフォースユーザー)が複数の AWS アカウントや AWS のアプリケーションに 1 か所からサインインできるようにするサービスです。Microsoft Entra ID・Okta・Active Directory などの既存の ID プロバイダーをつないでユーザーとグループを同期するか、Identity Center の中で直接ユーザーを作ります。職務ごとの権限はアクセス許可セットとして一元管理し、どのユーザー・グループにどのアカウントで割り当てるかを決めます。Organizations と組み合わせて使うのが推奨です。

なお、自社の Web アプリやモバイルアプリのエンドユーザー(お客様)のサインインには、IAM ではなく Amazon Cognito を使います。IAM・Identity Center は AWS を操作する社員や仕組みのためのものです。

IAM Access Analyzer

IAM Access Analyzer は、権限の付けすぎや意図しない公開を見つけるための機能です。

問題文のキーワード → 選ぶべき答え

問題文の言い回し答えと理由
「EC2(Lambda)から AWS のサービスを安全に呼び出す」IAM ロールを付ける。一時的な認証情報が自動で更新され、アクセスキーを置かなくてよい
「別アカウントに一時的にアクセスさせる」「長期的な認証情報を共有しない」クロスアカウントロール(信頼ポリシーで相手のアカウントを指定し、STS AssumeRole で引き受ける)
「組織内のすべてのアカウントで、特定の操作を禁止」SCP。アカウント全体の上限を決める
「開発者に IAM ロールの作成を任せたいが、権限の拡大は防ぎたい」アクセス許可の境界。作るロールに境界を付けることを条件に委任する
「社内の IP アドレスからだけ操作を許可」Condition の aws:SourceIp
「MFA で認証した場合だけ許可」Condition の aws:MultiFactorAuthPresent
「自社の組織のアカウントからだけバケットにアクセスさせる」バケットポリシーの Condition に aws:PrincipalOrgID
「既存の Active Directory の ID で複数の AWS アカウントにシングルサインオン」IAM Identity Center(ID プロバイダーを接続し、アクセス許可セットを割り当てる)
「外部に公開・共有されているリソースを洗い出す」「使っていない権限を見つける」IAM Access Analyzer
「アプリのエンドユーザーにサインイン機能を提供」Amazon Cognito。IAM は AWS を操作する人・仕組み向け

引っかけポイント

まとめ: SAA 試験で押さえるポイント

確認問題

参考リンク

AWS 公式ドキュメント(外部サイトが開きます)。