AWS Organizationsのサービスコントロールポリシー(SCP)の話

##はじめに
AWS Organizationsは大きく分けて、Payerをまとめる機能とSCPにより認可設定する機能があります。今回は、SCP機能で何ができるかを整理したいと思います。

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

##SCPを理解するためのポイント

###SCPを付与する対象(エンティティ)
SCPを付与する対象(エンティティ)は、組織のツリー構造のルートにあたるRootとOUとAWSアカウントになります。
***マスターのAWSアカウントにもSCPを付与できますが、実際は権限制限できません。***

>
サービスコントロールポリシーは、マスターアカウントがどの root または OU に属していても、マスターアカウントに適用されません。
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/20675041-4edf-d9a4-c8a8-a35e6080b8fc.png)


Root、OU、AWSアカウント、SCPの関係は以下の様なイメージになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/dd0563f0-fa58-8602-0f81-43ccfc881bd1.png)

###権限管理が可能な対象(プリンシパル)
SCPの付与した場合の、権限管理が可能な対象(プリンシパル)は以下になります。

```
 Rootユーザ
 IAMユーザ
 IAMロール
```

以下のプリンシパルは適用外になります。

```
 組織のマスターアカウントに存在する全てのプリンシパル
 メンバーアカウントのサービスにリンクされたロール(Service-linked Role)
 リソースベースのポリシーで権限を付与された外部ユーザ
   例) S3のバケットポリシーで許可した外部アカウントのIAMユーザなど
```

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_about-scps.html

###ブラックリストとホワイトリスト
SCPの記載方法ですが、利用を禁止するブラックリスト方式と利用を許可するホワイトリスト方式があります。

ブラックリストの例

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1549502804000",
            "Effect": "Deny",
            "Action": [
                "dynamodb:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

ホワイトリストの例

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1549502834000",
            "Effect": "Allow",
            "Action": [
                "ec2:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

IAMと同じで基本、暗黙的Deny＜明示的Allow＜明示的Denyの順で右に行くほど優先度が高くなります。
ただし、暗黙的なDenyの実際のケースとして、例えばOUでFullAWSAccessをアタッチしている場合で、AWSアカウントにホワイトリストをアタッチすると、ホワイトリストで明示的に許可したサービス以外利用できなくなります。
以下の例だと、Account1はOUの暗黙的なDenyが優先されるため、EC2のみ使用できる形になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/a19c7f5a-8490-75bb-6eaa-02ee8581f700.png)

OUとAWSアカウントで入れ子に設定できるため、想定されるパターンをテストしてみます。
前提となる構成は以下になります。Rootには、「FullAWSAccess」がアタッチされていて、IAMポリシーは、FullAccess権限がある前提です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/d313d9cb-b4c8-bbe2-99f1-e0176b6ad664.png)


###ホワイトリストのパターン

ホワイトリストの注意点としては、AWSアカウントにデフォルトで「FullAWSAccess」が付与されているためデタッチする必要があります。ただ、ルート、OU、AWSアカウントには最低1つのSCPがアタッチされている必要があるため、新規にSCPを作成して、アタッチしたあとに「FullAWSAccess」をデタッチします。

ホワイトリストの内容は、EC2の操作(ec2:*)を許可する。
AWSアカウントを任意のOUに移動することで権限管理できる方がシンプルなため、AWSアカウントはFullAWSAccessでOU単位でホワイトリストをアタッチするパターンが管理しやすいと思います。。(青線で囲ったところ)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/d452739a-2570-d666-9396-334baf7201f2.png)

###ブラックリストのパターン
ブラックリストの内容は、DynamoDBの操作(dynamodb:*)を拒否する。
OU,AWSアカウントの両方でFullAWSAccess権限を持ちつつ不要な操作をOU側のブラックリストで拒否するパターンが管理しやすいと思います。(青線で囲ったところ)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/96fcf5c4-b3c1-2214-cb04-59ac10052c3a.png)

###ブラックリストとホワイトリストの併用
OUでの管理を基本とするのであれば、AWSアカウントはFullAWSAccssをアタッチして、OUでブラックリストとホワイトリストのSCPをアタッチするパターンがパターンが管理しやすいと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/1e1cc3f7-7e6f-78df-91af-09b2ecbcab57.png)

###ホワイトリストで入れ子状態になったパターン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/ae5a7b82-86e7-fe3b-fde7-69c2b4fbb47d.png)

EC2のみ操作可能で、EC2以外は暗黙的なDenyが有効になり操作できません。

###ブラックリストで入れ子状態になったパターン1
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/3c598fec-58a5-2eb6-45f4-87d7febaf5f0.png)

親OUでブラックしかアタッチされていないため、すべての操作が拒否されます。

###ブラックリストで入れ子状態になったパターン2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/8e5f0e5f-e52b-847e-3f73-94b2951860d6.png)

DynamoDBに操作不可。DynamoDB以外の操作は可能です。

##実際の組織構造を想定したOU構成

###ブラックリストでガバナンスを効かせる
想定されるユースケース※マニュアルより抜粋
例 1: ユーザーによる AWS CloudTrail の無効化を禁止する例
2: ユーザーによる Amazon CloudWatch の無効化または設定の変更を禁止する
例 3: ユーザーによる Amazon VPC フローログの削除を禁止する
例 4: ユーザーによる AWS Config の無効化またはルールの変更を禁止する
例 5: インターネットアクセスに接続されていない VPC を使用した取得を禁止する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/30409d62-5c89-702f-92c3-356335432838.png)

###ホワイトリストで使用するサービスを明示的に許可したい場合
Service用のOUは、EC2やRDSなどエンドユーザ向けのサービスで使用するAWSサービスをホワイトリストで許可する。
Operation用のOU(ログ集約用のアカウント)は、ログ保管を目的としているため、S3などデータをアーカイブするために必要となるAWSサービスのみの使用を許可する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/8534827c-3325-f032-740b-d4bdec17902c.png)

###折衷案
ホワイトリストとブラックリストの併用。
使用するAWSサービスを明示的に許可しつつ、明示的に禁止したい監査系のサービス停止を拒否するような構成です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/aa2e9293-9604-7492-b2ae-9359262c7148.png)

##お約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。