AWS IAM
AWS IAM(Identity and Access Management)は、「誰が」「どの AWS リソースに」「何をしてよいか」を管理するサービスです。SAA では、ポリシーの評価ルール(どの許可・拒否が優先されるか)と、アクセスキーを使わずにロールで権限を渡す設計が問われます。
ひとことで言うと: AWS の「入館証」と「入ってよい部屋の一覧表」を管理する仕組みです。
たとえるなら、ユーザーは社員証を持つ個人、ロールは「必要なときだけ借りる期限付きの入館証」、ポリシーは「どの部屋に入ってよいか・いけないか」を書いた一覧表です。
このページで押さえる論点
- ユーザー・グループ・ロールの使い分けと、ルートユーザーの保護(MFA)
- ポリシーの種類(アイデンティティベース・リソースベース・SCP・アクセス許可の境界)
- ポリシーの評価ルール(明示的な拒否・許可・暗黙の拒否)
- アクセス許可の境界による権限管理の委任
- IAM ロールと AWS STS(AssumeRole・一時的な認証情報・EC2 のロール)
- クロスアカウントアクセス(ロールの引き受けとリソースベースポリシー。両側での許可が必要)
- Condition による制限(aws:SourceIp・MFA・組織 ID)
- フェデレーションと IAM Identity Center(複数アカウントへのサインイン)
- IAM Access Analyzer(外部公開・未使用の権限の検出、ポリシーの検証)
ユーザー・グループ・ロールの使い分け
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)リクエストを送ります。ポリシーを変えると、どこで決まったかが変わります。
※簡略化しています: 同じアカウント内のリクエストで、IAM ユーザーに付けたアイデンティティベースポリシーと SCP だけを考えます。リソースベースポリシー(S3 のバケットポリシーなど)・アクセス許可の境界・セッションポリシー・RCP・条件(Condition)は省いています。
図では省いたものも、同じ考え方で判定に加わります。
- リソースベースポリシー: 同じアカウント内なら、アイデンティティベースポリシーとリソースベースポリシーのどちらか一方で Allow されていれば許可されます。別アカウントからのアクセスでは両方の Allow が必要です(クロスアカウントアクセスを参照)。
- アクセス許可の境界: SCP と同じく「上限」です。境界の外の操作は、アイデンティティベースポリシーで Allow していても拒否されます。
- Condition: 条件に合わないリクエストには、その Allow や Deny が当てはまりません(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 へアクセスする
※簡略化しています: 一時的な認証情報は、裏側で 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:MultiFactorAuthPresent | MFA で認証した一時的な認証情報かどうか | 削除などの重要な操作や、ロールの引き受けを 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 は、権限の付けすぎや意図しない公開を見つけるための機能です。
- 外部アクセスの検出: S3 バケット・IAM ロール・KMS キー・Lambda 関数・SQS キューなどのリソースベースポリシーを分析し、信頼する範囲(自分のアカウントや組織)の外から使える状態のもの(パブリック公開・他アカウントへの共有)を検出します。
- 未使用のアクセスの検出: 使われていないロール、アクセスキー、パスワード、権限(サービス・操作)を見つけます。
- ポリシーの検証: ポリシーの文法やベストプラクティスに照らしてチェックし、警告や改善案を出します。
- ポリシーの生成: CloudTrail のログから実際に使った操作を調べ、それに合わせたポリシーを作ります。最小権限に絞り込むときに使います。
問題文のキーワード → 選ぶべき答え
| 問題文の言い回し | 答えと理由 |
|---|---|
| 「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 を操作する人・仕組み向け |
引っかけポイント
- 「SCP で許可すれば、IAM ユーザーはその操作ができる」→ ✕。SCP は上限だけで権限を与えない。IAM 側でも Allow が必要
- 「アクセス許可の境界を付けると、その範囲の権限が与えられる」→ ✕。境界も上限だけ。アイデンティティベースポリシーとの重なった部分しか使えない
- 「別アカウントからのアクセスは、バケットポリシーで許可すれば足りる」→ ✕。リクエストする側のアカウントでも Allow が必要(両側での許可)
- 「ユーザーに直接付けた Allow は、グループに付けた Deny より優先される」→ ✕。どこに付けても明示的な Deny が最優先
- 「バケットポリシーの Principal に IAM グループを指定する」→ ✕。グループは Principal に指定できない。ユーザー・ロール・アカウントを指定する
- 「アクセスキーを EC2 の設定ファイルや AMI に入れておく」→ ✕。IAM ロールで一時的な認証情報を使う
まとめ: SAA 試験で押さえるポイント
- 評価の基本: 何も書かれていなければ拒否(暗黙の拒否)。Allow があれば許可。ただし明示的な拒否(Deny)は、どの Allow よりも優先される
- SCP とアクセス許可の境界は「上限」を決めるだけで、権限を与えない。上限の中で、ユーザーやロール側で Allow した操作だけが使える
- EC2・Lambda などから AWS を操作するときは、アクセスキーを置かずに IAM ロールを使う。一時的な認証情報が自動で更新される
- 別アカウントの人に権限を渡す → そのアカウントから引き受けられるロール(クロスアカウントロール)を作る。アクセスキーを共有しない。クロスアカウントでは両側での許可が必要
- 最小権限の原則: 必要な操作・リソースだけを許可する。ルートユーザーは日常の作業に使わず、MFA(多要素認証)を設定する
- S3 のバケットポリシーのように、リソース側に付けるリソースベースポリシーもある(同じアカウントなら、どちらか一方の Allow で許可される)
- 社員の複数アカウントへのサインインは IAM Identity Center、公開・共有や未使用の権限の洗い出しは IAM Access Analyzer
確認問題
参考リンク
AWS 公式ドキュメント(外部サイトが開きます)。
- IAM とは
- IAM でのセキュリティのベストプラクティス
- IAM ユーザーグループ(入れ子にできない・Principal に指定できない)
- リクエストの許可・拒否の判定方法(ポリシー評価ロジック)
- クロスアカウントのポリシー評価ロジック
- サービスコントロールポリシー(SCP)
- IAM エンティティのアクセス許可の境界
- AssumeRole(AWS STS API リファレンス。有効期間 900〜43,200 秒・既定 3,600 秒・ロールの連鎖は 1 時間)
- IAM ロールを使用して EC2 上のアプリケーションにアクセス許可を付与する
- 所有している別の AWS アカウントへのアクセスを IAM ユーザーに提供する
- IAM ロールとリソースベースのポリシーの違い
- AWS グローバル条件コンテキストキー
- IAM Identity Center とは
- IAM Access Analyzer の使用