特定のサブネットにタグをつけることで、「指定したリソース以外を作成できないようにする」SCPを作成してみた

サブネットに作成するリソースを制御したい時に使えるSCPを作ってみたよ。
2024.01.30

はじめに

特定のサブネットに対してタグをつけることで、任意のリソースのみを作成させる SCP を作ってみました。

例えば、サブネットに"NAT":"Allow"というタグをつけた場合、NAT Gateway 以外はそのサブネットには作成できないようなポリシーですね。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowNatGwOnSubnet",
      "Effect": "Deny",
      "NotAction": [
        "ec2:CreateNatGateway",
        "ec2:DeleteNatGateway"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:subnet/*"
      ],
      "Condition": {
        "ForAnyValue:StringEqualsIfExists": {
          "aws:ResourceTag/NAT": "Allow"
        },
        "StringNotLike": {
          "aws:PrincipalARN": ["arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_AWSAdministratorAccess_*"]
        }
      }
    }
  ]
}

上記の例では、NAT Gateway の作成削除に絞っていますが、NotActionを変更することで他のリソースにも対応させることができます。

パブリックサブネットにはタグを付けるようにして、EC2 や RDS を作成させないようにするなどの使い方ができそうですね。

StringNotLikeで除外している IAM ロールは例なので、任意のものに置き換えてください。

やってみる

先ほどの NAT Gateway の例で他のリソースが作成できないか試してみます。

事前準備

事前に対象のアカウントに VPC やサブネットは作成しておき、タグは除外対象にした IAM ロールで"NAT":"Allow"を付与しています。

また Organization 管理アカウントで、SCP を作成して対象の OU・アカウントにアタッチします。

NAT Gateway作成

SCP がアタッチできたので実際に試してみましょう。この時作業するのは除外対象にした IAM ロール以外で行います。

今回は Administorator 権限を持った IAM ロールを使用しました。

事前準備でタグを付与したサブネットに NAT Gateway を作成してみましょう。

このまま作成すると、問題なく作成されました。削除も行ってみましたが問題なく操作可能でした。

他リソース作成

正常に NAT Gateway が作成できることが確認できたので、次に他のリソースを同じサブネットに作成してみます。

まずは EC2 からいってみましょう。作成してみるとインスタンスの起動に失敗しエラーメッセージが表示されました。

メッセージを確認するとwith an explicit deny in a service control policy.とあるため SCP による制御で作成できないことがわかります。

他のリソースとして NLB を作成してみます。

同じように SCP によって拒否されたことがわかりますね。

問題なくタグがついたサブネットには、NAT Gateway以外のリソースが作成できないことが確認できました。

余談ですが、最初に ALB を試したのですが SCP が効きませんでした。あくまで予想ですが、ALB作成時に選択したサブネットは実態の ENI が作成されるときIAMロールが直接作成しているわけではなく、AWS サービスからの作成になるためだと考えています。

そのため、ALBの作成を制御したい場合は別SCPで制御するようにお気をつけください。

タグの操作

タグが削除されると、この SCP による制御が効かないため確認します。"NAT":"Allow"のタグを削除して保存すると、想定通りエラーメッセージが表示されました。

タグの制御も問題なく行われているため、勝手に削除されることはなさそうです。

まとめ

特定のサブネットにタグをつけることで、「指定したリソース以外を作成できないようにする」SCP を作成してみました。

今回試した NAT 以外にもNotActionを変更することで対応できるので、環境に合わせてご利用ください。

ALB に対して制御したい場合は別の SCP で対応する必要があるので注意してください。

参考