AWS Organizations の サービスコントロールポリシー (SCP) を用いて、複数アカウントにリージョン利用制限するパターンをまとめてみた

2023.07.11

はじめに

AWS Organizationsのサービスコントロールポリシー (以降、SCP) を設計時、アカウントにリージョン利用制限の設定したいことがあったため、SCPの設定パターンをまとめました。

SCPの概要や設定方法は、以下が参考になります。

下記のOrganizationsとOUを例にして、利用制限するパターンをご説明します。

A~Dアカウントの4つのアカウントが存在しています。

前提条件として、全てのアカウントには、FullAWSAccessがアタッチされています。

全アカウントを東京とバージニアリージョンのみ利用可

  • Aアカウント
    • 東京リージョン、バージニアリージョン
  • Bアカウント
    • 東京リージョン、バージニアリージョン
  • Cアカウント
    • 東京リージョン、バージニアリージョン
  • Dアカウント
    • 東京リージョン、バージニアリージョン

A~Dアカウント全てに、東京とバージニアリージョンのみ利用できるようにし、他のリージョンでの操作を制限します。

下記の設定で、region-restriction-1というSCPを作成し、親OUにアタッチすると実現できます。

region-restriction-1

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction1",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1",
            "us-east-1"
          ]
      }
    }
  ]
}

Condition内でStringNotEqualsをつけているため、東京とバージニアリージョン以外のリージョンは、全てのアクションがDenyされます。

新規アカウント用OU

すべてのアカウントを東京とバージニアリージョンに制限したい要件に加えて、新規アカウントを発行した際、全てのリージョンでデフォルトVPCを削除した後に、東京とバージニアリージョンに制限をしたい要件もあると思います。

その場合は、以下のOU構成のように、親OUにregion-restriction-1をアタッチするのではなく、1階層下の子OUにアタッチします。

それによって、Setup OU配下は、新規アカウント(今回はAアカウント)は全てのリージョンが利用できますので、全てのリージョンでデフォルトVPCを削除します。

削除後に、新規アカウント(=Aアカウント)をSetup OU配下から子OU配下に移動させることで、リージョン制限することができます。

全てのリージョンでデフォルトVPCを削除後、新規アカウント(=Aアカウント)をSetup OU配下から子OU配下に移動させます。

特定のアカウントを除いて、東京とバージニアリージョンのみ利用可

利用可能リージョン

  • Aアカウント
    • 全てのリージョン
  • Bアカウント
    • 東京リージョン、バージニアリージョン
  • Cアカウント
    • 東京リージョン、バージニアリージョン
  • Dアカウント
    • 東京リージョン、バージニアリージョン

Aアカウントを除き、全てのアカウントに利用可能リージョンを東京とバージニアリージョンのみに制限します。

Aアカウントは、全てのリージョンを利用できます。

下記の設定で、region-restriction-2というSCPを作成し、親OUにアタッチすると実現できます。

"aws:PrincipalAccount"の値には、AアカウントIDを入れます。

region-restriction-2

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction2",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1",
            "us-east-1"
          ],
          "aws:PrincipalAccount":  [
            "AアカウントID"
          ]
        }
      }
    }
  ]
}

Condition内でStringNotEqualsをつけているため、AアカウントID以外、かつ、東京とバージニアリージョン以外のリージョンは、全てのアクションがDenyされます。

他のアカウントは東京とバージニアリージョンのみ利用、特定のアカウントは別リージョンのみ利用

  • Aアカウント
    • オハイオリージョン、オレゴンリージョン
  • Bアカウント
    • 東京リージョン、バージニアリージョン
  • Cアカウント
    • 東京リージョン、バージニアリージョン
  • Dアカウント
    • 東京リージョン、バージニアリージョン

Aアカウントを除き、全てのアカウントに利用可能リージョンを東京とバージニアリージョンのみに制限します。

Aアカウントは、オハイオとオレゴンリージョンのみに利用制限します。

下記の設定で、region-restriction-2region-restriction-3というSCPを作成し、親OUにアタッチすると実現できます。

