NLB/GWLB/CLBの作成を禁止するIAMポリシーを作ってみた

2022.08.30

こんにちは、つくぼし(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のアップデートで新たな種類のロードバランサーが追加されたとしても、ポリシーの修正なく新規追加されたロードバランサーも作成が禁止されます。


ただしDenyNotResourceと二重否定のような形となっているため、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要素は初耳だったので、個人的にも勉強になりました。

この記事が皆さんのお役に立てれば嬉しいです!

以上、つくぼしでした!