IAM グループを使うべき理由:ユーザーへの直接ポリシーアタッチとの比較
新しい開発者が入社するたびに、IAM ユーザーを作成してポリシーを一枚一枚アタッチしていた運用が、ある日突然破綻する。10人のユーザーに同じポリシーを直接アタッチしていた環境で権限変更が必要になったとき、10回の手作業が発生する。IAM グループはこの問題を構造的に解決するための仕組みだ。
TL;DR:IAM グループ vs. ユーザーへの直接アタッチ
| 観点 | ユーザーへの直接アタッチ | IAM グループ経由 |
|---|---|---|
| 権限変更のコスト | 対象ユーザー数分の操作が必要 | グループポリシーを1回変更するだけ |
| 新規ユーザーへの権限付与 | 毎回ポリシーを手動アタッチ | グループに追加するだけ |
| 権限の一貫性 | ユーザーごとにズレが生じやすい | グループ単位で統一される |
| 監査・レビューのしやすさ | ユーザーごとに確認が必要 | グループのポリシーを見れば全体像が分かる |
| IAM ポリシー上限への影響 | ユーザーあたりのアタッチ上限を消費 | グループ側で集約できる |
IAM グループの仕組みを理解する
IAM グループはユーザーの集合体であり、それ自体がプリンシパルとして AWS リソースにアクセスするわけではない。グループにアタッチされたポリシーは、そのグループに所属するすべての IAM ユーザーに対して有効になる。ユーザーが複数のグループに所属している場合、各グループのポリシーはすべて評価される。
重要な点として、IAM グループは IAM ロールとは異なり、フェデレーションユーザーや AWS サービスに対してアタッチすることはできない。また、グループをネストする(グループの中にグループを入れる)ことも IAM ではサポートされていない。
- IAM ユーザーが複数のグループに所属できる。
- IAM グループにポリシーをアタッチすると、所属する全ユーザーに権限が伝播する。
- ユーザーには直接ポリシーをアタッチすることも可能だが、グループ経由との組み合わせで権限が累積される。
- IAM ポリシー評価では、明示的な Deny が Allow より優先される。
IAM グループを使うべき具体的な理由
権限管理のスケーラビリティ
直接アタッチ方式の本質的な問題は、ユーザー数に比例して管理コストが増加することだ。'Developers' グループに AmazonS3ReadOnlyAccess をアタッチしておけば、新しい開発者をグループに追加するだけで権限が付与される。逆に権限を剥奪したい場合も、グループからユーザーを外すか、グループのポリシーを変更するだけで済む。
権限の一貫性と監査容易性
直接アタッチ方式では、同じ役割のユーザーでも付与されているポリシーがバラバラになりやすい。誰かが追加でポリシーをアタッチしたり、古いポリシーが残り続けたりする。グループ経由であれば、'Developers' グループのポリシーを確認するだけで、その役割に付与されている権限の全体像が把握できる。
グループは権限の設計図だ。ユーザーはその設計図を実体化するインスタンスに過ぎない。設計図を変えれば、すべてのインスタンスに変更が反映される。
IAM ポリシーのアタッチ上限を効率的に使う
IAM ユーザーに直接アタッチできるマネージドポリシーの数には上限がある。グループ経由でポリシーを付与することで、ユーザー直接アタッチ枠を節約できる。上限の具体的な数値はサービスクォータとして変動する可能性があるため、常に AWS 公式ドキュメントのクォータページで確認すること。
IAM グループの作成とポリシーアタッチ:実際の操作
グループの作成
aws iam create-group \
--group-name Developers
グループへのマネージドポリシーアタッチ
aws iam attach-group-policy \
--group-name Developers \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
ユーザーをグループに追加
aws iam add-user-to-group \
--group-name Developers \
--user-name alice
グループにアタッチされているポリシーの確認
グループの権限を棚卸しするとき、まずここを見る。
aws iam list-attached-group-policies \
--group-name Developers
グループに所属するユーザーの確認
aws iam get-group \
--group-name Developers
カスタムポリシーをグループにアタッチする例
AWS マネージドポリシーではなく、自前で作成したカスタムポリシーをグループにアタッチする場合は以下のようになる。
🔽 カスタムポリシーの作成とアタッチ(クリックして展開)
# カスタムポリシードキュメントの作成
cat > developer-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-dev-bucket",
"arn:aws:s3:::my-dev-bucket/*"
]
}
]
}
EOF
# ポリシーの作成
aws iam create-policy \
--policy-name DeveloperS3Access \
--policy-document file://developer-policy.json
# グループへのアタッチ
aws iam attach-group-policy \
--group-name Developers \
--policy-arn arn:aws:iam::123456789012:policy/DeveloperS3Access
現場でよくある誤解と実際の失敗パターン
あるチームで、IAM ユーザー全員に直接 AdministratorAccess をアタッチしていた運用があった。退職者が出たときにユーザーを削除したが、残留していた別のユーザーに同じポリシーが直接アタッチされたままになっていることに気づいたのは、数ヶ月後の監査のときだった。
最初の誤解は「ユーザーを削除すれば権限は消える」というものだった。確かに削除されたユーザーの権限は消える。しかし問題は、直接アタッチ方式では各ユーザーの権限状態を個別に追跡しなければならないことだ。グループ経由であれば、グループのポリシーと所属ユーザーの2点だけを管理すれば済む。
実際の原因は、オンボーディング手順書に「ユーザーを作成してポリシーをアタッチする」と書かれていたことだった。グループへの追加という手順がなく、担当者が変わるたびに手順の解釈がブレていた。グループを使う運用に切り替えた後は、新規ユーザーの権限付与手順が「グループに追加する」の1ステップになり、手順書の解釈ブレも解消された。
ポリシー: S3ReadOnly"] U4["alice"] -->|所属| G1 U5["bob"] -->|所属| G1 U6["carol"] -->|所属| G1 G1 -->|統一された権限| R2["S3"] end
- 直接アタッチ方式では、ユーザーごとにポリシーの状態が異なる可能性がある。
- グループ経由では、グループのポリシーが単一の真実の情報源となる。
- 退職者対応はグループからの削除またはユーザー無効化で完結する。
IAM グループ設計のベストプラクティス
役割ベースでグループを設計する
グループは組織の役割(Developers、Operators、ReadOnly、Billing など)に対応させるのが基本だ。プロジェクト単位でグループを作ることもあるが、役割ベースとプロジェクトベースを混在させると権限の見通しが悪くなる。
ユーザーへの直接アタッチを例外的な用途に限定する
特定のユーザーだけに一時的に追加権限を付与したい場合など、例外的なケースでは直接アタッチが有効な場面もある。ただし、その場合も付与した理由と期限をタグや運用ドキュメントに記録しておくこと。恒久的な権限はグループで管理し、例外的・一時的な権限のみ直接アタッチという使い分けが現実的だ。
最小権限の原則を守る
グループにポリシーをアタッチする際も、最小権限の原則は変わらない。'Developers' グループだからといって AdministratorAccess をアタッチするのではなく、実際に必要なアクションとリソースに絞ったカスタムポリシーを作成してアタッチすること。
既存ユーザーの直接アタッチ状況を棚卸しする
既存環境でユーザーへの直接アタッチがどれだけあるかを確認するには以下のコマンドが使える。
aws iam list-users --query 'Users[*].UserName' --output text | \
tr '\t' '\n' | \
while read username; do
policies=$(aws iam list-attached-user-policies \
--user-name "$username" \
--query 'AttachedPolicies[*].PolicyName' \
--output text)
if [ -n "$policies" ]; then
echo "$username: $policies"
fi
done
このスクリプトは直接アタッチされたマネージドポリシーを持つユーザーを列挙する。インラインポリシーを確認したい場合は list-user-policies コマンドを別途実行すること。
IAM グループ活用のまとめと次のステップ
IAM グループを使う理由は単純だ。ユーザーへの直接アタッチは、ユーザー数が増えるにつれて管理コストと権限の不整合リスクが線形に増加する。グループ経由にすることで、権限の変更・付与・剥奪がグループ単位で完結し、監査時の確認コストも大幅に下がる。
次のステップとして、より大規模な組織や複数 AWS アカウントを管理する場合は、AWS IAM Identity Center(旧 AWS SSO)を使ったフェデレーション認証と権限セットの管理を検討すること。IAM ユーザーとグループの運用は単一アカウントの小規模環境には適しているが、マルチアカウント環境では IAM Identity Center が推奨される。
用語集
| 用語 | 説明 |
|---|---|
| IAM グループ | IAM ユーザーの集合体。グループにアタッチしたポリシーは所属する全ユーザーに適用される。グループ自体はプリンシパルではない。 |
| マネージドポリシー | AWS が管理する AWS マネージドポリシーと、ユーザーが作成するカスタマーマネージドポリシーの2種類がある。複数のエンティティにアタッチ可能。 |
| インラインポリシー | 特定の IAM エンティティ(ユーザー・グループ・ロール)に直接埋め込まれたポリシー。エンティティを削除すると一緒に削除される。 |
| 最小権限の原則 | タスクを実行するために必要な最小限の権限のみを付与するセキュリティ原則。 |
| 明示的な Deny | IAM ポリシー評価において、明示的な Deny は Allow より必ず優先される。SCP による Deny も同様に機能する。 |
コメント
コメントを投稿