FOR LEARNERS学習中向け

Fアイデンティティと権限段2構成層設計

IAM の権限の決め方|管理ポリシーから始め、最小権限へ「広く出して絞る」設計

IAM の権限の決め方|管理ポリシーから始め、最小権限へ「広く出して絞る」設計

IAM のユーザー・ロール・ポリシーという言葉は分かった。許可と拒否の評価順も読んだ。それでも「実際に誰にどのポリシーをどこまで付けるのか」で手が止まる、という段階の記事です。AdministratorAccess を付ければ確かに動きますが、それでは最小権限になりません。かといって JSON を1行目から書く自信もない。ここでは、その迷いを3つの判断に分けて、順番に決められるようにします。

この記事の結論

  • 権限の設計は「誰に付けるか」「ポリシーの種類をどれにするか」「どこまで絞るか」の3つの判断に分けて決めます。
  • 人のサインインは一時的な認証情報(フェデレーション)、アプリはロールが基本です。長期のアクセスキーは例外です。
  • 出発点は AWS 管理ポリシーです。用途に絞りたいときは、コピーしてカスタマー管理ポリシーにします。
  • インラインポリシーは「その1つの主体だけ」の例外用です。複数の主体に付くなら管理ポリシーにします。
  • 最小権限は一度で決めません。広く始め、使われた実績を見ながら絞ります。

権限の設計では何を決めるのか|主体・ポリシーの種類・絞り方の3つ

権限の設計で決めることは、実は3つしかありません。順番に、ひとつずつ決めていきます。

  1. 誰に付けるか(主体)。 人なのか、アプリケーションなのか。人ならどう束ねるか。
  2. どのポリシーの種類にするか。 AWS 管理ポリシー、カスタマー管理ポリシー、インラインポリシーのどれか。
  3. どこまで絞るか。 アクション・リソース・条件のどこで狭めるか。

迷う原因の多くは、この3つを一度に決めようとすることです。「S3 の読み取りだけ許可するポリシーを、開発者に付ける」という1文の中に、3つの判断が混ざっています。分けて考えると、それぞれの選択肢は意外に少なく、決めやすくなります。

THREE DECISIONS決めることは3つ

権限の設計は誰に・どの種類で・どこまで絞るかの3つに分ける

  1. 主体

    誰に付けるか — 人はフェデレーション、アプリはロール

    同じ権限の人はグループで束ねる

  2. 種類

    どのポリシーにするか — 管理ポリシーが基本

    インラインは1つの主体だけの例外

  3. 絞り

    どこまで絞るか — アクション・リソース・条件

    広く始めて、実績を見て狭める

なお、権限の設定そのものは利用者の側の責任です。AWS が土台を守ってくれても、誰に何を許すかは自分たちが決めることになります。この前提のうえで、3つの判断を順に見ていきます。

誰に付けるか|人はフェデレーション、アプリはロール、グループで束ねる

人には一時的な認証情報を

AWS のベストプラクティスは、人が AWS にアクセスするときは、ID プロバイダーとのフェデレーションで一時的な認証情報を使うことを勧めています。会社のアカウント管理の仕組みでサインインし、そのつど短い期間だけ有効な認証情報を受け取る形です。この仕組みを組み込んだ入口が IAM Identity Center で、詳しくは READ ALSO — 学習中向け・段2 構成 IAM Identity Center とは何か|複数アカウントへのサインインを1か所にまとめ、許可セットで権限を配る で扱っています。

IAM ユーザーに長期のパスワードやアクセスキーを持たせる形は、漏れたときに長く悪用されるため、例外の扱いです。

アプリにはロールを

EC2 や Lambda のような、AWS の上で動くアプリケーションは、IAM ロールで権限を受け取ります。たとえば Lambda 関数なら、関数に実行ロールを割り当て、そのロールに必要な権限だけを付けます。EC2 なら、インスタンスにロールを付けると、一時的な認証情報が自動で配られ、自動で入れ替わります。

反対に、アクセスキーをソースコードや設定ファイルに書き込む形は、公開リポジトリやログから漏れる典型的な事故の元です。後の「設計の失敗例」でもう一度触れます。

同じ権限をまとめて渡すにはグループ

