🤖

[AWS IAM] マルチアカウント環境におけるスイッチロール

に公開

概要

  • AWSアカウントが複数(例:DEV、STG、PRD)存在する場合、IAMユーザーの管理を最小限に抑えたい。
  • 1つのAWSアカウント (例 DEV)にIAMユーザーを集約し、他のAWSアカウント (例 STG、PRD)にはIAMユーザーを作成せず、スイッチロールで対応することで、IAMリソースの管理負荷を軽減できる
  • IAMユーザー、IAMユーザーグループ、および関連するIAMリソースの数を最小化できる可能性がある

スイッチロールの構成と制御

スイッチロール元の構成と制御(スイッチ元アカウント)(例 DEV)

  • IAMユーザーがすでに作成されていれば、新たなIAMリソースの追加は不要
  • IAMユーザーには、特定のタグ(例:StgdAccess=SwitchRole:PowerUserPrdAccess=SwitchRole:Admin|ReadOnlyなど)を付与して制御に利用する

スイッチロール先の構成と制御(ターゲットアカウント)(例 STG、PRD)

  • 必要なIAMリソースは「スイッチロール用のIAMロール」のみ
  • IAMロールの信頼関係ポリシー(Trust Policy)では、スイッチ元アカウントのIAMユーザーをどのように許可するかがポイントとなる
  • 許可方法には主に以下2種類がある
    1. IAMユーザー単位
      • 個別のARN(例:arn:aws:iam::<スイッチ元アカウントID>:user/<IAMユーザー名>)を許可対象とする
      • この方法では、新しいIAMユーザーが追加されるたびに、信頼関係ポリシーの更新が必要となる
    2. AWSアカウント単位で指定しつつ、IAMユーザーのタグで条件を絞る
      • アカウント全体を許可対象としつつ、IAMユーザーの タグ(aws:PrincipalTag) を条件にし制御する
      • この方法により、IAMロールの変更頻度を最小化できる
  • セキュリティ向上のため、MFA(多要素認証)が有効な場合のみスイッチロールを許可する
  • 本記事ではIAMリソースの変更頻度を最初化するため2を採用している

スイッチロール設計

スイッチロール元の設計(スイッチ元アカウント)(例 DEV)

  • 許可するスイッチロールに合わせて、IAMユーザーのタグを設定する
    • 例1) STGのIAMロール1 (役割 読み取り専用)にスイッチロールする場合のIAMユーザーのタグは、キーStgdAccessSwitchRole:ReadOnly
    • 例2) STGのIAMロール2 (役割 パワーユーザー)にスイッチする場合のIAMユーザーのタグは、キーStgdAccessSwitchRole:PowerUser
    • 例3) PRDのIAMロール3 (役割 開発者)にスイッチロールする場合のIAMユーザーのタグは、キーPrdAccessSwitchRole:Develop
    • 例4) STGの複数のIAMロール (役割 読み取り専用と開発者)ににスイッチロールする場合のIAMユーザーのタグは、キーStgdAccessSwitchRole:ReadOnly|Developや値SwitchRole:Develop|ReadOnlyのようにする

スイッチロール先の設計(ターゲットアカウント)(例 STG、PRD)

  • スイッチロール用のIAMロールを役割別に作成する

例 STGのPowerUserのIAMロール

  • 信頼関係ポリシー
    • 条件演算子StringLikeの内容
      • aws:PrincipalTag/StgdAccess (STG)、の箇所をaws:PrincipalTag/PrdAccess (PRD)のようにすることで環境を区別する
      • SwitchRole:*PowerUser*SwitchRole:*ReadOnly*のように役割を区別する
      • StringLikeでワイルドカード(*?)を使用できるようにし、IAMユーザーのタグ数を抑えている
      • キーに対して値をSwitchRole:役割1|役割2にするため、SwitchRole:*PowerUser*のように役割部分をワイルドカードで囲む必要がある
    • スイッチ元アカウントに対してすべてを信頼しつつ、スイッチロール可能な条件としてスイッチ元アカウントのIAMユーザーであり、そのIAMユーザーに指定のタグがあり、なおかつMFAが有効の場合のみとしている
    • スイッチ元のIAMユーザーで合っても、指定したタグがない場合はスイッチロールはできない
信頼ポリシー(JSON)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<スイッチ元アカウントID>:root"
      },
      "Action": "sts:AssumeRole"
      "Condition": {
        "ArnLike": {
          "arn:aws:iam::<スイッチ元アカウントID>:user/*"
        },
        "StringLike": {
          "aws:PrincipalTag/StgAccess": "SwitchRole:*PowerUser*"
        },
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}
  • 許可ポリシーは AWS管理PowerUserAccessを指定

スイッチロールの仕方

  • スイッチ元アカウントのログイン
    • https://<元アカウント>.signin.aws.amazon.com/console/にアクセスし、IAMユーザーでログインする
  • スイッチロール
    • 元アカウントにログイン後、https://signin.aws.amazon.com/switchrole?account=<ターゲットアカウントID>&roleName=<ターゲットのロール名>&displayName=<表示名>&color=<表示色>にアクセスし、スイッチロールする
      • 表示名や表示色はスイッチロール後にAWSマネジメントコンソールの右上に表示される文字や文字ハイライトなので、わかりやすい表示名にしておくと視認性があがる
      • 表示名の例 ロール名@ターゲットアカウントID
      • 表示色はカラーコードで表す
      表示色	カラーコード
      Red	ea7158
      Orange	fbc8aa
      Yellow	efda95
      Green	b4d699
      Blue	83d4e8
      -       None
      
    • ブラウザの拡張機能 (AWS Extend Switch Rolesなど)を使用するとスイッチロールが管理しやすいかも

Discussion