[小ネタ]AWS OrganizationsのSCPで特定リージョンのみ使用できるようにする

2021.05.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

オンジー(@onzuka_muscle)です!

特定のリージョン以外ではなにもできないようにしたいという要件に対応することがあったのでSCP(サービスコントロールポリシー)を使って制限してみます。

やってみた

今回は東京リージョン以外での操作を制限してみたいと思います。

こちらのサンプルからSCPを作成しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyAllOutsideEU",
            "Effect": "Deny",
            "NotAction": [
                "a4b:*",
                "acm:*",
                "aws-marketplace-management:*",
                "aws-marketplace:*",
                "aws-portal:*",
                "awsbillingconsole:*",
                "budgets:*",
                "ce:*",
                "chime:*",
                "cloudfront:*",
                "config:*",
                "cur:*",
                "directconnect:*",
                "ec2:DescribeRegions",
                "ec2:DescribeTransitGateways",
                "ec2:DescribeVpnGateways",
                "fms:*",
                "globalaccelerator:*",
                "health:*",
                "iam:*",
                "importexport:*",
                "kms:*",
                "mobileanalytics:*",
                "networkmanager:*",
                "organizations:*",
                "pricing:*",
                "route53:*",
                "route53domains:*",
                "s3:GetAccountPublic*",
                "s3:ListAllMyBuckets",
                "s3:PutAccountPublic*",
                "shield:*",
                "sts:*",
                "support:*",
                "trustedadvisor:*",
                "waf-regional:*",
                "waf:*",
                "wafv2:*",
                "wellarchitected:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": [
                        "ap-northeast-1"
                    ]
                },
                "ArnNotLike": {
                    "aws:PrincipalARN": [
                        "arn:aws:iam::*:role/Role1AllowedToBypassThisSCP",
                        "arn:aws:iam::*:role/Role2AllowedToBypassThisSCP"
                    ]
                }
            }
        }
    ]
}

以上がSCP全文で抜粋して説明します。

"Effect": "Deny",
            "NotAction": [
                "a4b:*",
                "acm:*",
                "aws-marketplace-management:*",
                "aws-marketplace:*",
                ・・・
                (略)
                ・・・

EffectはDeny なので例外のアクション(NotAction)はつまり制限をかけないサービスを列挙していることになります。

ここで列挙しているRoute53やIAMなどのグローバルサービスは、us-east-1リージョンによって物理的にホストされているエンドポイントがあります。

そのためDenyされてしまわないように除外してあげる必要があります。

            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": [
                        "ap-northeast-1"
                    ]
                },
                "ArnNotLike": {
                    "aws:PrincipalARN": [
                        "arn:aws:iam::*:role/Role1AllowedToBypassThisSCP",
                        "arn:aws:iam::*:role/Role2AllowedToBypassThisSCP"
                    ]
                }
            }
        }
    ]
}

Conditionで条件を指定しています。

StringNotEqualsでは使用可能にするリージョンを指定する必要があります。

また使用不可にしたリージョン(東京リージョン以外)でも例外的に操作が可能なIAMを用意する場合はArnNotLikeでIAMのARNを指定します。

上記の例ではIAMロールの「Role1AllowedToBypassThisSCP」「Role2AllowedToBypassThisSCP」のみ東京リージョン以外でAWSリソースを操作できます。

(以降の操作で使っているのは例外登録していないIAMです。)

SCP適用前

当然、オレゴンリージョンでEC2起動できます。

SCP適用

先ほどの東京リージョン以外を制限するSCPを適用していきます。

SCPを作成していきます。

SCPをアタッチします。

SCP適用後

SCPを適用したアカウントにログインします。

EC2のダッシュボードを表示すると各情報が見れなくなっています。

EC2の起動もできません。

東京リージョンではEC2の起動ができました。

おわり

こういう強力な制限を複数のアカウントに一気にかけられるのとても便利なのでこれだけでもOrganizationsを使うメリットがあるなぁと思います。(強力ゆえに注意も必要ですが)

参考