Amazon VPCのサブネットマスクを確認するAWS Configカスタムルールを作成してみた

2023.02.08

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

Amazon VPC における IPv4 アドレスのサブネットマスクの設定がルール化されている環境を想定して、サブネットマスクをチェックする AWS Config カスタムルールを作成してみました。VPC とサブネットのサブネットマスクをチェックします。

Guard を使用した Config カスタムルールの基本的な内容については次のブログが参考になります。

やってみた

Guard を使用した AWS Config カスタムルールで次の内容をチェックしてみます。あまりない状況かもしれませんが、気になったのでサブネットのチェックも試してみます。

  • VPC
    • IPv4 のサブネットマスクが/16であること
    • IPv6 の割り当てがないこと
  • サブネット
    • IPv4 のサブネットマスクが/24であること
    • IPv6 の割り当てがないこと

VPC のチェック

1 つの例として、次の Guard ルールでサブネットマスクをチェックできました。

let ipv4_cidr_block = configuration.cidrBlock
let ipv4_cidr_block_association_set = configuration.cidrBlockAssociationSet[*]

rule ipv4_cidr_block_check {
    %ipv4_cidr_block == /.*\/16$/
}

rule ipv4_cidr_block_association_set_check {
    %ipv4_cidr_block_association_set.cidrBlock == /.*\/16$/
}

rule ipv6_check {
    configuration.ipv6CidrBlockAssociationSet empty
}

AWS Config の VPC に関する設定項目情報の例です。この例を基に説明します。

{
  "version": "1.3",
  "accountId": "111122223333",
  "configurationItemCaptureTime": "2023-02-07T14:30:33.414Z",
  "configurationItemStatus": "ResourceDiscovered",
  "configurationStateId": "1675780233414",
  "configurationItemMD5Hash": "",
  "arn": "arn:aws:ec2:ap-northeast-1:111122223333:vpc/vpc-01f98cdd13fbd0bbb",
  "resourceType": "AWS::EC2::VPC",
  "resourceId": "vpc-01f98cdd13fbd0bbb",
  "awsRegion": "ap-northeast-1",
  "availabilityZone": "Multiple Availability Zones",
  "tags": {
    "Name": "test-vpc4"
  },
  "relatedEvents": [],
  "relationships": [
    {
      "resourceType": "AWS::EC2::RouteTable",
      "resourceId": "rtb-07c4b5ae9bf5d9cdf",
      "relationshipName": "Contains RouteTable"
    },
    {
      "resourceType": "AWS::EC2::SecurityGroup",
      "resourceId": "sg-000d58bf3f5fc3602",
      "relationshipName": "Contains SecurityGroup"
    },
    {
      "resourceType": "AWS::EC2::NetworkAcl",
      "resourceId": "acl-090e327c43c3cfe49",
      "relationshipName": "Contains NetworkAcl"
    }
  ],
  "configuration": {
    "cidrBlock": "10.0.0.0/16",
    "dhcpOptionsId": "dopt-0c4b38e700e8e3095",
    "state": "available",
    "vpcId": "vpc-01f98cdd13fbd0bbb",
    "ownerId": "111122223333",
    "instanceTenancy": "default",
    "ipv6CidrBlockAssociationSet": [
      {
        "associationId": "vpc-cidr-assoc-071ed66290e11471e",
        "ipv6CidrBlock": "2001:db8:0:f100::/56",
        "ipv6CidrBlockState": {
          "state": "associated"
        },
        "networkBorderGroup": "ap-northeast-1",
        "ipv6Pool": "Amazon"
      }
    ],
    "cidrBlockAssociationSet": [
      {
        "associationId": "vpc-cidr-assoc-0c33b8c7fd51d76eb",
        "cidrBlock": "10.0.0.0/16",
        "cidrBlockState": {
          "state": "associated"
        }
      },
      {
        "associationId": "vpc-cidr-assoc-0c4cc25b51d7e6245",
        "cidrBlock": "10.1.0.0/16",
        "cidrBlockState": {
          "state": "associated"
        }
      },
      {
        "associationId": "vpc-cidr-assoc-04bd20dc158719d3e",
        "cidrBlock": "10.2.0.0/16",
        "cidrBlockState": {
          "state": "associated"
        }
      }
    ],
    "isDefault": false,
    "tags": [
      {
        "key": "Name",
        "value": "test-vpc4"
      }
    ]
  },
  "supplementaryConfiguration": {},
  "resourceTransitionStatus": "None"
}

上記の例では次の CIDR が含まれています。

  • VPC 作成時に指定した CIDR 10.0.0.0/16
  • 追加の IPv4 CIDR 10.1.0.0/16 10.2.0.0/16
  • 追加の IPv6 CIDR 2001:db8:0:f100::/56

VPC 作成時に設定した IPv4 アドレスの CIDR はcidrBlockcidrBlockAssociationSetの両方で記録されるようです。そのため、今回のサンプルコードでは両方をチェックしていますが、cidrBlockAssociationSetのチェックだけでも問題ないかもしれません。