同じ権限を複数の人にまとめて渡したいときは、IAM グループを使います。権限をグループに付け、人をグループに入れます。担当が変わったら、グループから外して別のグループに入れるだけです。ユーザー1人ずつにポリシーを付けていると、付け忘れと外し忘れが必ず出ます。

整理すると、主体の選び方は次のとおりです。

渡す相手 基本の方法 補足
人(サインインして使う) フェデレーション(Identity Center など)で一時的な認証情報 長期のアクセスキーは例外
同じ権限を持つ複数の人 グループにまとめる 付け外しが1か所で済む
AWS 上で動くアプリ ロール(実行ロール・インスタンスのロールなど) コードにキーを書かない

CHECK 1ここまでの確認

開発者が10人いて、全員に同じ権限をまとめて付けたい。付け外しを1か所で済ませるには何を使う?

答えと解説

答え: 2. IAM グループに権限を付け、メンバーを入れる

グループは「同じ権限の束」を人にまとめて渡す入れ物です。入れる・外すだけで権限が変わります。なお人のサインインの入口は、長期の認証情報より ID プロバイダーのフェデレーションが推奨です。「誰に付けるか」の節を読み直してください。

AWS 管理ポリシー・カスタマー管理ポリシー・インラインポリシーはどう選ぶか

主体が決まったら、付けるポリシーの種類を選びます。IAM には、アイデンティティに付けるポリシーの種類が3つあります。違いは「誰が管理するか」「変更できるか」「いくつの主体に付けられるか」の3点です。

種類 誰が管理するか 変更できるか 付け先
AWS 管理ポリシー AWS 利用者は変更できない(AWS が更新する) 複数の主体に付けられる
カスタマー管理ポリシー 利用者 利用者が変更できる 複数の主体に付けられる
インラインポリシー 利用者 利用者が変更できる 1つの主体にだけ埋め込まれる

POLICY TYPES管理ポリシーかインラインか

複数に付くなら管理ポリシー、1つだけに結び付くならインライン

管理ポリシー

AWS 管理 / カスタマー管理

  • 管理者AWS か、利用者
  • 変更AWS 管理は不可、カスタマー管理は可
  • 付け先複数の主体に付けられる

インラインポリシー

主体に埋め込む

  • 管理者利用者
  • 変更可
  • 付け先1つの主体とだけ1対1

出発点は AWS 管理ポリシー

AWS 管理ポリシーは、AWS があらかじめ用意した、よくある用途向けのポリシーです。ゼロから書かずに済み、権限の全体像をつかむ足場になります。ただし用途に対して広すぎることがあるので、「そのまま恒久的に使う」ものではなく、「出発点」として扱います。

自分の用途に合わせたいときは、AWS 管理ポリシーの中身をコピーして、カスタマー管理ポリシーとして作り直します。AWS 管理ポリシーそのものは書き換えられません。AWS が管理して更新していくものだからです。

絞ったものはカスタマー管理ポリシーに

自分で絞ったポリシーは、カスタマー管理ポリシーにします。1つのポリシーを複数のグループやロールに付けられるので、直すときも1か所で済みます。変更の履歴を追う、どこに付いているかを調べるといった管理も、管理ポリシーの形ならしやすくなります。

インラインポリシーは例外用

インラインポリシーは、ユーザー・グループ・ロールの1つに直接埋め込む形です。その主体と1対1で、切り離せません。「このロールを消したら、このポリシーも一緒に消えてほしい」というように、主体と運命をともにさせたいときの例外用です。

迷ったときの基準は単純です。複数の主体に付く可能性が少しでもあるなら、管理ポリシー。 インラインにして後から「実は他にも要る」となると、同じ内容を書き写すことになり、片方だけ直し忘れる事故につながります。

CHECK 2ここまでの確認

AWS 管理ポリシーの中身を、自分の用途に合わせて直接書き換えられる?

答えと解説

答え: 2. 書き換えられない。変えたいならコピーしてカスタマー管理ポリシーにする

AWS 管理ポリシーは AWS が管理し、AWS が更新します。利用者が編集できるのはカスタマー管理ポリシーです。「ポリシーの種類はどう選ぶか」の表を読み直してください。

最小権限へ絞る手順|広く始めて、アクション・リソース・条件で狭める

