SCP の設定を複数のメンバーアカウントに委任する

SCP の設定を複数のメンバーアカウントに委任する

Control Tower の管理アカウント以外の AWS アカウントに、SCP の設定を委任する方法をご紹介します。
2026.01.07

コーヒーが好きな emi です。最近はカフェインを控えています。

Control Tower の管理アカウント以外の AWS アカウントに、SCP の設定を委任する方法をご紹介します。

やりたいことのイメージ

以下のように Control Tower で管理されたマルチアカウント環境があるとします。
delegate-scp-configuration-permissions-to-member-accounts_1

Control Tower の管理アカウントからは、一番上の階層である Sandbox OU 配下のすべての OU(やアカウント)全体に対しての SCP 設定をしたいです。
delegate-scp-configuration-permissions-to-member-accounts_51

Sandbox OU より下の階層の OU に配布するより細かい SCP の設定は、メンバーアカウントに任せたい(委任したい)です。
delegate-scp-configuration-permissions-to-member-accounts_52

例えば、グループ会社で親会社がトップの階層の Sandbox OU に対して全体グループ会社全体に対して制御したい操作を SCP で制限し、子会社はそれぞれの子会社 OU に属する子アカウント側でもう少し細かい制限をかけたい…等の場合に、これから記載する「委任ポリシー」が役立ちます。

設定する委任ポリシー

SCP の設定を委任するための委任ポリシーは、Organizations コンソールの [設定] - [AWS Organizations の委任された管理者] メニューから設定します。
delegate-scp-configuration-permissions-to-member-accounts_12