また、IPv6 アドレスの CDIR が設定されている場合はipv6CidrBlockAssociationSetに記録されるようなので、今回のサンプルコードではipv6CidrBlockAssociationSetが empty (未設定) であることを確認しています。


AWS Config ルールを設定する際は、対象のリソースとしてAWS EC2 VPCを選択します。

テスト用 VPC を評価した結果です。

No. cidrBlock cidrBlockAssociationSet ipv6CidrBlockAssociationSet 結果
1 10.0.0.0/16 10.0.0.0/16 - 準拠
2 10.0.0.0/16 10.0.0.0/16 2001:db8:0:f100::/56 非準拠
3 10.0.0.0/16 10.0.0.0/16, 10.1.0.0/16, 10.2.0.0/16 - 準拠
4 10.0.0.0/16 10.0.0.0/16, 10.1.0.0/16, 10.2.0.0/16 2001:db8:0:f100::/56 非準拠
5 10.0.0.0/24 10.0.0.0/24 - 非準拠


サブネットのチェック

1 つの例として、次の Guard ルールでサブネットマスクをチェックできました。

let ipv4_cidr_block = configuration.cidrBlock

rule ipv4_cidr_block_check {
    %ipv4_cidr_block == /.*\/24$/
}

rule ipv6_check {
    configuration.ipv6CidrBlockAssociationSet empty
}

AWS Config のサブネットに関する設定項目情報の例です。この例を基に説明します。

{
  "version": "1.3",
  "accountId": "111122223333",
  "configurationItemCaptureTime": "2023-02-07T14:56:28.127Z",
  "configurationItemStatus": "OK",
  "configurationStateId": "1675781788127",
  "configurationItemMD5Hash": "",
  "arn": "arn:aws:ec2:ap-northeast-1:111122223333:subnet/subnet-096eb9fc90a4be53a",
  "resourceType": "AWS::EC2::Subnet",
  "resourceId": "subnet-096eb9fc90a4be53a",
  "awsRegion": "ap-northeast-1",
  "availabilityZone": "ap-northeast-1a",
  "tags": {
    "Name": "public-subnet"
  },
  "relatedEvents": [],
  "relationships": [
    {
      "resourceType": "AWS::EC2::VPC",
      "resourceId": "vpc-0aff88524d091194e",
      "relationshipName": "Is contained in Vpc"
    }
  ],
  "configuration": {
    "availabilityZone": "ap-northeast-1a",
    "availabilityZoneId": "apne1-az4",
    "availableIpAddressCount": 251,
    "cidrBlock": "10.0.0.0/24",
    "defaultForAz": false,
    "mapPublicIpOnLaunch": false,
    "mapCustomerOwnedIpOnLaunch": false,
    "state": "available",
    "subnetId": "subnet-096eb9fc90a4be53a",
    "vpcId": "vpc-0aff88524d091194e",
    "ownerId": "111122223333",
    "assignIpv6AddressOnCreation": false,
    "ipv6CidrBlockAssociationSet": [
      {
        "associationId": "subnet-cidr-assoc-099d7690accbb72f1",
        "ipv6CidrBlock": "2001:db8:0:f100::/64",
        "ipv6CidrBlockState": {
          "state": "associated"
        }
      }
    ],
    "tags": [
      {
        "key": "Name",
        "value": "public-subnet"
      }
    ],
    "subnetArn": "arn:aws:ec2:ap-northeast-1:111122223333:subnet/subnet-096eb9fc90a4be53a"
  },
  "supplementaryConfiguration": {},
  "resourceTransitionStatus": "None"
}

上記の例では次の CIDR が含まれています

  • IPv4 CIDR 10.0.0.0/24
  • IPv6 CIDR 2001:db8:0:f100::/64

サブネットの IPv4 アドレスの CIDR が記録されているcidrBlockをチェックしています。VPC とは異なり、IPv4 アドレスの CIDR は 1 つのみの設定となり、IPv6 アドレスの CIDR のみを設定することも可能です。

また、IPv6 アドレスの CDIR が設定されている場合はipv6CidrBlockAssociationSetに記録されるようなので、今回のサンプルコードでは VPC 同様にipv6CidrBlockAssociationSetが empty であることを確認しています。

AWS Config ルールを設定する際は、対象のリソースとしてAWS EC2 Subnetを選択します。

テスト用サブネットを評価した結果です。

No cidrBlock ipv6CidrBlockAssociationSet 結果
1 10.0.0.0/24 - 準拠
2 10.0.0.0/24 2001:db8:0:f100::/64 非準拠
3 10.0.128.0/17 - 非準拠
4 - 2001:db8:0:f101::/64 非準拠

おわりに

Amazon VPC における IPv4 アドレスのサブネットマスクの設定がルール化されている環境を想定して、サブネットマスクをチェックする AWS Config カスタムルールを作成してみました。

このブログがどなたかのご参考になれば幸いです。