AWS Organizationsで利用するリージョンを限定しよう！


AWS Organizations の SCP (サービスコントロールポリシー) で、使わないリージョンを殺しておきます。

# Why ?

クレデンシャルが悪人の手に渡った場合、意図しない EC2 インスタンスを大量に立ち上げて仮想通貨掘られるなどの事態が起こりうる。特に普段使わないリージョンで悪意のある操作をされると気づきにくい。
特に日本から距離も遠く金額も高くあまり利用しないであろう思われる南米サンパウロリージョンなどで EC2 インスタンスを大量に立ち上げられてしまうと被害も大きくなる。

このような被害を防ぐため、 AWS Organizations の SCP (サービスコントロールポリシー)を使えば、普段使用しないリージョンの利用を制限しておくことができる。

望ましい構成として、 Organizations の親アカウントでは管理者権限の IAM ユーザを作らず、支払いと Organizations の操作のみ許可して普段は使用しない方針で運用する。
**Organizations の親アカウントは SCP で制御できない**ため、多くの権限を持たせないようにするとよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/2319b563-9fe8-b9cc-5276-02703b962fc5.png)

 # SCP （サービスコントロールポリシー）とは
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps.html

子アカウントなら root ユーザでさえも制約できる、強力なポリシー。
SCP で許可された操作がそのまま配下の AWS メンバーアカウントに適用されるのではなく、SCP で許可されたポリシーの中から、さらに個別 AWS メンバーアカウント内で許可された操作が最終的に許可される。
SCP は強力なポリシーであるため、一度試行用アカウントで適用し、挙動を確認するのが望ましい。
以下のような手順でリージョン制限を実施する。

**1. 試行用 OU を作成する**
**2. 試行用 AWS アカウントを 試行用 OU に移動する**
**3. SCP を作成する**
**4. 試行用 OU に SCP を適用する**
**5. 挙動確認する**
**6. 挙動が確認できたあと、リージョン制限すべきメンバーアカウントを OU に移動する**

# 0.事前準備
すでにAWS Organizations の組織ができている前提で手順を記載する。
Organizations の始め方は以下記事を参照。

https://qiita.com/emiki/items/f68bec2ef6f5d3dfe14f

# 1.SCP を適用する OU を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a045f79c-6377-4181-f4a8-f82a0dce21a1.png)

Organizations の組織 root を選択し、[アクション]-[組織単位]-[新規作成]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e5b448a7-336b-2090-ee32-201fb127021b.png)

「組織単位名」を付け、タグは任意で追加し、「組織単位の作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/eb6a6caa-4559-a7db-4eac-ad2f43f2a757.png)

組織単位が作成された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7d2e46e0-14e7-f5db-8cb5-06376fb3b5c3.png)

#  2.試行用 AWS アカウントを 試行用 OU に移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/584983ce-032a-10ff-3800-3ed2f5d3f04b.png)

メンバーアカウントの一つを作成した OU に移動する。移動するメンバーアカウントにチェックを入れ、[アクション]-[AWS アカウント]-[移動]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3f9d014f-f55d-458f-0139-19dc17c5fbca.png)

作成した OU にチェックを入れ「AWS アカウントを移動」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/95d07387-b8c4-b49f-e7e7-630dba9bcc0e.png)

移動できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6bb3118d-4e78-02b7-c1f1-b1c0e49ca363.png)

# 3.SCP （サービスコントロールポリシー）を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/aab778de-893c-ca19-60be-4b8cbf65136c.png)

画面左メニューで「ポリシー」を選択し、「サービスコントロールポリシー」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/101985d1-64cc-ee67-da11-8e68e4239c83.png)

「サービスコントロールポリシーを有効にする」をクリックし、有効化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/df18c4c3-dce8-216c-f55a-d484138c08ee.png)

SCP が有効になる。「ポリシーを作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/13b83d03-742b-ddf9-b85a-148955715c77.png)