委任ポリシー(例えば子会社が 2 社ある場合)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ReadSCP${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:List*",
        "organizations:Describe*"
      ],
      "Resource": "*",
      "Condition": {
        "StringEqualsIfExists": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "CreateSCP${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": "organizations:CreatePolicy",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "ManageTagsOnSCPs${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:TagResource",
        "organizations:UntagResource"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${Organizationsの組織ID}/service_control_policy/*"
    },
    {
      "Sid": "ManageOwnSCPs${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:UpdatePolicy",
        "organizations:DeletePolicy"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
          "aws:ResourceTag/Owner": "${子会社A委任先AWSアカウントID}"
        }
      }
    },
    {
      "Sid": "AttachDetachToTargetOU${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:AttachPolicy",
        "organizations:DetachPolicy"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:ou/${Organizationsの組織ID}/${子会社AのOU ID}",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "AttachDetachOwnSCPs${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:AttachPolicy",
        "organizations:DetachPolicy"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${Organizationsの組織ID}/service_control_policy/*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
          "aws:ResourceTag/Owner": "${子会社A委任先AWSアカウントID}"
        }
      }
    },
    {
      "Sid": "ReadSCP${子会社B委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社B委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:List*",
        "organizations:Describe*"
      ],
      "Resource": "*",
      "Condition": {
        "StringEqualsIfExists": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "CreateSCP${子会社B委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社B委任先AWSアカウントID}:root"
      },
      "Action": "organizations:CreatePolicy",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "ManageTagsOnSCPs${子会社B委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社B委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:TagResource",
        "organizations:UntagResource"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${Organizationsの組織ID}/service_control_policy/*"
    },
    {
      "Sid": "ManageOwnSCPs${子会社B委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社B委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:UpdatePolicy",
        "organizations:DeletePolicy"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
          "aws:ResourceTag/Owner": "${子会社B委任先AWSアカウントID}"
        }
      }
    },
    {
      "Sid": "AttachDetachToTargetOU${子会社B委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社B委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:AttachPolicy",
        "organizations:DetachPolicy"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:ou/${Organizationsの組織ID}/${子会社BのOU ID}",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "AttachDetachOwnSCPs${子会社B委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社B委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:AttachPolicy",
        "organizations:DetachPolicy"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${Organizationsの組織ID}/service_control_policy/*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
          "aws:ResourceTag/Owner": "${子会社B委任先AWSアカウントID}"
        }
      }
    }
  ]
}

Sid ブロック構成

子 OU 1 つにつき、以下の 6 つの Sid ブロックを委任ポリシーに追加します。

No. Sid プレフィックス 目的
1 ReadSCP SCP の一覧表示・詳細取得
2 CreateSCP SCP の新規作成
3 ManageTagsOnSCPs SCP へのタグ付け・タグ削除
4 ManageOwnSCPs 自身が所有する SCP の更新・削除
5 AttachDetachToTargetOU 対象 OU への SCP アタッチ・デタッチ
6 AttachDetachOwnSCPs 自身が所有する SCP のアタッチ・デタッチ

Sid 命名規則

各 Sid は以下の命名規則にしています。

{機能プレフィックス}{委任先AWSアカウントID}

例: アカウント ID 111111111111 の場合

  • ReadSCP111111111111
  • CreateSCP111111111111
  • ManageTagsOnSCPs111111111111
  • ManageOwnSCPs111111111111
  • AttachDetachToTargetOU111111111111
  • AttachDetachOwnSCPs111111111111

新規子会社C追加手順(管理アカウント管理者向け)

例えば子会社 C が増える場合は、新規で OU やアカウントを追加し、委任ポリシーを追加する必要があります。
delegate-scp-configuration-permissions-to-member-accounts_53

事前準備

新規子会社を追加する前に、以下の情報を収集してください。

項目 説明
委任先 AWS アカウント ID SCP 管理を委任するメンバーアカウントの ID 333333333333
対象 OU ID 子会社が管理する OU の ID ou-xxxx-xxxxxxxx
管理アカウント ID Organizations の管理アカウント ID xxxxxxxxxxxx
組織 ID Organizationsの組織ID o-xxxxxxxxxx

委任ポリシーへの追加手順

Step 1: 6つの Sid ブロックを作成

以下のテンプレートを使用し、プレースホルダー(後で実際の文字や値に置き換えることを前提に、一時的に置いておく仮の場所や情報のこと)を実際の値に置換します。

{
  "Sid": "ReadSCP${委任先AWSアカウントID}",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::${委任先AWSアカウントID}:root"
  },
  "Action": [
    "organizations:List*",
    "organizations:Describe*"
  ],
  "Resource": "*",
  "Condition": {
    "StringEqualsIfExists": {
      "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
    }
  }
},
{
  "Sid": "CreateSCP${委任先AWSアカウントID}",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::${委任先AWSアカウントID}:root"
  },
  "Action": "organizations:CreatePolicy",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
    }
  }
},
{
  "Sid": "ManageTagsOnSCPs${委任先AWSアカウントID}",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::${委任先AWSアカウントID}:root"
  },
  "Action": [
    "organizations:TagResource",
    "organizations:UntagResource"
  ],
  "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${組織ID}/service_control_policy/*"
},
{
  "Sid": "ManageOwnSCPs${委任先AWSアカウントID}",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::${委任先AWSアカウントID}:root"
  },
  "Action": [
    "organizations:UpdatePolicy",
    "organizations:DeletePolicy"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
      "aws:ResourceTag/Owner": "${委任先AWSアカウントID}"
    }
  }
},
{
  "Sid": "AttachDetachToTargetOU${委任先AWSアカウントID}",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::${委任先AWSアカウントID}:root"
  },
  "Action": [
    "organizations:AttachPolicy",
    "organizations:DetachPolicy"
  ],
  "Resource": "arn:aws:organizations::${管理AWSアカウントID}:ou/${組織ID}/${対象OUID}",
  "Condition": {
    "StringEquals": {
      "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
    }
  }
},
{
  "Sid": "AttachDetachOwnSCPs${委任先AWSアカウントID}",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::${委任先AWSアカウントID}:root"
  },
  "Action": [
    "organizations:AttachPolicy",
    "organizations:DetachPolicy"
  ],
  "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${組織ID}/service_control_policy/*",
  "Condition": {
    "StringEquals": {
      "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
      "aws:ResourceTag/Owner": "${委任先AWSアカウントID}"
    }
  }
}
Step 2: プレースホルダーの置換

以下のプレースホルダーを実際の値に置換します。

プレースホルダー 置換する値
${委任先AWSアカウントID} 委任先のAWSアカウントID(12桁)
${管理AWSアカウントID} xxxxxxxxxxxx
${組織ID} o-xxxxxxxxxx
${対象OUID} 子会社のOU ID
Step 3: 委任ポリシーへの追加
  1. AWS Organizations コンソールにアクセス
  2. [設定] → [AWS Organizations の委任された管理者] を選択
  3. 委任ポリシーの編集画面を開く
  4. Statement 配列に作成した 6 つの Sid ブロックを追加
  5. JSON の構文を確認し、保存

SCP 運用手順(委任先アカウント管理者向け)

Owner タグによる所有権管理

委任された権限では、Owner タグを使用して SCP の所有権を管理します。

タグ設定ルール

タグキー タグ値 説明
Owner 委任先AWSアカウントID(12桁) SCP の所有者を識別するために必須

権限の制限事項

できること

操作 条件
SCP の一覧表示・詳細取得 制限なし
SCP の新規作成 制限なし(Owner タグの設定を忘れずに)
SCP へのタグ付け 制限なし
自身が所有する SCP の更新・削除 Owner タグが自アカウント ID
自身の OU への SCP アタッチ・デタッチ 対象 OU が自社 OU

できないこと

操作 理由
他社が作成した SCP の更新・削除 Owner タグが異なるため
他社の OU への SCP アタッチ 対象 OU が許可されていないため
管理アカウントが作成した SCP の変更 Owner タグがないため
ルート OU への SCP アタッチ 対象 OU が許可されていないため

子会社削除手順(管理アカウント管理者向け)

子会社の委任を解除する場合の手順です。

事前確認

  1. 削除対象の子会社が作成した SCP を確認
  2. それらの SCP がアタッチされている OU を確認
  3. 子会社と削除について合意を取得

削除手順

Step 1: SCP のデタッチと削除(必要に応じて)

子会社が作成した SCP を継続使用しない場合

  1. 該当 SCP をすべての OU からデタッチ
  2. SCP を削除
Step 2: 委任ポリシーから Sid ブロックを削除
  1. AWS Organizations コンソールにアクセス
  2. [設定] → [AWS Organizations の委任された管理者] を選択
  3. 委任ポリシーの編集画面を開く
  4. 対象アカウントの 6 つの Sid ブロックをすべて削除
    • ReadSCP${委任先アカウントID}
    • CreateSCP${委任先アカウントID}
    • ManageTagsOnSCPs${委任先アカウントID}
    • ManageOwnSCPs{委任先アカウントID}
    • AttachDetachToTargetOU${委任先アカウントID}
    • AttachDetachOwnSCPs${委任先アカウントID}
  5. JSON の構文を確認し、保存

セキュリティ考慮事項

Owner タグについて

Owner タグは SCP の所有権を管理する要素です。以下の点に注意してください。

リスク 対策
Owner タグの改ざん 現状の委任ポリシーでは全 SCP へのタグ操作が可能なため、運用ルールで制限する必要がある
Owner タグの付け忘れ SCP 作成時の必須チェック項目として運用
不正な Owner タグの設定 定期的な監査で Owner タグと作成者の整合性を確認

Owner タグは操作ミス防止のために設定しました。
Owner タグの付与に制限をかけようとすると、Owner タグの設定を間違ってしまった場合に削除も更新もできなくなってしまい、親会社の全体管理者に都度タグの編集依頼をかけなければなりません。
内部犯行や内部不正を防ぐためには Owner タグの付与にも制限を設けた方が良いですが、今回は運用の複雑性や手間を考慮し、そこまでの制限はかけない仕様としました。

監査ログの確認

CloudTrail で以下のイベントを定期的に確認するとよいです。

  • CreatePolicy(SCP の作成)
  • UpdatePolicy(SCP の更新)
  • DeletePolicy(SCP の削除)
  • AttachPolicy(SCP のアタッチ)
  • DetachPolicy(SCP のデタッチ)
  • TagResource(タグの追加)
  • UntagResource(タグの削除)

やってみる

以下の記事で準備した、IAM Identity Center(IdC と省略)をオプトアウトした(IdC を導入していない)Control Tower 環境で検証をやってみます。
https://dev.classmethod.jp/articles/how-to-switch-to-the-awscontroltowerexecution-role/

A-1. 管理アカウント管理者作業: OU 構成の作成

Control Tower 環境を準備し、子 OU と子アカウントを作っておきます。
記事の本質とは外れた準備手順なので、トグル内にしまっておきます。

OU 構成の作成

Control Tower コンソールからは日本語の OU 名を設定できない

小ネタですが、Control Tower コンソールから OU を作成しようとすると、日本語の OU 名を設定できないことに気づきました。
delegate-scp-configuration-permissions-to-member-accounts_2

delegate-scp-configuration-permissions-to-member-accounts_3

Organizations コンソールからは日本語の OU 名が設定できる

Organizations コンソールからは日本語の OU 名が設定できました。
delegate-scp-configuration-permissions-to-member-accounts_4
delegate-scp-configuration-permissions-to-member-accounts_5

Organizations 側で日本語を含む OU 名を設定した後、Control Tower 側で Control Tower に OU を登録すると、無事日本語を含む OU が Control Tower 管理下になります。
delegate-scp-configuration-permissions-to-member-accounts_6

スクリーンショットではチェックし忘れていますが、最下部のチェックボックスにチェックして OU を登録します。
delegate-scp-configuration-permissions-to-member-accounts_7

日本語を含む OU が登録できました。
delegate-scp-configuration-permissions-to-member-accounts_8

同様に、検証のためにもう一つ子 OU を作成しておきます。
delegate-scp-configuration-permissions-to-member-accounts_9

子アカウントも作成しておきます。
delegate-scp-configuration-permissions-to-member-accounts_10

delegate-scp-configuration-permissions-to-member-accounts_11

A-2. 管理アカウント管理者作業: 委任ポリシーの設定

では委任ポリシーを設定していきます。

Organizations コンソールの [設定] - [AWS Organizations の委任された管理者] メニューから設定します。
delegate-scp-configuration-permissions-to-member-accounts_12

以下画面で委任ポリシーを JSON 形式で記載します。
delegate-scp-configuration-permissions-to-member-accounts_13

委任ポリシー(子会社 A が 1 社ある場合)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ReadSCP${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:List*",
        "organizations:Describe*"
      ],
      "Resource": "*",
      "Condition": {
        "StringEqualsIfExists": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "CreateSCP${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": "organizations:CreatePolicy",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "ManageTagsOnSCPs${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:TagResource",
        "organizations:UntagResource"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${Organizationsの組織ID}/service_control_policy/*"
    },
    {
      "Sid": "ManageOwnSCPs${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:UpdatePolicy",
        "organizations:DeletePolicy"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
          "aws:ResourceTag/Owner": "${子会社A委任先AWSアカウントID}"
        }
      }
    },
    {
      "Sid": "AttachDetachToTargetOU${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:AttachPolicy",
        "organizations:DetachPolicy"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:ou/${Organizationsの組織ID}/${子会社AのOU ID}",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY"
        }
      }
    },
    {
      "Sid": "AttachDetachOwnSCPs${子会社A委任先AWSアカウントID}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::${子会社A委任先AWSアカウントID}:root"
      },
      "Action": [
        "organizations:AttachPolicy",
        "organizations:DetachPolicy"
      ],
      "Resource": "arn:aws:organizations::${管理AWSアカウントID}:policy/${Organizationsの組織ID}/service_control_policy/*",
      "Condition": {
        "StringEquals": {
          "organizations:PolicyType": "SERVICE_CONTROL_POLICY",
          "aws:ResourceTag/Owner": "${子会社A委任先AWSアカウントID}"
        }
      }
    }
  ]
}

A-3. 委任先(子会社 A)アカウント管理者からの見え方と操作

委任先(子会社 A)アカウント管理者からの見え方を確認し、どんな操作ができるかやってみます。
delegate-scp-configuration-permissions-to-member-accounts_54

委任先(子会社 A)アカウント管理者である IAM ユーザーを「Company_A_scp-admin」として作成して、この IAM ユーザーで委任先(子会社 A)アカウントにログインして画面を確認しています。「Company_A_scp-admin」ユーザーでログインして確認したキャプチャは赤枠になっています。

Organizations コンソールから AWS アカウント一覧を確認できます。
delegate-scp-configuration-permissions-to-member-accounts_14

ちなみに、ここから見える OU や AWS アカウントを子会社 A に関するもののみに制限できないか試行錯誤したのですが、うまくいかず、ここが見えないと SCP もうまく付与できない、という状態になってしまったため、全 OU・AWS アカウントは委任先 AWS アカウントから見える状態としています。

Organizations コンソールから確認できる各種ポリシーも確認できます。宣言型ポリシーなども見えますし、
delegate-scp-configuration-permissions-to-member-accounts_15

Control Tower が管理している SCP(aws-guardrails-XXXXXX)も見えます。
delegate-scp-configuration-permissions-to-member-accounts_16

Control Tower が管理している SCP(aws-guardrails-XXXXXX)については以下記事も参照ください。
https://dev.classmethod.jp/articles/what-is-aws-guardrails-scp-control-tower/

delegate-scp-configuration-permissions-to-member-accounts_17

こちらの SCP は変更したり削除したりできません。
delegate-scp-configuration-permissions-to-member-accounts_18

SCP 以外の他のポリシーの操作はできません。
AI サービスのオプトアウトポリシーや、
delegate-scp-configuration-permissions-to-member-accounts_20

宣言型ポリシーも見られません。
delegate-scp-configuration-permissions-to-member-accounts_21

では、試しに Owner タグ無しの SCP と Owner タグ有りの SCP を作成します。
「Company_A_scp-admin」ユーザーで委任先(子会社 A)アカウントにログインした状態で SCP を作成します。

Owner タグ無しの SCP にはポリシー名に _noTag と付けておきます。
delegate-scp-configuration-permissions-to-member-accounts_22

Owner タグ有りの SCP にはポリシー名に _Tag と付けておきます。

  • Key: Owner
  • Value: 委任先(子会社 A)の AWS アカウント ID

delegate-scp-configuration-permissions-to-member-accounts_23

Owner タグ無しの SCP の中身を編集しようとすると、権限がないため拒否されます。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_24

Owner タグ無しの SCP を OU-会社A にアタッチしようとすると、権限がないため拒否されます。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_25

Owner タグ有りの SCP の中身を編集します。無事更新されました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_26

Owner タグ有りの SCP を OU-会社A にアタッチします。無事アタッチできました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_27

Owner タグ有りの SCP を OU-会社B にアタッチしようとすると、権限がないため拒否されます。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_28

Owner タグ無しの SCP に、Owner タグを付与します。付与できました。タグの付与に制限はかけていないので、想定通りです。

delegate-scp-configuration-permissions-to-member-accounts_29

Owner タグ有りの SCP から Owner タグを削除することもできます。タグの削除にも制限をかけていないので、想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_30

B-1. 管理者アカウント作業: 子会社 B が新たに組織に参加する場合の OU 構成作成

ここまで子会社 A に SCP 操作を委任する作業と子会社 A の IAM ユーザー「Company_A_scp-admin」からの見え方・できる操作を確認してきました。

現在委任ポリシーには子会社 A への委任ポリシーしか記載していません。
この状態で、一旦子会社 B を追加する想定で、OU-会社 B と子会社 B の AWS アカウント、子会社 B の IAM ユーザー「Company_B_scp-admin」を作成します。
delegate-scp-configuration-permissions-to-member-accounts_56

手順は「管理アカウント管理者作業: OU 構成の作成」と同様のため省略します。

B-2. 委任先(子会社 B)アカウント管理者からの見え方と操作(委任ポリシー設定前)

子会社 B の IAM ユーザー「Company_B_scp-admin」で子会社 B の AWS アカウントにログインし、Organizations コンソールで見え方を確認してみましょう。「Company_B_scp-admin」ユーザーでログインして確認したキャプチャは青枠になっています。

まだ委任ポリシーを設定していない状態では、Organizations コンソールで OU 構成や AWS アカウントを確認することはできません。
delegate-scp-configuration-permissions-to-member-accounts_31

ポリシーも確認できません。
delegate-scp-configuration-permissions-to-member-accounts_32

B-3. 管理アカウント管理者作業: 委任ポリシーの設定

では、管理者アカウントで委任ポリシーを設定していきます。
delegate-scp-configuration-permissions-to-member-accounts_55-2

手順は「管理アカウント管理者作業: 委任ポリシーの設定」と同様です。1 社につき Sid ブロック 6 つを追加していく形になりますので、ここでは合計 12 の Sid ブロックになります。

設定後の委任ポリシー全体像は、「設定する委任ポリシー」で記載した「委任ポリシー(例えば子会社が 2 社ある場合)」の状態になります。

B-4. 委任先(子会社 B)アカウント管理者からの見え方と操作(委任ポリシー設定後)

子会社 B の IAM ユーザー「Company_B_scp-admin」で子会社 B の AWS アカウントにログインし、Organizations コンソールで見え方を確認してみましょう。

委任ポリシー設定後は、Organization コンソールから OU 構成や AWS アカウント情報が見える状態になっています。
delegate-scp-configuration-permissions-to-member-accounts_33

SCP 以外のポリシーに関しては閲覧できません。
delegate-scp-configuration-permissions-to-member-accounts_34
delegate-scp-configuration-permissions-to-member-accounts_35

SCP ですが、他の AWS アカウントで作成した SCP も見える状態です。

ここも、自分の AWS アカウントで作成した SCP のみ見えるようにできないか試行錯誤したのですが、自分の AWS アカウントで作成したものかどうかを判別する要素が思い当たらず断念しました。Owner タグで他の AWS アカウントで作成した SCP は操作できないようになっているので、ひとまず OK とします。
delegate-scp-configuration-permissions-to-member-accounts_36

Owner タグで他の AWS アカウントが指定されている SCP は編集できないことを確認します。ポリシー名とポリシーの説明を編集して保存しようとするとエラーになりました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_37

Owner タグで他の AWS アカウントが指定されている SCP は OU にアタッチできないことを確認します。無事エラーで拒否されました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_38
delegate-scp-configuration-permissions-to-member-accounts_39

Owner タグで他の AWS アカウントが指定されている SCP は OU からデタッチもできないことを確認します。無事エラーで拒否されました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_40

ここまで Owner タグで他の AWS アカウントが指定されている SCP の操作ができないことを確認してきました。ここから、子会社 B アカウントで SCP を作成して Owner タグを付与し、操作確認していきます。

Owner タグ無しの SCP と Owner タグ有りの SCP を作成します。
Owner タグ有りの SCP にはポリシー名に _Tag_B と付けておきます。

  • Key: Owner
  • Value: 委任先(子会社 B)の AWS アカウント ID

delegate-scp-configuration-permissions-to-member-accounts_42

Owner タグ無しの SCP にはポリシー名に _noTag_B と付けておきます。
delegate-scp-configuration-permissions-to-member-accounts_41

まず Owner タグ無しの SCP にタグが付与できることを確認します。付与できました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_43

Owner タグ有りの SCP からタグが削除できることを確認します。削除できました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_44

Owner タグ無しの SCP は OU にアタッチでタッチできないことを確認します。無事拒否されました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_45
delegate-scp-configuration-permissions-to-member-accounts_46

Owner タグ有りの SCP を OU-会社B にアタッチできることを確認します。無事アタッチできました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_47

Owner タグ有りの SCP を OU-会社A(自社の OU ではない、他の OU)にアタッチできないことを確認します。無事拒否されました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_48

Owner タグ有りの SCP を OU-会社B からデタッチできることを確認します。
delegate-scp-configuration-permissions-to-member-accounts_49

無事デタッチできました。想定通りです。
delegate-scp-configuration-permissions-to-member-accounts_50

おわりに

Control Tower の管理アカウント以外の AWS アカウントに SCP の設定を委任する方法をご紹介しました。
グループ企業が複数社あり、各社の制御をある程度自社で行いたい場合には、今回ご紹介した委任ポリシーが有効です。

ただし、他企業の OU 構成・AWS アカウントが見える点、Owner タグを操作できてしまう点などもありますので、運用ルールの整備や定期的な監査でカバーすることをおすすめします。導入の際は、ガバナンスの強度と運用負荷のバランスを考慮して判断してください。

また、SCP の更新は影響範囲が広く、事故が起こりやすい箇所です。新規子会社の追加時など、OU の作成や委任ポリシーの設定は十分注意して行ってください。
CI/CD パイプラインを組んで委任ポリシーの設定・変更を自動化する構成も技術的には可能ですが、今回は実装できませんでした。機会があれば挑戦してみたいと思います。

本記事への質問やご要望については画面下部のお問い合わせ「DevelopersIOへのご意見」からご連絡ください。記事に関してお問い合わせいただけます。

参考

https://dev.classmethod.jp/articles/delegate-scp-patterns/

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_delegate_policies.html

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps.html

この記事をシェアする

FacebookHatena blogX

関連記事