NLB/GWLB/CLBの作成を禁止するIAMポリシーを作ってみた
こんにちは、つくぼし(tsukuboshi0755)です!
皆さんもご存じのElastic Load Balancing(以下ELB)ですが、ELBには現在ALB/NLB/GWLB/CLBの4種類が存在します。
この内、特定のアカウントでALBのみ作成を許可し、NLB/GWLB/CLBの作成を禁止したいという要望があり、対応するIAMポリシーを作ってみたので共有いたします!
結論
以下のIAMポリシーで実現可能です!
{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "elasticloadbalancing:CreateLoadBalancer", "NotResource": [ "arn:*:elasticloadbalancing:*:*:loadbalancer/app/*/*" ] } }
経緯
当初は以下のように、Resource
要素でarnを絞る事で、NLB/GWLB/CLBの作成を禁止しようと考えてました。
実際、NLB/GWLBだけであれば、以下のIAMポリシーでも作成を禁止する事が可能です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action":[ "elasticloadbalancing:CreateLoadBalancer" ], "Resource": [ "arn:*:elasticloadbalancing:*:*:loadbalancer/net/*/*", "arn:*:elasticloadbalancing:*:*:loadbalancer/gwy/*/*" } ] }
なお、ELBのロードバランサー別のarn形式は以下の通りです。
しかし、同じくResourceにて、CLBのarnをarn:aws:elasticloadbalancing:*:*:loadbalancer/*
という形式で絞ろうすると、ALB/NLB/GWLBのarnの形式と被ってしまいます。
そのため、Resource
要素にELBのarnを指定する形式では、ALBを作成許可したままCLBの作成を禁止する事が困難な事に気づき、何か別の方法はないか模索し始めました。
実現方法
私の調査だけでは実現方法が見当たらず、社内の方々にも質問させて頂いた所、以下のようにNotResource
要素を使用する方法を教えて頂きました。
{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "elasticloadbalancing:CreateLoadBalancer", "NotResource": [ "arn:*:elasticloadbalancing:*:*:loadbalancer/app/*/*" ] } }
IAMポリシーでは、以下の通りResource
要素の代わりとして、NotResource
要素を指定可能です。
こちらのNotResource
にALBのarnを指定する事で、「原則ELBの作成を禁止するが、例外としてALBのみ作成を許可する」というポリシーを作る事ができます!
また今後ELBのアップデートで新たな種類のロードバランサーが追加されたとしても、ポリシーの修正なく新規追加されたロードバランサーも作成が禁止されます。
ただしDeny
→NotResource
と二重否定のような形となっているため、Resource
要素を用いる場合と比較して可読性が落ちるのは否めません。
NotResource
要素を用いる場合は、対象のIAMポリシーの運用に注意しましょう。
IAMポリシーのテスト
実際にALBのみは作成可能なまま、NLB/GWLB/CLBは作成禁止になっているかテストしてみます。
今回以下のように、新規作成したcm-tsukuboshi-only-alb-policy
と、既存のAdministratorAccess
を付与したロールを用いて、ELBの作成を実施してみます。
なお、IAMポリシーでは原則DenyがAllowよりも優先されるため、AdministratorAccess
に上書きされる事はなく、cm-tsukuboshi-only-alb-policy
は動作します。
では実際に、以下の通りALBの作成画面で、ロードバランサーが作成されるか確認してみます。
作成ボタンを押すと、ALBが正常に作成された事が分かります。
次にNLBの作成画面で、ロードバランサーが作成されるか確認してみます。
作成ボタンを押すと、「IAMポリシーで明確に拒否されているarnを持つリソースであるため、ロードバランサーを作成できません」というようなエラーが出てしまい、NLBは作成されませんでした。
GWLB/CLBについても、作成ボタンを押すと同様のエラーが発生し、該当のロードバランサーは作成されません。
以上の通り、 cm-tsukuboshi-only-alb-policy
を用いる事で、NLB/GWLB/CLBの作成を禁止する事ができました!
最後に
今回はELBの内、ALB以外のロードバランサーの作成を禁止してみました。
IAMポリシーにおけるNotResource
要素は初耳だったので、個人的にも勉強になりました。
この記事が皆さんのお役に立てれば嬉しいです!
以上、つくぼしでした!