Amazon VPC における IPv4 アドレスのサブネットマスクの設定がルール化されている環境を想定して、サブネットマスクをチェックする AWS Config カスタムルールを作成してみました。VPC とサブネットのサブネットマスクをチェックします。
Guard を使用した Config カスタムルールの基本的な内容については次のブログが参考になります。
やってみた
Guard を使用した AWS Config カスタムルールで次の内容をチェックしてみます。あまりない状況かもしれませんが、気になったのでサブネットのチェックも試してみます。
- VPC
- IPv4 のサブネットマスクが
/16
であること - IPv6 の割り当てがないこと
- IPv4 のサブネットマスクが
- サブネット
- IPv4 のサブネットマスクが
/24
であること - IPv6 の割り当てがないこと
- IPv4 のサブネットマスクが
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 はcidrBlock
とcidrBlockAssociationSet
の両方で記録されるようです。そのため、今回のサンプルコードでは両方をチェックしていますが、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 カスタムルールを作成してみました。
このブログがどなたかのご参考になれば幸いです。