"aws:PrincipalAccount"の値には、AアカウントIDを入れます。

region-restriction-2

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction2",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1",
            "us-east-1"
          ],
          "aws:PrincipalAccount":  [
            "AアカウントID"
          ]
        }
      }
    }
  ]
}

region-restriction-3

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction3",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "us-east-2",
            "us-west-2"
          ]
        },
        "StringEquals": {
          "aws:PrincipalAccount":  [
            "AアカウントID"
          ]
        }
      }
    }
  ]
}

Condition内で、StringNotEqualsではオハイオとオレゴンリージョン以外のリージョン、かつStringEqualsではAアカウントIDのみ、全てのアクションがDenyされます。

1つのSCPに上記の2つのSCPをまとめることもできますが、今回は、わかりやすいように分けました。

複数アカウントに特定のリージョンのみ利用する制限を複数設定

  • Aアカウント
    • オハイオリージョン、オレゴンリージョン
  • Bアカウント
    • 東京リージョン、大阪リージョン
  • Cアカウント
    • 東京リージョン、バージニアリージョン
  • Dアカウント
    • 東京リージョン、バージニアリージョン

Aアカウントを除き、全てのアカウントに利用可能リージョンを東京とバージニアリージョンのみに制限します。

Aアカウントは、オハイオとオレゴンリージョンのみに利用制限します。

下記の設定で、region-restriction-2region-restriction-3region-restriction-3というSCPを作成し、親OUにアタッチすると実現できます。

region-restriction-2"aws:PrincipalAccount"の値には、AアカウントIDとBアカウントIDを入れます。

region-restriction-2

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction2",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1",
            "us-east-1"
          ],
          "aws:PrincipalAccount":  [
            "AアカウントID",
            "BアカウントID"
          ]
        }
      }
    }
  ]
}

region-restriction-3"aws:PrincipalAccount"の値には、AアカウントIDのみを入れます。

region-restriction-3

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction3",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "us-east-2",
            "us-west-2"
          ]
        },
        "StringEquals": {
          "aws:PrincipalAccount":  [
            "AアカウントID"
          ]
        }
      }
    }
  ]
}

region-restriction-4"aws:PrincipalAccount"の値には、BアカウントIDのみを入れます。

region-restriction-4

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction4",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1",
            "ap-northeast-3"
          ]
        },
        "StringEquals": {
          "aws:PrincipalAccount":  [
            "BアカウントID"
          ]
        }
      }
    }
  ]
}

注意事項

OUやアカウントにアタッチできるSCP数は、上限5つです。

上限緩和できないため、SCPがアタッチ出来ない場合、region-restriction-3region-restriction-4は、子OUや直接アカウントにSCPをアタッチするとよいでしょう。

[推奨] OUごとにリージョン制限をする

利用可能リージョン

  • Aアカウント
    • オハイオリージョン、オレゴンリージョン
  • Bアカウント
    • 東京リージョン、バージニアリージョン
  • Cアカウント
    • 東京リージョン、バージニアリージョン
  • Dアカウント
    • 東京リージョン、バージニアリージョン

OUごとにリージョン制限可能であれば、子OUごとにリージョン制限するSCPをアタッチする方法が運用としては楽です。

Aアカウントは、オハイオとオレゴンリージョンのみに利用を制限します。

B,C,Dアカウントは、東京とバージニアリージョンのみに利用を制限します。

下記の設定で、region-restriction-5region-restriction-6というSCPを作成し、それぞれ子OUにアタッチすると実現できます。

region-restriction-5

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction5",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "us-east-2",
            "us-west-2"
          ]
        }
      }
    }
  ]
}

region-restriction-6

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "RegionRestriction6",
      "Effect": "Deny",
      "Action": [
        "*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1",
            "us-east-1"
          ]
        }
      }
    }
  ]
}

最後に

今回は、色々なパターンで、特定のリージョンのみ利用する制限をSCPで設定しました。

最後のパターンは、SCPが多すぎると、管理が大変なため、SCPの数や制限はほどほどにしましょう。