最小権限とは、業務に必要な権限だけを付けるという原則です。ただ、「必要な権限」は設計の段階で完全には分かりません。実際にアプリを動かして、初めて「この API も呼んでいた」と分かることが多いからです。そこで AWS のベストプラクティスも、まず広めの権限で始めて、実績を見ながら絞っていく進め方を示しています。

WIDE THEN NARROW広く始めて絞る

最小権限は一度で決めず、実績を見て絞り直す

  1. 広く始める

    AWS 管理ポリシーを出発点に

  2. 実績を見る

    使われた権限を確かめる

  3. 絞る

    アクション・リソース・条件で

  4. 見直す

    担当や構成が変わったら戻る

手順の流れ

  1. 広く始める。 AWS 管理ポリシーなどを出発点に、動かすのに必要な範囲を付ける。
  2. 使われた権限を見る。 実際にどのアクションが使われたかを確かめる。AWS には、アクセスの実績から権限を見直すための仕組み(IAM Access Analyzer など)があります。中身は READ ALSO — プロフェッショナル向け・段4 設計 IAM Access Analyzer とは何か|外部への共有・未使用の権限・ポリシー検証を「信頼ゾーン」で見張る仕組み で扱うので、ここでは「実績を見る手段がある」とだけ押さえます。
  3. 絞る。 使われていない権限を外し、アクション・リソース・条件で狭める。
  4. 見直す。 担当や構成が変われば必要な権限も変わるので、定期的に、使われていない権限が残っていないかを見る。

「広く始める」は、広いまま放っておいてよいという意味ではありません。手順の3と4までやり切って、初めて最小権限に近づきます。

絞る3つの軸

ポリシーは、Allow か Deny か、そして次の3つの軸で範囲を決めます。

軸 決めること 絞り方の例
Action 何をするか 「S3 のすべて」ではなく、読み取りの s3:GetObject だけ
Resource 何に対してか 「すべてのバケット」ではなく、特定のバケットの特定のプレフィックスだけ
Condition どんな状況なら 接続元の IP アドレスの範囲、MFA の有無など

