【AWS Organizations】 管理アカウントにはSCPが適用されません
あしざわです。
AWS OrganizationsのSCP(Service Control Policy)という機能をご存知でしょうか?
SCPとは、Organizationsで管理するAWSアカウントのアクセス許可を管理する承認ポリシーの一種です。SCPを定義することで、AWSアカウント上で実行できるAWS APIを制限できます。
最近社内でOrgnaizationsのSCPに関する問い合わせがあったので、質問内容とその回答をまとめます。
質問内容
SCPを使って特定のAWSアカウント以外のAPIの実行を制限したいです。
Organizationsの管理アカウントを含めAPI実行を制限可能ですか?
回答
SCPの仕様上、Organizationsの管理アカウント(Management Account)に対する制限は実装できません。
以下AWS公式ドキュメントに記載されています。
SCP は、管理アカウントのユーザーやロールには影響を与えません。SCP は、組織内のメンバーアカウントにのみ影響を与えます。つまりSCPsは委任管理者として指定されたメンバーアカウントにも適用されます。
...と質問に対する回答は上記で終わってしまうのですが、単にQ&Aをまとめただけでは面白くないですよね。
回答内容を実際に確かめて裏付けすることを目的に、以降で検証を行ってみます。
やってみた
Root OU配下にSandbox OUを作成し、管理アカウント・メンバーアカウント(sample-a)の2つを移動させています。
Sandbox OUに以下のSCPを適用します。iam:DeleteRole(IAMロールを削除するAPI) のみの実行を禁止するSCPです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"iam:DeleteRole"
],
"Resource": "*"
}
]
}
私の環境では、Deny-IAM-DeleteRole
というSCPを前述のポリシードキュメントで作成し、Sandbox OUにアタッチしました。
ちなみにSCPはOUだけでなく、AWSアカウントにもアタッチできます。
この時点で管理アカウントにSCPを直接アタッチしようと試みるとSCP は、組織内のメンバーアカウントにのみ適用できます。管理アカウントのユーザーまたはロールには影響しません。
というエラーで失敗します。
(SCPアタッチ時のエラー文からわかったので以降の検証はあまり意味をなさないのでは...と思う方もいるかもしれないですが、そのまま続けます)
OUにSCPを適用したので、管理アカウントではIAMロールが削除できる(制限されていない)が、メンバーアカウントでは削除できない(制限されている) ことを確認します。
アカウントを切り替え、メンバーアカウントでマネジメントコンソールにサインインします。
CloudShellからAWS CLIを実行し、IAMロールscp-test-role
を作成しました。
~ $ aws iam create-role --role-name scp-test-role \
--assume-role-policy-document file://trust-policy.json
※trust-policy.json
には以下を設定しています。あらかじめ作成したファイルをCloudShell上にアップロードしています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole"
}
]
}
以下削除コマンドを実行したところ、explicit deny in a service control policy
のエラーで削除に失敗しました。想定通り、API実行が制限されていますね。
~ $ aws iam delete-role --role-name scp-test-role
An error occurred (AccessDenied) when calling the DeleteRole operation: User: arn:aws:sts::123456789012:assumed-role/xxxxxx/example@example.com is not authorized to perform: iam:DeleteRole on resource: role scp-test-role with an explicit deny in a service control policy
続いて、管理アカウントにマネジメントコンソールからサインインします。
先ほどと同様にCloudShellで、IAMロールscp-test-role
を作成します。
~ $ aws iam create-role --role-name scp-test-role \
--assume-role-policy-document file://trust-policy.json
続いて削除コマンドを実行したところ、エラーとならず削除に成功します。API実行が制限できていないことがわかりました。
~ $ aws iam delete-role --role-name scp-test-role
(エラーなし)
参考資料
最後に
今回は、冒頭のQAから派生して「AWS OrganizationsのSCPが管理アカウントに適用されないこと」を検証しました。
検証の結果、以下のことが確認できました。
- SCPは組織内のメンバーアカウントにのみ適用され、管理アカウントには影響しない
- 管理アカウントに直接SCPをアタッチしようとするとエラーになる
- OUでSCPをアタッチしても、管理アカウントとメンバーアカウントでは制限の適用有無が異なる
この仕様は、管理アカウントが組織全体の管理権限を保持し続ける必要があるため存在していると想定します。もし管理アカウントまでSCPで制限されてしまうと、組織の管理ができなくなる可能性があります。
管理アカウントのセキュリティを強化したい場合は、SCPではなく、IAMポリシーやパーミッションバウンダリー、MFAの強制、CloudTrailによる監査など、別の方法を検討することをお勧めします。
以上です。