AWS IAM(Identity and Access Management)を安全に運用するための指針をまとめたもの。基本の考え方は「誰が・何に・どの条件でアクセスできるかを最小限にし、常に検証できる状態に保つ」こと。


目次


1. ルートユーザーを守る

  • ルートユーザーは日常業務で使わない。請求設定やアカウント閉鎖など、ルートでしかできない操作に限る
  • MFA を必ず有効化する(可能ならハードウェアキー / パスキー)
  • ルートユーザーのアクセスキーは作成しない。存在する場合は削除する
  • AWS Organizations 配下のメンバーアカウントでは、ルートアクセスの一元管理機能でルート認証情報自体を削除し、必要な特権操作は管理アカウントから短時間だけ実行する
  • ルートユーザーのメールアドレスは個人ではなく、チームで管理する配布リストにする

2. 人間のユーザーは一時的な認証情報で

  • 人間のアクセスは IAM Identity Center(旧 AWS SSO) や外部 IdP(Okta、Entra ID など)とのフェデレーションを使う
  • IAM ユーザー + 長期アクセスキーの発行は原則避ける
  • 権限はグループ / 権限セット単位で割り当て、個人に直接ポリシーを付けない
  • 全ユーザーに MFA を必須化する

3. ワークロードは IAM ロールで

  • EC2 → インスタンスプロファイル、Lambda → 実行ロール、ECS → タスクロール、EKS → IRSA / Pod Identity を使う
  • AWS 外のワークロード(GitHub Actions、オンプレミスなど)は OIDC フェデレーション や IAM Roles Anywhere で一時認証情報を取得する
  • アクセスキーをコード・環境変数・リポジトリに埋め込まない
  • どうしても長期キーが必要な場合は、定期的にローテーションし、Secrets Manager 等で管理する

4. 最小権限の原則

  • 必要なアクション・リソース・条件だけを許可する
  • "Action": "*" や "Resource": "*" は極力避ける
  • まず AWS 管理ポリシーで始め、運用が安定したらカスタマー管理ポリシーで絞り込む
  • IAM Access Analyzer のポリシー生成機能で、CloudTrail の実利用履歴から最小権限ポリシーを作る
  • 「最終アクセス情報(last accessed)」を見て、使われていない権限を削る

条件キーでさらに絞る

目的条件キーの例
送信元 IP の制限aws:SourceIp
VPC エンドポイント経由のみ許可aws:SourceVpce
MFA 済みのみ許可aws:MultiFactorAuthPresent
組織内からのみ許可aws:PrincipalOrgID / aws:ResourceOrgID
リージョン制限aws:RequestedRegion
タグベース制御(ABAC)aws:ResourceTag/*, aws:PrincipalTag/*
混乱した代理問題の防止aws:SourceArn, aws:SourceAccount

5. ガードレールを多層で設ける

仕組み役割
SCP(サービスコントロールポリシー)組織 / OU / アカウント単位で「プリンシパルができる最大範囲」を制限
RCP(リソースコントロールポリシー)組織内リソースに対して「誰がアクセスできるか」の上限を制限
アクセス許可の境界(Permissions Boundary)開発者などに IAM ロール作成を委任するとき、作れる権限の上限を固定
セッションポリシーAssumeRole 時にその場限りで権限をさらに絞る

SCP の典型例:

  • 利用しないリージョンを拒否
  • CloudTrail / GuardDuty / Config の無効化を拒否
  • ルートユーザーの操作を拒否
  • 組織からの離脱(organizations:LeaveOrganization)を拒否

6. アカウントを分割する

  • AWS Organizations でマルチアカウント構成にし、本番・開発・ログ・セキュリティなどを分離する
  • アカウント境界は最も強力な分離単位。権限設計の複雑さを減らせる
  • AWS Control Tower でランディングゾーンを整備すると、ガードレールの初期設定が楽になる

7. 外部アクセスと未使用アクセスを継続的に検出する

  • IAM Access Analyzer を組織単位で有効化
    • 外部アクセス分析: S3 バケット、KMS キー、IAM ロールなどが組織外に公開されていないか検出
    • 未使用アクセス分析: 使われていないロール、アクセスキー、パスワード、権限を検出
    • ポリシー検証: ポリシー作成時に文法エラーやセキュリティ警告をチェック
    • カスタムポリシーチェック: CI/CD でポリシー変更が過剰な権限を与えないか自動検査
  • クロスアカウントのロール信頼ポリシーでは、第三者に対して sts:ExternalId を必須にする

8. 監視とログ

  • CloudTrail を全リージョン・全アカウントで有効化し、ログ専用アカウントの S3 に集約
  • GuardDuty で不審な API 呼び出しや認証情報の悪用を検知
  • Security Hub で IAM 関連の設定ミス(CIS ベンチマーク等)を一元可視化
  • AWS Config ルールで「ルートの MFA 有効」「アクセスキーのローテーション」などを継続評価
  • ルートユーザーのログイン、IAM ポリシー変更、AssumeRole の失敗多発などにアラートを設定

9. ポリシーをコードで管理する

  • IAM ポリシー・ロールは IaC(Terraform、CloudFormation、CDK) で管理し、手作業の変更を避ける
  • プルリクエストでレビューし、Access Analyzer のポリシー検証を CI に組み込む
  • Deny を明示的に使うべき場面(重要リソースの削除防止など)を整理しておく

10. 定期的な棚卸し

  • 四半期など定期的に以下を確認する
    • 90 日以上使われていないユーザー・ロール・アクセスキー
    • 過剰な権限(AdministratorAccess の付与先など)
    • 退職者・異動者のアクセス
    • クロスアカウント信頼関係の妥当性
  • 不要なものは無効化 → 一定期間後に削除の 2 段階で進めると安全

チェックリスト

  • ルートユーザーに MFA を設定し、アクセスキーを削除した
  • メンバーアカウントのルート認証情報を一元管理で削除した
  • 人間のアクセスを IAM Identity Center / フェデレーションに移行した
  • 全ユーザーに MFA を必須化した
  • ワークロードは IAM ロールで一時認証情報を使っている
  • コードやリポジトリに長期アクセスキーが含まれていない
  • ワイルドカード権限を見直し、最小権限に絞った
  • SCP で組織全体のガードレールを設定した
  • IAM Access Analyzer(外部アクセス・未使用アクセス)を有効化した
  • CloudTrail を全リージョン・全アカウントで有効化し集約した
  • GuardDuty / Security Hub / Config を有効化した
  • IAM を IaC で管理し、CI でポリシー検証している
  • 定期的な棚卸しの仕組みがある

参考

0件のページ