たとえば、機械学習の学習ジョブの実行ロールに、特定のバケットの特定のプレフィックスだけを読ませる場合は、こう書きます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::example-bucket/training-data/*"
    }
  ]
}

Action を s3:GetObject に、Resource を training-data/ 以下に絞っています。ほかのデータや、書き込みには触れません。ここに特定の IP からだけ許可する、といった状況の制限を足したいときは、Condition を加えます。

"Condition": {
  "IpAddress": { "aws:SourceIp": "203.0.113.0/24" }
}

203.0.113.0/24 は文書用の例示のアドレスです。実際には自社の出口のアドレス範囲を入れます。アクションとリソースだけでなく、条件でも絞れる、という点を覚えておいてください。

CHECK 3ここまでの確認

必要な権限が最初から完全には分からないとき、最小権限をどう進めるのがよい?

答えと解説

答え: 2. 広めに始めて、使われた実績を見ながら絞っていく

必要な権限は、実際に使ってみて初めて分かることが多いからです。広く始めて絞るのは公式も示す進め方で、広いまま放置するのは別の話です。「絞る手順」の節を読み直してください。

CHECK 4ここまでの確認

ポリシーの中で、接続元の IP アドレスのような「状況」で許可を絞りたいとき、使う要素は?

答えと解説

答え: 3. Condition

Action は「何をするか」、Resource は「何に対して」、Condition は「どんな状況なら」を決めます。絞る軸は3つあります。「絞る手順」の節を読み直してください。

設計の失敗例|AdministratorAccess の常用・ワイルドカード・アクセスキーの埋め込み

最後に、権限の設計で繰り返し出てくる失敗の型を3つ挙げます。

権限の設計でやってはいけない3つ

  • 日常の作業に AdministratorAccess を付け続ける
  • Action や Resource に、理由なくワイルドカード(*)を並べる
  • アクセスキーをコードや設定ファイルに書き込む

AdministratorAccess の常用

「動かないから、とりあえず AdministratorAccess」は、最初の動作確認では楽ですが、そのまま残るのが問題です。AWS は、この強い権限を管理者の作業に限って使うよう案内しています。日常の開発者には、職務に合わせた AWS 管理ポリシーや、用途に絞ったポリシーを付けます。

理由のないワイルドカード

"Action": "s3:*" や "Resource": "*" は、書くのは簡単ですが、意図しない範囲まで許してしまいます。ワイルドカードそのものが悪いのではありません。「プレフィックス以下をまとめて」のように、範囲が説明できる使い方は正当です。避けるのは、絞る作業を後回しにした結果の * です。

アクセスキーの埋め込み

EC2 上のアプリが S3 を読みたいとき、コードにアクセスキーを書き込む形は避け、インスタンスにロールを付けます。ロールなら一時的な認証情報が自動で配られ、自動で入れ替わるので、漏れても被害の期間が限られます。Lambda でも同じで、実行ロールに権限を付けます。コードやログに認証情報を残さない、という原則は、アプリ側の設計にも直結します。

設計メモの残し方と、次に読むもの(マルチアカウントの権限設計へ)

権限は、付けた時点より、後から見直すときに効いてきます。「なぜこのポリシーをこのロールに付けたのか」が残っていないと、怖くて外せなくなり、広いまま固定されます。次の3点だけでも、メモとして残しておくと、見直しが楽になります。

  • 誰に(主体): グループ名・ロール名と、使う人やアプリ
  • 何を許したか: 付けたポリシーの名前と、絞った Action・Resource・Condition
  • なぜ: 業務上の理由と、見直す時期

この記事で扱ったのは、1つのアカウントの中で、誰にどのポリシーをどこまで付けるかでした。複数のアカウントを持つ構成になると、その外側に、アカウント全体の上限を引く仕組み(SCP や権限境界)が加わります。そこは READ ALSO — プロフェッショナル向け・段4 設計 マルチアカウントの権限設計|SCP・許可セット・権限境界・ABAC を「どこで絞るか」で組む で扱います。

この記事の論点を、練習問題で確かめることもできます。最小権限の原則、グループ、ポリシーの構造、Condition、ロールでの権限付与は、AWS 認定の試験でも繰り返し問われる分野です。

参照ソース

SCOREこの記事の確認テスト

0/4問 正解

各章の「ここまでの確認」に答えると、ここに集まります。結果はこの端末のブラウザにだけ残り、サーバには送りません。

PRACTICEこの記事の論点を練習問題で確かめる

この記事が扱うサービスの問題だけを続けて解けます。練習問題は Google でログインした人が使えます(練習問題の一覧)。

HAND IT OVER人に渡すなら

一言で説明するなら

最初から金庫の鍵を人数分あつらえるのではなく、まず部署ごとの合鍵で始め、実際に開けた扉だけを残して鍵を削っていく。IAM の権限はその進め方で決めます。

前提を持たない人にそのまま渡せる記事です。「後輩に説明する」「顧客に理由を伝える」の材料として。

FAQよくある質問

インラインポリシーは使ってはいけないの?

禁止ではありません。そのユーザー・グループ・ロールの1つだけに結び付いていて、切り離せない例外用です。将来ほかの主体にも付く可能性があるなら、最初から管理ポリシーにしておく方が後で直しやすくなります。

AdministratorAccess は誰に付けるの?

AWS は、管理者の作業に限って使うよう案内しています。日常の開発者には、職務に合わせた AWS 管理ポリシーや、用途に絞ったカスタマー管理ポリシーを付けます。

この記事の次は何を読めばいい?

複数のアカウントにまたがって上限を引く SCP や権限境界は、次の kengen-sekkei-pro で扱います。この記事は1つのアカウントの中で、誰にどのポリシーをどこまで付けるかが範囲です。

SAME TRACK同じ領域の記事

IAM ポリシーの評価の仕組み|許可と拒否はどの順で決まるか
IAM ポリシーの評価の仕組み|許可と拒否はどの順で決まるか 段1 入口仕組み
IAM とは何か|ユーザー・ロール・ポリシーを「誰が・何に・何をしてよいか」で読み解く
IAM とは何か|ユーザー・ロール・ポリシーを「誰が・何に・何をしてよいか」で読み解く 段1 入口とは
AccessDenied が出たときの調べ方|エラーメッセージの「because」から止めたポリシーの種類を絞る運用
AccessDenied が出たときの調べ方|エラーメッセージの「because」から止めたポリシーの種類を絞る運用 段2 構成運用