AWS Organizationsの宣言型ポリシー(Declarative Policies)の管理を他のアカウントに委任してみた
お疲れさまです。とーちです。
今回は、AWS Organizationsの宣言型ポリシー(Declarative Policies)の管理を他のアカウントに委任する方法について解説したいと思います。
宣言型ポリシーとは
2024年のre:Invent前後のアップデートにより、AWS Organizations環境で宣言型ポリシー(Declarative Policies)というものが新たに使えるようになりました。この機能を使うと、例えば許可されたAmazon Machine Image (AMI)のみを使用するようOrganizations配下のアカウントに強制することができるなど、なかなか便利な機能です。
詳しくは以下の記事をご参照ください。
さて、この宣言型ポリシーの作成や更新を管理アカウント以外に委任できるのかな?というのが気になったので、実際に試してみました。結果として、委任することが可能だったので本記事ではその方法を紹介しようと思います。
ポリシーの委任について
調べるまで知らなかったのですが、SCP等のポリシーの有効化やポリシー自体の作成・修正等のアクションは他のアカウントに委任することが可能になっています。
これは管理アカウントにて、委任ポリシーというものを作成することで可能となっています。委任ポリシーにはどのアカウントに対して、どのアクションを委任するかをIAMポリシーと同様の形式で記載する形になります。
なお、委任できるアクションの一覧は以下に記載されています。
委任できるアクションの中に、"organizations:CreatePolicy"
や"organizations:DescribePolicy"
、"organizations:UpdatePolicy"
などのポリシー関連のアクションがあるので、これを委任ポリシーとして記載すれば、他アカウントに委任できるというわけです。
また、ポリシーの中でも、宣言型ポリシーだけを委任したいというケースにも対応できます。
委任ポリシーにはどのアクションを委任するかを書くのですが、このアクションにはIAMポリシーと同様にCondition
を指定することで特定の条件でのみ許可をするといったことができます。
このCondition
としてOrganizationsのポリシー関連のAPI操作をするときに特定のポリシータイプのみとするという条件があるので、こちらを使用すれば、宣言型ポリシーだけを委任するといったことも可能です。
Conditionとして指定できるポリシーは公式ドキュメントに記載があります。
また、ポリシーの書き方の例は以下公式ドキュメントにも記載があるのでこちらも参考にして頂ければと思います。
実際に委任設定をしてみる
というわけで、宣言型ポリシーの作成・更新・削除・OU等へのアタッチを他のアカウントに委任してみます。
管理アカウントでの作業
まずAWS Organizationsの設定を開きます。
続いてAWS Organizationsのインストールされた管理者という項目にある委任
ボタンを押します。
委任ポリシー入力画面が出るので以下のポリシーを記載します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegatingNecessaryDescribeListActions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::委任アカウントID:root"
},
"Action": [
"organizations:DescribeOrganization",
"organizations:DescribeOrganizationalUnit",
"organizations:DescribeAccount",
"organizations:ListRoots",
"organizations:ListOrganizationalUnitsForParent",
"organizations:ListParents",
"organizations:ListChildren",
"organizations:ListAccounts",
"organizations:ListAccountsForParent",
"organizations:ListTagsForResource"
],
"Resource": "*"
},
{
"Sid": "ReadAndUpdatePolicy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::委任アカウントID:root"
},
"Action": [
"organizations:DescribeEffectivePolicy",
"organizations:DescribePolicy",
"organizations:ListPolicies",
"organizations:ListPoliciesForTarget",
"organizations:ListTargetsForPolicy",
"organizations:CreatePolicy",
"organizations:UpdatePolicy",
"organizations:DeletePolicy",
"organizations:AttachPolicy"
],
"Resource": "*",
"Condition": {
"StringLikeIfExists": {
"organizations:PolicyType": "DECLARATIVE_POLICY_EC2"
}
}
}
]
}
このポリシーでは、委任アカウントID
の部分に実際に委任したいアカウントのIDを入れてください。
このポリシーは大きく2つのStatementから構成されています:
- 最初のStatementでは、Organizations内の構造(OU、アカウント等)を参照するための読み取り権限を付与しています。
- 2つ目のStatementでは、ポリシーの作成・更新・削除・アタッチなどの操作権限を付与していますが、
Condition
でDECLARATIVE_POLICY_EC2
タイプのポリシーのみに制限しています。
これだけで設定としてはOKです。あとは宣言型ポリシーが有効化されていれば、委任先アカウントで宣言型ポリシーの作成とアタッチができるはずなのでやってみます。
委任アカウントでの作業
それでは委任先アカウントで宣言型ポリシーの作成とアタッチをやってみます。
Organizationsの画面からポリシーを選び、EC2の宣言型ポリシー
を選択します。
ポリシーを作成を押します。
適当なポリシー名をつけたあと、画面下にいき、サービス属性から許可されている画像設定
を選択します。
画像設定のモードは今回は監査モードにしておきます。実際に行う場合もまず監査モードで許可されないAMIを確認してからのほうが良いと思います。また許可されるAMIの基準としてAmazonが提供するもののみを今回は許可します。
この状態でポリシーを作成するとちゃんと委任アカウントでもポリシーを作成することができました。
続いて、このポリシーを組織全体にアタッチします。
アタッチも問題なくできましたね。
まとめ
今回は、AWS Organizationsの宣言型ポリシーの管理を他のアカウントに委任する方法を紹介しました。
管理アカウントはSCPが効かないなど、Organizations全体の中でも特殊なアカウントになるので、このアカウントでの作業は極力減らすのがベストプラクティスです。委任ポリシーなども活用して、あまり管理アカウントに触らない状況を作りたいですね。
この記事が参考になれば幸いです。
以上、とーちでした。