AWS OrganizationsのSCP適用範囲を条件指定で特定アカウントに限定する

こんにちは。サービス開発室の武田です。AWS Organizationsの適用対象アカウントを、ポリシーのConditionで絞る方法を試してみました。
2023.12.07

こんにちは。サービス開発室の武田です。

AWS Organizationsというサービスは、AWS環境のマルチアカウント管理を強力に後押しするものです。さて、その中にSCP(Service control policies)という機能があります。これはIAMポリシーやバケットポリシーなどと同じように、あるエンティティが行えるアクションを制限するために使用します。

詳しくはこちらのエントリなどを参照ください。

さてこのSCPですが、私は特定のアカウントにポリシーを適用する方法を次の2点だと思っていました。

  1. OUを作成し、適用したいアカウントをそこに移動。OUにポリシーをアタッチする
  2. 適用したいアカウントに直接ポリシーをアタッチする

1の場合、適用したくないアカウントとOUを完全に分ける必要があり、柔軟性が高いとは言えません。2の場合柔軟性は高いですが、複数のアカウントに対してそれぞれアタッチする必要がある点でやや煩雑さがあります。

同僚からの指摘で、また別の方法があることを知りました。ポリシーのConditionで適用対象を絞る方法です。

  1. ポリシーのConditionで適用したい(または適用したくない)アカウントを指定。OUにポリシーをアタッチする

というわけです。そもそもSCPがリリースされた当時、Conditionは指定できませんでした。その後のアップデートで指定できるようになったのですが、当時の検証では3の方法はできなかった記憶がありました。当時の検証に漏れがあったのか、どこかでアップデートがあったのかは調べてもわかりませんでしたが、ともかく今はこの方法が使用できます。

やってみた

それでは実際に設定して挙動を確認してみます。

登場人物は次の3人です。

  • 管理アカウント:adminさん
  • メンバーアカウントその1:Aさん
  • メンバーアカウントその2:Bさん

まずadminさんでOU作成、SCP作成、SCPアタッチを実施します。最初は条件指定なしで、両方のアカウントに適用されることを確認します。

adminさんの作業

まずOUを作成します。名前はSCP-Condition-Sandboxとしました。

作成できたら、このOUにAさんBさんを移動させます。

続いてSCPを作成します。名前はTest-Condition-SCPです。

ポリシーの内容は、えいやっと全部のアクションをDenyしてしまいましょう。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Deny",
			"Action": [
				"*"
			],
			"Resource": [
				"*"
			]
		}
	]
}

作成できたら、このポリシーをSCP-Condition-Sandboxにアタッチします。

Aさんの画面で確認

Aさんのマネジメントコンソールにアクセスしてみましょう。

拒否されている!

Bさんの画面で確認

同じようにBさんのマネジメントコンソールにアクセスしてみます。

拒否されている!(2回目)

再度adminさんの作業

先ほどのポリシーではOUに属する両方のアカウントに適用されたことが確認できました。それでは条件を追加し、Bさんだけ制限されるようにしてみましょう(111111111111はAさんのアカウントID、222222222222はBさんのアカウントIDです)。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Deny",
			"Action": [
				"*"
			],
			"Resource": [
				"*"
			],
			"Condition": {
				"StringEquals": {
					"aws:PrincipalAccount": "222222222222"
				}
			}
		}
	]
}

または次のように、 Aさん以外 という指定でも今回は大丈夫です。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Deny",
			"Action": [
				"*"
			],
			"Resource": [
				"*"
			],
			"Condition": {
				"StringNotEquals": {
					"aws:PrincipalAccount": "111111111111"
				}
			}
		}
	]
}

Aさんの画面で確認

再びAさんのマネジメントコンソールにアクセスしてみましょう。

今度は制限されていない!

Bさんの画面で確認

再び同じようにBさんのマネジメントコンソールにアクセスしてみます。

こちらは制限されているよ!

まとめ

SCPの定義でアカウントを絞ることはできないと思っていましたが実はできるようです。ただ乱用しすぎると複雑になってしまうため、できるだけシンプルな設計を心がけたいですね。