東京リージョン以外使わせたくない!といった制限がAWS Control Towerから数クリックでできるようになりました

概要

セキュアなマルチアカウント環境を構築・維持することを助けるAWS Control Towerで、利用リージョンを制限する予防的ガードレールを簡単に設定できるようになりました。

データのローカライズ要件等で、海外のリージョンにAWSリソースを構築してほしくないといったケースで活用できます。

aws.amazon.com

 

Control Towerについては先日、JAWS-UGのイベントで登壇した以下で概要を説明しています。

[JAWS PANKRATION]Will AWS Control Tower take away my jobs as multi account administrator? (Control Towerはマルチアカウント管理者の仕事を奪ってくれるのか?) - Speaker Deck

Control Towerは大きく以下の7つの機能を持っています。今回の機能は図中の4つ目、「セキュリティガードレールを提供する」によって実現されます。

f:id:imiky:20211201085150p:plain

セキュリティガードレールには以下の2種類があります。

  • 発見的ガードレール
    統制・セキュリティ上、最低限外れるべきではないラインを踏み越えた操作や設定を検知して注意を促します
  • 予防的ガードレール
    統制・セキュリティ上、いかなる状況でも外れてはならないラインを踏み越えようとする操作を禁止します。

高速道路の白線とその外側の柵と同じイメージかと思います。高速道路で白線を踏むと「ヴーン」という音がした経験はないでしょうか。私はたまに踏みます(運転が下手...)。これ以上外れると危ないよと警告してくれる仕組みです。さらにその外には高さのある柵が立てられていて、その外側には飛び出ないように守ってくれています。この2つの仕組みの内側では、ドライバーは自由に運転することができます。

セキュリティガードレールも同じです。開発者が自由に自走できる範囲があって、その境界線に発見的ガードレールを、さらにその外側に予防的ガードレールを敷設します。開発者から権限を奪ってセキュリティを守ろうとするのではなく、このようにガードレールを敷設し安心して開発のアクセルを踏まさせてあげる事がクラウドにおける適切なセキュリティの守り方です。権限を奪ってしまうと、せっかくのクラウドのメリットが台無しですので...

今回のリージョン制限は、予防的ガードレールにより、指定リージョン以外での操作が禁止されます。

やってみた

Control Towerの [ランディングゾーン設定] に「Region deny guardrail」という表示が追加されています。[設定を変更する] から有効化します。

f:id:imiky:20211201092239p:plain

[リージョン拒否設定] を有効にします。が、気軽にポチらないでください。
表示の通りですが、ポチると以下の通り、リージョン制限がかかります。制限されるリージョンで既に利用実態がないか事前確認が必須です

  • Control Towerの管理対象に組み込んでいないリージョンとControl Towerに対応していないリージョンへのアクセスが拒否されます(つまり、2021/12/1時点だと大阪リージョンの利用は制限されてしまう)
  • Control Towerに登録済みの全てのOUでリージョン制限がかかります(特定のOUだけ除外とかはできません)

f:id:imiky:20211201092501p:plain

ランディングゾーンが更新されます。60分かかる表示がされますが、20分くらいで終わりました。

f:id:imiky:20211201092552p:plain

更新が終わると、予防的ガードレールとして「ガードレール: リクエストされた AWS リージョンに基づいて AWS へのアクセスを拒否する」が自動的に作成されます。AWS Organizations のサービスコトロールポリシー(SCP)で実装されます。この時点でリージョン制限が適用されるので、Control Towerに組み込んでいないリージョンでは操作できなくなります。

f:id:imiky:20211201093602p:plain

OUへの適用状況を見てみると、Root以外の全てのOUに自動的に適用されていました。かつ、前述の通り、OUの除外はできません。

実際にControl Towerで管理されていないリージョンで操作してみると、参照すらできない状態になっています。

f:id:imiky:20211201094529p:plain

実際のところ何をしているの?

適用されるSCPを見てみます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "ap-northeast-1"
          ]
        },
        "ArnNotLike": {
          "aws:PrincipalARN": [
            "arn:aws:iam::*:role/AWSControlTowerExecution"
          ]
        }
      },
      "Resource": "*",
      "Effect": "Deny",
      "NotAction": [
        "a4b:*",
        "acm:*",
        "aws-marketplace-management:*",
        "aws-marketplace:*",
        "aws-portal:*",
        "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:GetBucketPublicAccessBlock",
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation",
        "shield:*",
        "sts:*",
        "support:*",
        "trustedadvisor:*",
        "waf-regional:*",
        "waf:*",
        "wafv2:*",
        "access-analyzer:*"
      ],
      "Sid": "GRREGIONDENY"
    }
  ]
}

aws:RequestedRegion」を条件にリスト内で指定されているリージョン以外からの主要なサービスの操作が拒否されています。ここがいじれないので、この操作は例外的に許可したいとかはできません。

まとめ

利用リージョンを制限したいという要件はお客さまからしばしばいただきます。ポチるだけで簡単にこの要件を満たせます。ただし、実態としてはこのアカウントだけは許可したいといった話がしばしば出てきます。新サービスが出て、普段使っていないリージョンでしかまだ対応していないが検証したい等。

本機能だと、そのような例外には対応できません。1アカウントでもControl Towerの管理対象外リージョンを使うなら、そのリージョンを管理対象に組み込めよという説も分からなくはないものの、実運用としては例外を作りたいと思います。

Control Towerが作る上記SCPがドキュメントで公開されていますので、これを参考に自分でSCPを作成、適用する事も検討すると良いかと思います。

docs.aws.amazon.com

 

以上