AWS OrganizationsのSCPとリソースタグを利用して削除保護機能をエミュレートしてみる

2019.09.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

複数のAWSアカウントをまとめて管理できるAWS Organizationsというサービスがあります。これにはSCP(サービスコントロールポリシー)という管理下のメンバーアカウントの権限を制御できる機能が備わっており、先日のアップデートでかなりできることが増えました。アップデート情報については次のエントリを参照してください。

AWS OrganizationsのSCPでresourceやconditionが指定できるようになりさらに便利になりました

今回は、このSCPとリソースタグを組み合わせることでEC2インスタンスにあるような削除保護機能が実現できないかな、ということで試してみました。

エミュレート可能な条件

今回の内容はどんなAWSリソースでも実現可能かというと、そんなことはありません。次の2つの条件を満たせるリソースのみが可能です。

  1. 対象リソースにタグが付けられる
  2. ポリシーのConditionに対象リソースのリソースタグを指定できる

特に2が重要で、リソースにタグは付けられるけどConditionで指定できないということがそれなりにありそうです。Conditionでの指定可否は各リソースによって異なります。また、リソースタグの条件指定方法はサービスによりかなりばらつきがあるため、最新のドキュメントで確認する必要があります。

Actions, Resources, and Condition Keys for AWS Services - AWS Identity and Access Management

今回のゴール

  1. IAMロールの削除を、対象リソースのタグがDeleteProtection=trueのとき拒否する
  2. true以外やタグがない場合は拒否しない
  3. DeleteProtectionタグ自体の削除操作はひとまずノータッチ

検証の前提

今回の検証内容を実際に行うためにはあらかじめ次の環境を用意する必要があります。

  1. AWS Organizationsが有効になっているマスターアカウント
  2. その組織に所属しているメンバーアカウント

また組織のルートには次のFullAWSAccessポリシーがアタッチされています。

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

やってみた

マスターアカウントでSCPを設定して対象アカウントにアタッチ

まずはマスターアカウントでマネジメントコンソールにアクセスします。AWS Organizationsのページにアクセスし、次のようなポリシーを作成します。

IAMRoleDeleteProtection

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Deny",
			"Action": [
				"iam:DeleteRole"
			],
			"Resource": [
				"*"
			],
			"Condition": {
				"StringEquals": {
					"iam:ResourceTag/DeleteProtection": [
						"true"
					]
				}
			}
		}
	]
}

次にこのポリシーをアタッチします。今回は検証用のメンバーアカウントに直接アタッチします。

メンバーアカウントでIAMロールを作成して削除できないことを確認

次にメンバーアカウントでマネジメントコンソールにアクセスします。IAMのページにアクセスしIAMロールを作成します。タグのキーと値のみが重要で、ほかは任意の値で問題ありません。

作成できました。

作ったばかりですが削除をしてみます。

狙いどおり削除できません!

タグの値を変更して削除できることを確認

DeleteProtectionの値をtrue以外の値に変更します。今回はfalseとします。

この状態で削除をしてみます。

消せました!(削除後のメッセージが出ないので伝わりにくいのですが・・)

まとめ

SCPとタグを組み合わせて何かできないかなという思い付きからやってみた検証でした。個人的な収穫としては「エミュレート可能な条件」でも書いたConditionの記述方法の理解が深まったことです。aws:ResourceTag/${tag-key}という条件キーも用意されており一部のサービスではこれを使うのですが、ドキュメントを見つけるまで使い分けなどが分からず結構時間を食ったところでした。

それでは、このエントリが誰かの役に立てば幸いです。