概要
Guard を使用した AWS Config Rules の作成方法を調査します。
Guard を使用した AWS Config Rules 作成
目標
すべての IPv4 と IPv6 からのインバウンドアクセスを許可するセキュリティグループが存在しないか評価する AWS CloudFormation Guard を使用した AWS Config Rules の作成を行う。
事前準備
すべての IPv4 と IPv6 からのインバウンドアクセスを許可するセキュリティグループを作成します。
リスク回避のため EC2 等に関連付けずに本検証を行います。
AWS Config Rules 作成
-
ルールの内容部分に検証するポリシーを記述します
今回は、セキュリティグループがすべての IPv4 または IPv6 からのインバウンドアクセスを許可するインバウンドルールを持つかを検証するポリシーです。
2行目と8行目の条件式が True であれば準拠、False であれば非準拠です。
rule prevent_inbound_Ipv4_access_to_any_ip when this.configuration.ipPermissions[*].ipv4Ranges !empty {
this.configuration.ipPermissions[*].ipv4Ranges[*].cidrIp != "0.0.0.0/0" <<
IPv4 Source address cannot be 0.0.0.0/0
>>
}
rule prevent_inbound_Ipv6_access_to_any_ip when this.configuration.ipPermissions[*].ipv6Ranges !empty {
this.configuration.ipPermissions[*].ipv6Ranges[*].cidrIpv6 != "::/0" <<
IPv6 Source address cannot be ::/0
>>
}
動作確認
評価結果を確認すると以下の通りでした。
事前作成した 2つのセキュリティグループが非準拠として検出されました。
Guard の記法
前提の話ですが、元々 CloudFormation のテンプレートの検証を行うためのオープンソースのツールである AWS CloudFormation Guard が AWS Config Rules でも使えるようになった背景があります。
AWS CloudFormation Guard を使用した AWS Config ルールの作成
そのため、記述方法は、CloudFormation Guard に依存します。
https://github.com/aws-cloudformation/cloudformation-guard
https://docs.aws.amazon.com/cfn-guard/latest/ug/writing-rules.html
こちらの記事がとてもわかりやすいです。
AWS Config カスタムポリシールール(Guard) ~1. 基本編~
AWS Config カスタムポリシールール(Guard) ~2. 応用編~
AWS Config が収集した AWS リソースの設定項目(スキーマ)のサンプルを載せます。
Config のリソースインベントリを検索することで設定情報を確認できます。
{
"version": "1.3",
"accountId": "xxxxxxxxxxxx",
"configurationItemCaptureTime": "2024-09-04T02:23:09.715Z",
"configurationItemStatus": "OK",
"configurationStateId": "1725416589715",
"configurationItemMD5Hash": "",
"arn": "arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxx:security-group/sg-03967bc665e21060d",
"resourceType": "AWS::EC2::SecurityGroup",
"resourceId": "sg-03967bc665e21060d",
"resourceName": "IPv4 SG",
"awsRegion": "ap-northeast-1",
"availabilityZone": "Not Applicable",
"tags": {
"Name": "IPv4 SG"
},
"relatedEvents": [],
"relationships": [
{
"resourceType": "AWS::EC2::VPC",
"resourceId": "vpc-013554dfe32414657",
"relationshipName": "Is contained in Vpc"
}
],
"configuration": {
"description": "IPv4 SG",
"groupName": "IPv4 SG",
"ipPermissions": [
{
"fromPort": 80,
"ipProtocol": "tcp",
"ipv6Ranges": [],
"prefixListIds": [],
"toPort": 80,
"userIdGroupPairs": [],
"ipv4Ranges": [
{
"cidrIp": "0.0.0.0/0"
}
],
"ipRanges": [
"0.0.0.0/0"
]
}
],
"ownerId": "xxxxxxxxxxxx",
"groupId": "sg-03967bc665e21060d",
"ipPermissionsEgress": [
{
"ipProtocol": "-1",
"ipv6Ranges": [],
"prefixListIds": [],
"userIdGroupPairs": [],
"ipv4Ranges": [
{
"cidrIp": "0.0.0.0/0"
}
],
"ipRanges": [
"0.0.0.0/0"
]
}
],
"tags": [
{
"key": "Name",
"value": "IPv4 SG"
}
],
"vpcId": "vpc-013554dfe32414657"
},
"supplementaryConfiguration": {}
}
感想
AWS Config Rules を使用してリソースが意図した設定になっているかを確認する際は、マネージドルールの使用する方が良いと思います。マネージドルールでは、一般的なベストプラクティスへの準拠を確認することが出来ます。今回調査をした AWS CloudFormation Guard を使用した AWS Config Rukes 作成は、マネージドルールにない組織独自のポリシーを定義したい時に使える機能だと感じました。その他にカスタムで AWS Config Rules を定義する方法として AWS Lambda を使用する方法もあります。