CloudFormationGuardの使い方を調査してみた

## 概要  
Guard を使用した AWS Conﬁg Rules の作成方法を調査します。

## Guard を使用した AWS Conﬁg Rules 作成

### 目標
すべての IPv4  と IPv6 からのインバウンドアクセスを許可するセキュリティグループが存在しないか評価する AWS CloudFormation Guard を使用した AWS Conﬁg Rules の作成を行う。

### 事前準備
すべての IPv4  と IPv6 からのインバウンドアクセスを許可するセキュリティグループを作成します。
リスク回避のため EC2 等に関連付けずに本検証を行います。

- IPv4 SG (すべての IPv4 からのインバウンドアクセスを許可)
![75cac0f8-48a9-4df6-9fe5-0bd17d0a3449-1920x450r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1610187/d2029b03-cf04-8677-6c80-76efd46970ce.png)

- IPv6 SG (すべての IPv6 からのインバウンドアクセスを許可)
![0c1c3a23-efa7-4523-aa12-9826f56be926-1920x468r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1610187/95b9d8a3-3873-f612-e91c-755ca4f4f766.png)



### AWS Conﬁg Rules 作成
- Guardを使用してカスタムルールを作成を選択します
![16389556-3705-4181-bbe5-db5fc7572d0a-1920x612r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1610187/6f16696c-afdb-bea5-8fb0-f8ffe49a6b6f.png)

- ルールの内容部分に検証するポリシーを記述します
  今回は、セキュリティグループがすべての IPv4  または IPv6 からのインバウンドアクセスを許可するインバウンドルールを持つかを検証するポリシーです。
![7a3c9dd1-5b4f-4477-b7c1-fed5b2c6ca21-1920x686r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1610187/10df6194-a31f-7f16-a717-e67eb1a1066f.png)


2行目と8行目の条件式が True であれば準拠、False であれば非準拠です。
```guard  
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つのセキュリティグループが非準拠として検出されました。
![959b5432-356b-45d1-94b4-d6810aa8c92a-1920x350r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1610187/6e20e11c-31ba-fff1-10e6-5ff0eef19f5b.png)



## Guard の記法
前提の話ですが、元々 CloudFormation のテンプレートの検証を行うためのオープンソースのツールである AWS CloudFormation Guard が AWS Config Rules でも使えるようになった背景があります。
[AWS CloudFormation Guard を使用した AWS Conﬁg ルールの作成](https://aws.amazon.com/jp/about-aws/whats-new/2022/08/build-aws-config-rules-cloudformation-guard/)
そのため、記述方法は、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. 基本編\~](https://blog.serverworks.co.jp/2023/08/25/111531)
[AWS Config カスタムポリシールール（Guard） \~2. 応用編\~](https://blog.serverworks.co.jp/2023/08/25/111502)

AWS Config が収集した AWS リソースの設定項目（スキーマ）のサンプルを載せます。
Config のリソースインベントリを検索することで設定情報を確認できます。
![6417778b-0df3-4de7-ac5f-3aa03c6f8493-1920x451r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1610187/2db89f4b-8066-65a5-7e6a-e52bb7524f5b.png)


```
{
  "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 を使用してリソースが意図した設定になっているかを確認する際は、[マネージドルール](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/managed-rules-by-aws-config.html)の使用する方が良いと思います。マネージドルールでは、一般的なベストプラクティスへの準拠を確認することが出来ます。今回調査をした AWS CloudFormation Guard を使用した AWS Conﬁg Rukes 作成は、マネージドルールにない組織独自のポリシーを定義したい時に使える機能だと感じました。その他にカスタムで AWS Config Rules を定義する方法として AWS Lambda を使用する方法もあります。