「ポリシー名」を付ける。タグは任意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/4816deea-854e-5e34-184f-0983a1058992.png)

画面をスクロールし、ポリシーステートメントを編集する。最初は以下のようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3dc379d1-4e41-84ad-1aa8-ee42fc8b8291.png)


[リクエストされたリージョンに基づいて、AWS へのアクセスを拒否する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_deny-requested-region.html) を参考に、以下のようにステートメントを編集する。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyAllOutsideRequestedRegions",
            "Effect": "Deny",
            "NotAction": [
                "cloudfront:*",
                "iam:*",
                "route53:*",
                "support:*",
                "aws-portal:*",
                "budgets:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": [
                        "us-east-1",
                        "us-west-2",
                        "ap-northeast-1",
                        "ap-northeast-3"
                    ]
                }
            }
        }
    ]
}
```

基本は`"Deny"`で拒否しておき、利用するものを除外する書き方をする。
利用するグローバルサービスは`"NotAction"`で除外しておく。
利用するリージョンも`"Condition"`句で除外する。
今回は

- よく使う日本のリージョン「東京」「大阪」
- グローバルサービスで利用する「バージニア北部」
- 太平洋西海岸で日本に比較的近く利用料金の安い「オレゴン」

の4リージョンを許可している。「ポリシーを作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/23479bd1-ec2c-b4e4-1ee3-9ece075a0bca.png)

SCP が作成できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/379a2dc7-7376-ca45-1064-aa509dad4348.png)

# 4.試行用 OU に SCP を適用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e009fec5-1824-fe58-d7ea-ce0434494658.png)

作成した SCP をチェックし、[アクション]-[ポリシーのアタッチ]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/9f803302-8e78-756d-8c62-e5b6700912e0.png)

作成した OU にチェックを入れ、「ポリシーのアタッチ」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/354974b1-28c0-64d8-4a17-d922e9d2a8e6.png)


SCP を OU にアタッチできた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/1537bcb5-f1a8-893c-61b1-2d0a7dd4c8a2.png)

ターゲットタブを開くと、 SCP をアタッチした OU を確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3a0da8cc-3320-74a0-b5b2-e18d33002fae.png)

# 5.挙動確認する
SCP をアタッチした OU に所属しているメンバーアカウントでマネジメントコンソールから EC2 の画面を見てみると、許可したリージョンでは問題なくマネジメントコンソールから情報を参照できるが、許可していないリージョンでは API エラーになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/90907b3c-3c62-626e-6a74-bb54e7006daa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ee1bf847-035c-6f9c-8820-50867fb49cd7.png)

# 6.挙動が確認できたあと、リージョン制限すべきメンバーアカウントを OU に移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/81f383db-9d03-963b-b2b8-6ee0e17c51a9.png)

## 6-1.OU の名前変更
名前を変更する OU を選択し、[アクション]-[組織単位]-[名前の変更]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/63e37d3b-ae7f-8112-0b09-b86dd82c9c34.png)

名前を変更し、「変更を保存」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6281b1ea-3a15-920f-2cf0-1e436dc7d394.png)

OU の名前が変更できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b3eaee25-652e-edc4-a2ef-889c6b33e438.png)

## 6-2.メンバーアカウントの移動
[2.試行用 AWS アカウントを 試行用 OU に移動する](https://qiita.com/emiki/items/e1d01738dd9618a2d24f#2%E8%A9%A6%E8%A1%8C%E7%94%A8-aws-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92-%E8%A9%A6%E8%A1%8C%E7%94%A8-ou-%E3%81%AB%E7%A7%BB%E5%8B%95%E3%81%99%E3%82%8B) の手順を参考に、リージョン制限すべきメンバーアカウントを、 OU に移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b4ac8df8-b4c7-0287-603d-00cd8202f4f7.png)


おわり。


# 参考

https://speakerdeck.com/opelab/20210826-jawsug-asa-organizations-region

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_deny-requested-region.html