【CloudTrail解説編】VPC操作ってどんなログ出るの？

## はじめに
皆様、CloudTrailをうまく活用出来てますか？
シリーズ化しようと思っている**CloudTrail解説編**の第二弾になります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/d1dbafcb-c09c-4dc5-a717-54b119a31782.png)


「CloudTrailを活用しようと思っているけど、具体的にどう見れば良いのか分からない」
という相談をよくいただきます。

ご要望にお応えできるナレッジ共有が続けられれば良いなと思っています。
以下は第一弾の記事になります。

**【参考】**
・ [【CloudTrail解説編】AWSマネージメントコンソールのログイン監視][00]

## 今回実施したこと
今回は、マネージメントコンソールでの**VPCに関する操作**に特化した内容になっています。
よく利用する下記のサービスを中心に解説したいと思います。

- VPC
- サブネット
- ルートテーブル
- インターネットゲートウェイ (以下、IGW)
- Elastic IP
- NATゲートウェイ (以下、NATGW)
- ピアリング接続
- ネットワークACL
- セキュリティグループ

## テストシナリオ
具体的には以下の32個のシナリオで動作テストしてみました。

| # | サービス名 | 分類 | テストシナリオ | eventName (=API名) |
|---|--------|-----|--------|-----------|
| 01 | VPC | 作成 | VPCを新規作成する | [CreateVpc][01] |
| 02 | VPC | 変更 | VPCに新しいCIDRを追加する | [AssociateVpcCidrBlock][02] |
| 03 | VPC | 削除 | VPCを削除する | [DeleteVpc][03] |
| 04 | サブネット | 作成 | VPCにサブネットを新規作成する | [CreateSubnet][04] |
| 05 | サブネット | 変更 | 「自動割り当てIP設定の変更」をオンにする | [ModifySubnetAttribute][05] |
| 06 | サブネット | 削除 | VPCからサブネットを削除する | [DeleteSubnet][06] |
| 07 | ルートテーブル | 作成 | VPCにルートテーブルを新規作成する | [CreateRouteTable][07] |
| 08 | ルートテーブル | 変更 | デフォルトルート(0.0.0.0/0 via IGW)を追加する | [CreateRoute][08] |
| 09 | ルートテーブル | 変更 | デフォルトルート(0.0.0.0/0 via NATGW)を変更する | [ReplaceRoute][09] |
| 10 | ルートテーブル | 変更 | デフォルトルート(0.0.0.0/0 viq NATGW)を削除する | [DeleteRoute][10] |
| 11 | ルートテーブル | 削除 | ルートテーブルを削除する | [DeleteRouteTable][11] |
| 12 | IGW | 作成 | IGWを新規作成する | [CreateInternetGateway][12] |
| 13 | IGW | 変更 | VPCにIGWをアタッチする | [AttachInternetGateway][13] |
| 14 | IGW | 削除 | VPCからIGWをデタッチする | [DetachInternetGateway][14] |
| 15 | IGW | 削除 | IGWを削除する | [DeleteInternetGateway][15] |
| 16 | Elastic IP | 作成 | Elastic IPを割り当てる | [AllocateAddress][16] |
| 17 | Elastic IP | 変更 | EC2にElastic IPを関連付ける | [AssociateAddress][17] |
| 18 | Elastic IP | 変更 | EC2からElastic IPの関連付けを解除する | [DisassociateAddress][18] |
| 19 | Elastic IP | 削除 | Elastic IPを解放する | [ReleaseAddress][19] |
| 20 | NATGW | 作成 | NATGWを新規作成する | [CreateNatGateway][20] |
| 21 | NATGW | 削除 | NATGWを削除する | [DeleteNatGateway][21] |
| 22 | ピアリング接続 | 作成 | VPCにピアリング接続を作成する | [CreateVpcPeeringConnection][22] |
| 23 | ピアリング接続 | 削除 | ピアリング接続を削除する | [DeleteVpcPeeringConnection][23] |
| 24 | ネットワークACL | 作成 | VPCにネットワークACLを作成する | [CreateNetworkAcl][24] |
| 25 | ネットワークACL | 変更 | ネットワークACLのアウトバウンドルールを追加する | [CreateNetworkAclEntry][25] |
| 26 | ネットワークACL | 変更 | ネットワークACLをサブネットに割り当てる | [ReplaceNetworkAclAssociation][26] |
| 27 | ネットワークACL | 変更 | ネットワークACLのアウトバウンドルールを削除する | [DeleteNetworkAclEntry][27] |
| 28 | ネットワークACL | 削除 | ネットワークACLを削除する | [DeleteNetworkAcl][28] |
| 29 | セキュリティグループ | 作成 | VPCにセキュリティグループを作成する | [CreateSecurityGroup][29] |
| 30 | セキュリティグループ | 変更 | インバウンドルールに許可ルールを追加する | [AuthorizeSecurityGroupIngress][30] |
| 31 | セキュリティグループ | 変更 | EC2にセキュリティグループを割り当てる | [ModifyNetworkInterfaceAttribute][31] |
| 32 | セキュリティグループ | 削除 | セキュリティグループを削除する | [DeleteSecurityGroup][32] |

## eventNameとは
イベントの内容である**API名**が記録されるCloudTrail証跡ログのフィールドの1つです。
マネージメントコンソールで操作する際、URLにパラメータとしてAPI名が埋め込まれています。
`https://us-east-2.console.aws.amazon.com/vpc/home?region=us-east-2#CreateVpc:`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/4fb2f586-f9e7-d2af-c084-a4d1c86f03a9.png)

CloudTrailは、AWS内の各サービスを操作したAPIコールログを記録するサービスになります。
**eventName**を理解することで、AWSで何が起きているか理解できると言っても過言ではありません。

## 共通するフィールド
以下、CloudTrail証跡ログのサンプルになります。形式はJSONになります。
`requestParameters`と`responseElements`以外のフィールドはどのイベントにも存在します。

```json:共通するフィールド
{
    "eventVersion": "<ログイベント形式のバージョン>",
    "userIdentity": {
        "type": "<イベントの種類>",
        "principalId": "<呼び出しを行ったエンティティの一意の識別子>",
        "arn": "<操作したIAMユーザのARN>",
        "accountId": "<AWSアカウント(12桁)>",
        "accessKeyId": "<AWSアクセスキー>",
        "userName": "<操作したIAMユーザ名>",
        "sessionContext": {
            "sessionIssuer": {"<認証情報がどのように取得されたかに関する情報>"},
            "webIdFederationData": {"<IDプロバイダーに関する情報>"},
            "attributes": {
                "mfaAuthenticated": "<MFAデバイスによる認証有無(true/false)>",
                "creationDate": "<一時的セキュリティ認証情報が発行された時刻(ISO8601形式)>"
            }
        }
    },
    "eventTime": "<イベント発生時刻(ISO8601形式)>",
    "eventSource": "<リクエストが行われたAWSサービス>",
    "eventName": "<イベント名(=API名)>",
    "awsRegion": "<ログインしたAWSリージョン>",
    "sourceIPAddress": "<送信元IPアドレス>",
    "userAgent": "<接続元のユーザーエージェント(マネージメントコンソールだとconsole.ec2.amazonaws.comになる)",
    "requestParameters": {
        "<リクエストとともに送信されたパラメータ(後述しますが、APIに応じて内容が異なる)>"
    },
    "responseElements": {
        "<変更を行うアクションのレスポンスの要素(後述しますが、APIに応じて内容が異なる)>"
    },
    "requestID": "<リクエストを識別するID>",
    "eventID": "<CloudTrail証跡ログの中で一意となるイベントID>",
    "readOnly": <読み取り専用の操作であるかどうか(falseになる)>,
    "eventType": "<イベントレコードを生成したイベントのタイプ(AwsApiCallになる)>",
    "managementEvent": <管理用イベントかどうか(trueになる)>,
    "eventCategory": "<イベントのカテゴリ(Managementになる)>",
    "recipientAccountId": "<イベントを受信したAWSアカウント(12桁)>"
}
```

**【参考】**
・ [CloudTrail レコードの内容][33]
・ [CloudTrail userIdentity要素][34]

## 各イベントごとのログ内容と見張るポイント
ここからは、シナリオごとに出力された証跡ログの中でも
個々に異なる`requestParameters`と`responseElements`に絞って解説します。

### 1. CreateVpc
`test_vpc`という名前のVPCを新規作成した時に出力されたログになります。
CIDRはIPv4の`10.1.0.0/16`のみのデフォルトテナンシーです。

```json:CreateVpc
    "requestParameters": {
        "cidrBlock": "10.1.0.0/16",
        "instanceTenancy": "default",
        "amazonProvidedIpv6CidrBlock": false,
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "vpc",
                    "tags": [
                        {
                            "key": "Name",
                            "value": "test_vpc"
                        }
                    ]
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "7ef273c6-a35e-4b94-b3d9-4aa7e68839b4",
        "vpc": {
            "vpcId": "vpc-0cadedb1948e67f9d",
            "state": "pending",
            "ownerId": "123456789012",
            "cidrBlock": "10.1.0.0/16",
            "cidrBlockAssociationSet": {
                "items": [
                    {
                        "cidrBlock": "10.1.0.0/16",
                        "associationId": "vpc-cidr-assoc-04636d42262eb0800",
                        "cidrBlockState": {
                            "state": "associated"
                        }
                    }
                ]
            },
            "ipv6CidrBlockAssociationSet": {},
            "dhcpOptionsId": "dopt-f9138391",
            "instanceTenancy": "default",
            "tagSet": {
                "items": [
                    {
                        "key": "Name",
                        "value": "test_vpc"
                    }
                ]
            },
            "isDefault": false
        }
    }
```

### 2. AssociateVpcCidrBlock
1.で作成した`test_vpc`に対して
新しいCIDR`10.2.0.0/16`を追加した時に出力されたログになります。

```json:AssociateVpcCidrBlock
    "requestParameters": {
        "AssociateVpcCidrBlockRequest": {
            "VpcId": "vpc-0cadedb1948e67f9d",
            "CidrBlock": "10.2.0.0/16"
        }
    },
    "responseElements": {
        "AssociateVpcCidrBlockResponse": {
            "xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/",
            "cidrBlockAssociation": {
                "cidrBlock": "10.2.0.0/16",
                "cidrBlockState": {
                    "state": "associating"
                },
                "associationId": "vpc-cidr-assoc-09af3e1641bb40a37"
            },
            "requestId": "c0616704-7bbe-46a4-86d3-7257a5a70512",
            "vpcId": "vpc-0cadedb1948e67f9d"
        }
    }
```

### 3. DeleteVpc
1.で作成した`test_vpc`を削除した時に出力されたログになります。

```json:DeleteVpc
    "requestParameters": {
        "vpcId": "vpc-0cadedb1948e67f9d"
    },
    "responseElements": {
        "requestId": "05855acc-fcbf-4b1f-b5be-cac7e9cef331",
        "_return": true
    }
```

### 4. CreateSubnet
1.で作成したVPCに`test_sub`というサブネットを新規作成した時に出力されたログになります。
AZ名は`us-east-2a`、AZIDは`use2-az1`に作成されていますね。

```json:CreateSubnet
    "requestParameters": {
        "vpcId": "vpc-0cadedb1948e67f9d",
        "cidrBlock": "10.1.1.0/24",
        "availabilityZoneId": "use2-az1",
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "subnet",
                    "tags": [
                        {
                            "key": "Name",
                            "value": "test_sub"
                        }
                    ]
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "bc989990-24e8-40d2-b805-239ead83b9d8",
        "subnet": {
            "subnetId": "subnet-09e76b27bf9f41841",
            "subnetArn": "arn:aws:ec2:us-east-2:123456789012:subnet/subnet-09e76b27bf9f41841",
            "state": "available",
            "vpcId": "vpc-0cadedb1948e67f9d",
            "cidrBlock": "10.1.1.0/24",
            "ipv6CidrBlockAssociationSet": {},
            "availableIpAddressCount": 251,
            "availabilityZone": "us-east-2a",
            "availabilityZoneId": "use2-az1",
            "ownerId": "123456789012",
            "defaultForAz": false,
            "mapPublicIpOnLaunch": false,
            "assignIpv6AddressOnCreation": false,
            "tagSet": {
                "items": [
                    {
                        "key": "Name",
                        "value": "test_sub"
                    }
                ]
            }
        }
    }
```

### 5. ModifySubnetAttribute
4.で作成した`test_sub`の`自動割り当てIP設定の変更`をオンにした時に出力されたログになります。
`mapPublicIpOnLaunch`の値が`true`にセットされていますね。

```json:ModifySubnetAttribute
    "requestParameters": {
        "subnetId": "subnet-09e76b27bf9f41841",
        "mapPublicIpOnLaunch": {
            "value": true
        }
    },
    "responseElements": {
        "requestId": "a3e37d56-eb0e-4d5f-a2bc-b3763e1784fb",
        "_return": true
    }
```

### 6. DeleteSubnet
4.で作成した`test_sub`のサブネットを削除した時に出力されたログになります。

```json:DeleteSubnet
    "requestParameters": {
        "subnetId": "subnet-09e76b27bf9f41841"
    },
    "responseElements": {
        "requestId": "23915c2c-8632-44ae-b355-bc23d229f404",
        "_return": true
    }
```

### 7. CreateRouteTable
1.で作成したVPCにルートテーブルを新規作成した時に出力されたログになります。
VPCに含まれる2つのCIDRに対して、ローカルでルーティングする経路がアサインされてますね。

```json:CreateRouteTable
    "requestParameters": {
        "vpcId": "vpc-0cadedb1948e67f9d"
    },
    "responseElements": {
        "requestId": "173e741e-9853-4528-8a5d-18e9eb89e0d2",
        "routeTable": {
            "routeTableId": "rtb-0ae9547160a79eed8",
            "vpcId": "vpc-0cadedb1948e67f9d",
            "ownerId": "123456789012",
            "routeSet": {
                "items": [
                    {
                        "destinationCidrBlock": "10.1.0.0/16",
                        "gatewayId": "local",
                        "state": "active",
                        "origin": "CreateRouteTable"
                    },
                    {
                        "destinationCidrBlock": "10.2.0.0/16",
                        "gatewayId": "local",
                        "state": "active",
                        "origin": "CreateRouteTable"
                    }
                ]
            },
            "associationSet": {},
            "propagatingVgwSet": {},
            "tagSet": {}
        }
    }
```

### 8. CreateRoute
7.で作成したルートテーブルに新規ルートとして
12.で作成したIGWをターゲットにデフォルトルートを追加した時に出力されたログになります。

```json:CreateRoute
    "requestParameters": {
        "routeTableId": "rtb-0ae9547160a79eed8",
        "destinationCidrBlock": "0.0.0.0/0",
        "gatewayId": "igw-00ec58b652195d8a3"
    },
    "responseElements": {
        "requestId": "edea8f3d-f3e6-484b-8d76-54114368b0f5",
        "_return": true
    }
```

**【補足】**
AWSマネージメントコンソールに不正ログインされるような攻撃を受けた場合
許可していない宛先へのルートが作られていないか見張る上で活用することができます。

### 9. ReplaceRoute
8.で作成したデフォルトルートのターゲットについて
20.で作成したNATゲートウェイに変更した時に出力されたログになります。

```json:ReplaceRoute
    "requestParameters": {
        "routeTableId": "rtb-0ae9547160a79eed8",
        "destinationCidrBlock": "0.0.0.0/0",
        "natGatewayId": "nat-02d3aba70e2c742c2"
    },
    "responseElements": {
        "requestId": "73ad380d-00b7-4657-a230-574cf06276ad",
        "_return": true
    }
```

### 10. DeleteRoute
8.で作成したルート(デフォルトルート)を削除した時に出力されたログになります。

```json:DeleteRoute
    "requestParameters": {
        "routeTableId": "rtb-0ae9547160a79eed8",
        "destinationCidrBlock": "0.0.0.0/0"
    },
    "responseElements": {
        "requestId": "f649ab57-92cb-46a2-852b-7a2a6870d4ae",
        "_return": true
    }
```

### 11. DeleteRouteTable
7.で作成したルートテーブルを削除した時に出力されたログになります。

```json:DeleteRouteTable
    "requestParameters": {
        "routeTableId": "rtb-0ae9547160a79eed8"
    },
    "responseElements": {
        "requestId": "74a18b25-7036-4d3d-a424-30a5bfe98146",
        "_return": true
    }
```

### 12. CreateInternetGateway
`test_igw`という名前のIGWを新規作成した時に出力されたログになります。

```json:CreateInternetGateway
    "requestParameters": {
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "internet-gateway",
                    "tags": [
                        {
                            "key": "Name",
                            "value": "test_igw"
                        }
                    ]
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "1b245752-d0b1-4073-b3b3-01c46c3a1584",
        "internetGateway": {
            "internetGatewayId": "igw-00ec58b652195d8a3",
            "ownerId": "123456789012",
            "attachmentSet": {},
            "tagSet": {
                "items": [
                    {
                        "key": "Name",
                        "value": "test_igw"
                    }
                ]
            },
            "association": {}
        }
    }
```

### 13. AttachInternetGateway
12.で作成したIGWを1.で作成したVPCにアタッチした時に出力されたログになります。

```json:AttachInternetGateway
    "requestParameters": {
        "internetGatewayId": "igw-00ec58b652195d8a3",
        "vpcId": "vpc-0cadedb1948e67f9d"
    },
    "responseElements": {
        "requestId": "be367983-bbdb-4348-a5a7-b0e718acfa0a",
        "_return": true
    }
```

**【補足】**
AWSマネージメントコンソールに不正ログインされるような攻撃を受けた場合
インターネットとの経路を勝手に作られていないか見張る上で活用することができます。

### 14. DetachInternetGateway
13.でVPCにアタッチしたIGWをでアタッチした時に出力されたログになります。

```json:DetachInternetGateway
    "requestParameters": {
        "internetGatewayId": "igw-00ec58b652195d8a3",
        "vpcId": "vpc-0cadedb1948e67f9d"
    },
    "responseElements": {
        "requestId": "ec125fa8-3641-432e-b2ed-52d2170fe6ef",
        "_return": true
    }
```

### 15. DeleteInternetGateway
12.で作成したIGWを削除した時に出力されたログになります。

```json:DeleteInternetGateway
    "requestParameters": {
        "internetGatewayId": "igw-00ec58b652195d8a3"
    },
    "responseElements": {
        "requestId": "3efbdbb4-306b-4ed8-8c99-6e4c0513e873",
        "_return": true
    }
```
### 16. AllocateAddress
Elastic IPを`test_eip`という名前で新規作成した時に出力されたログになります。
オハイオリージョン`us-east-2`で利用できるIPアドレス`3.141.213.252`が割り当てられました。

```json:AllocateAddress
    "requestParameters": {
        "domain": "vpc",
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "elastic-ip",
                    "tags": [
                        {
                            "key": "Name",
                            "value": "test_eip"
                        }
                    ]
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "58a30bb4-5e25-4688-ad48-84c698186027",
        "publicIp": "3.141.213.252",
        "domain": "vpc",
        "allocationId": "eipalloc-019faf9a13318ac20",
        "publicIpv4Pool": "amazon",
        "networkBorderGroup": "us-east-2"
    }
```

### 17. AssociateAddress
16.で割り当てられたElastic IPをEC2インスタンスに関連付けした時に出力されたログになります。
該当のEC2のインスタンスIDは`i-0b82f7b0f0c2e3c0e`ですね。

```json:AssociateAddress
    "requestParameters": {
        "instanceId": "i-0b82f7b0f0c2e3c0e",
        "allocationId": "eipalloc-019faf9a13318ac20",
        "allowReassociation": false
    },
    "responseElements": {
        "requestId": "68d66732-c49d-4dda-99fc-7cc298d3e5c9",
        "_return": true,
        "associationId": "eipassoc-0b3422d49dd4e34c5"
    }
```

**【補足】**
AWSマネージメントコンソールに不正ログインされるような攻撃を受けた場合
インターネットとの通信できないEC2にElastic IPが関連付けられていないか
見張る上で活用することができます。

### 18. DisassociateAddress
17.で関連付けたElastic IPを解除した時に出力されたログになります。

```json:DisassociateAddress
    "requestParameters": {
        "associationId": "eipassoc-0b3422d49dd4e34c5"
    },
    "responseElements": {
        "requestId": "a69caa2b-51ed-4d0c-85a8-e1d60c6c5b9a",
        "_return": true
    }
```

### 19. ReleaseAddress
16.で新規作成したElastic IPを解放した時に出力されたログになります。

```json:ReleaseAddress
    "requestParameters": {
        "allocationId": "eipalloc-019faf9a13318ac20"
    },
    "responseElements": {
        "requestId": "e45658a4-114f-4985-8d4b-39e4271e4d06",
        "_return": true
    }
```

### 20. CreateNatGateway
`test_natgw`という名前のNATGWを新規作成した時に出力されたログになります。
NATGWに関連付けしたElastic IPは16.で作成したIPアドレスになります。
NATGWは4.で作成したサブネット(`subnet-09e76b27bf9f41841`)に作成しています。

```json:CreateNatGateway
    "requestParameters": {
        "CreateNatGatewayRequest": {
            "AllocationId": "eipalloc-019faf9a13318ac20",
            "SubnetId": "subnet-09e76b27bf9f41841",
            "TagSpecification": {
                "ResourceType": "natgateway",
                "tag": 1,
                "Tag": {
                    "Value": "test_natgw",
                    "tag": 1,
                    "Key": "Name"
                }
            }
        }
    },
    "responseElements": {
        "CreateNatGatewayResponse": {
            "xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/",
            "natGateway": {
                "connectivityType": "public",
                "subnetId": "subnet-09e76b27bf9f41841",
                "tagSet": {
                    "item": {
                        "value": "test_natgw",
                        "key": "Name"
                    }
                },
                "natGatewayAddressSet": {
                    "item": {
                        "allocationId": "eipalloc-019faf9a13318ac20"
                    }
                },
                "createTime": "2021-03-31T23:22:22.000Z",
                "vpcId": "vpc-0cadedb1948e67f9d",
                "natGatewayId": "nat-02d3aba70e2c742c2",
                "state": "pending"
            },
            "requestId": "7e55bbce-e95a-4cb3-86da-3ead71285982"
        }
    }
```

### 21. DeleteNatGateway
20.で作成したNATGWを削除した時に出力されたログになります。

```json:DeleteNatGateway
    "requestParameters": {
        "DeleteNatGatewayRequest": {
            "NatGatewayId": "nat-02d3aba70e2c742c2"
        }
    },
    "responseElements": {
        "DeleteNatGatewayResponse": {
            "xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/",
            "requestId": "2ac357ab-14dd-4081-9cf5-ed9ea9f6c835",
            "natGatewayId": "nat-02d3aba70e2c742c2"
        }
    }
```

### 22. CreateVpcPeeringConnection
1.で作成したVPCにVPCピアリングを新規作成した時に出力されたログになります。
ピアリングのリクエストを承認した際にはCloudTrailの証跡ログは発見できませんでした。

```json:CreateVpcPeeringConnection
    "requestParameters": {
        "vpcId": "vpc-0cadedb1948e67f9d",
        "peerVpcId": "vpc-09be24b8533330c11"
    },
    "responseElements": {
        "requestId": "b7a8fa3f-3db2-4e35-bc6d-b15d97bb529c",
        "vpcPeeringConnection": {
            "vpcPeeringConnectionId": "pcx-0fa806d53eb4264f5",
            "requesterVpcInfo": {
                "ownerId": "123456789012",
                "vpcId": "vpc-0cadedb1948e67f9d",
                "cidrBlock": "10.1.0.0/16",
                "region": "us-east-2",
                "cidrBlockSet": {
                    "items": [
                        {
                            "cidrBlock": "10.1.0.0/16"
                        },
                        {
                            "cidrBlock": "10.2.0.0/16"
                        }
                    ]
                },
                "peeringOptions": {
                    "allowEgressFromLocalClassicLinkToRemoteVpc": false,
                    "allowEgressFromLocalVpcToRemoteClassicLink": false,
                    "allowDnsResolutionFromRemoteVpc": false
                }
            },
            "accepterVpcInfo": {
                "ownerId": "123456789012",
                "vpcId": "vpc-09be24b8533330c11",
                "region": "us-east-2"
            },
            "status": {
                "code": "initiating-request",
                "message": "Initiating Request to 123456789012"
            },
            "expirationTime": 1617838496000,
            "tagSet": {}
        }
    }
```

**【補足】**
AWSマネージメントコンソールに不正ログインされるような攻撃を受けた場合
攻撃者の用意したVPCとピアリングされてデータを盗まれないことを見張る上で
活用することができます。

### 23. DeleteVpcPeeringConnection
22.で作成したVPCピアリングを削除した時に出力されたログになります。

```json:DeleteVpcPeeringConnection
    "requestParameters": {
        "vpcPeeringConnectionId": "pcx-0fa806d53eb4264f5"
    },
    "responseElements": {
        "requestId": "50cdc2c4-890a-4896-92d4-9a0484758160",
        "_return": true
    }
```

### 24. CreateNetworkAcl
1.で作成したVPCにネットワークACL`test_nacl`を新規作成した時に出力されたログになります。

```json:CreateNetworkAcl
    "requestParameters": {
        "vpcId": "vpc-0cadedb1948e67f9d",
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "network-acl",
                    "tags": [
                        {
                            "key": "Name",
                            "value": "test_nacl"
                        }
                    ]
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "d3ba4ccd-e147-4136-b2e9-10df3b1174a6",
        "networkAcl": {
            "networkAclId": "acl-0ad5205baab7d5322",
            "vpcId": "vpc-0cadedb1948e67f9d",
            "ownerId": "123456789012",
            "isDefault": false,
            "entrySet": {
                "items": [
                    {
                        "ruleNumber": 32767,
                        "aclProtocol": "-1",
                        "ruleAction": "deny",
                        "cidrBlock": "0.0.0.0/0",
                        "egress": true,
                        "icmpTypeCode": {},
                        "portRange": {}
                    },
                    {
                        "ruleNumber": 32767,
                        "aclProtocol": "-1",
                        "ruleAction": "deny",
                        "cidrBlock": "0.0.0.0/0",
                        "egress": false,
                        "icmpTypeCode": {},
                        "portRange": {}
                    }
                ]
            },
            "associationSet": {},
            "tagSet": {
                "items": [
                    {
                        "key": "Name",
                        "value": "test_nacl"
                    }
                ]
            }
        }
    }
```

### 25. CreateNetworkAclEntry
24.で作成したネットワークACLのアウトバウンドルールに対して
全ての通信、全ての宛先に対する通信許可ルールを追加した時に出力されたログになります。

```json:CreateNetworkAclEntry
    "requestParameters": {
        "networkAclId": "acl-0ad5205baab7d5322",
        "ruleNumber": 1,
        "egress": true,
        "ruleAction": "allow",
        "icmpTypeCode": {},
        "portRange": {},
        "aclProtocol": "-1",
        "cidrBlock": "0.0.0.0/0"
    },
    "responseElements": {
        "requestId": "796c9f8b-e0ff-4c6f-bcc6-d2d511aa96f5",
        "_return": true
    }
```

### 26. ReplaceNetworkAclAssociation
24.で作成したネットワークACLを4.で作成したサブネットに関連付けた時に出力されたログになります。

```json:ReplaceNetworkAclAssociation
    "requestParameters": {
        "associationId": "aclassoc-53fcc036",
        "networkAclId": "acl-0ad5205baab7d5322"
    },
    "responseElements": {
        "requestId": "069245c7-26a2-483e-b420-75e0da5f354c",
        "newAssociationId": "aclassoc-009f98f53c372eba8"
    }
```

### 27. DeleteNetworkAclEntry
25.で追加したアウトバウンドルールを削除した時に出力されたログになります。

```json:DeleteNetworkAclEntry
    "requestParameters": {
        "networkAclId": "acl-0ad5205baab7d5322",
        "ruleNumber": 1,
        "egress": true
    },
    "responseElements": {
        "requestId": "02473d41-f3e7-420b-9dfb-19867529e033",
        "_return": true
    }
```

### 28. DeleteNetworkAcl
24.で作成したネットワークACLを削除した時に出力されたログになります。

```json:DeleteNetworkAcl
    "requestParameters": {
        "networkAclId": "acl-0ad5205baab7d5322"
    },
    "responseElements": {
        "requestId": "f8a56f1e-5bee-410c-a130-9b95ef0f76aa",
        "_return": true
    }
```

### 29. CreateSecurityGroup
1.で作成したVPCにセキュリティグループ`test_sg`を新規作成した時に出力されたログになります。

```json:CreateSecurityGroup
    "requestParameters": {
        "groupName": "test_sg",
        "groupDescription": "test",
        "vpcId": "vpc-0cadedb1948e67f9d",
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "security-group",
                    "tags": [
                        {
                            "key": "Name",
                            "value": "test_sg"
                        }
                    ]
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "73770429-2956-4bb3-b9a5-430deb5bf2ae",
        "_return": true,
        "groupId": "sg-07ead3b5afa105744",
        "tagSet": {
            "items": [
                {
                    "key": "Name",
                    "value": "test_sg"
                }
            ]
        }
    }
```

### 30. AuthorizeSecurityGroupIngress
29.で作成したセキュリティグループのインバウンドルールとして
10.1.0.0/16宛のICMP通信を追加した時に出力されたログになります。

```json:AuthorizeSecurityGroupIngress
    "requestParameters": {
        "groupId": "sg-07ead3b5afa105744",
        "ipPermissions": {
            "items": [
                {
                    "ipProtocol": "icmp",
                    "fromPort": -1,
                    "toPort": -1,
                    "groups": {},
                    "ipRanges": {
                        "items": [
                            {
                                "cidrIp": "10.1.0.0/16",
                                "description": "test"
                            }
                        ]
                    },
                    "ipv6Ranges": {},
                    "prefixListIds": {}
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "7ffc5e80-0e85-41cb-ac8b-d462bab14470",
        "_return": true
    }
```

**【補足】**
AWSマネージメントコンソールに不正ログインされるような攻撃を受けた場合
EC2で許可していない通信が勝手に追加されていないことを見張る上で活用することができます。

### 31. ModifyNetworkInterfaceAttribute
29.で作成したセキュリティグループをEC2に割り当てた時に出力されたログになります。
`eni-01078c68e9e75ad3d`はEC2のネットワークインターフェースIDですね。

```json:ModifyNetworkInterfaceAttribute
    "requestParameters": {
        "networkInterfaceId": "eni-01078c68e9e75ad3d",
        "groupSet": {
            "items": [
                {
                    "groupId": "sg-07ead3b5afa105744"
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "d6f30c00-b835-4749-bbd7-0f371828699b",
        "_return": true
    }
```

### 32. DeleteSecurityGroup
29.で作成したセキュリティグループを削除時に出力されたログになります。

```json:DeleteSecurityGroup
    "requestParameters": {
        "groupId": "sg-07ead3b5afa105744"
    },
    "responseElements": {
        "requestId": "60e1fb9e-5fcf-4c31-b098-2f9847f5b114",
        "_return": true
    }
```

## まとめ
さて、いかがでしたでしょうか？

ここまで細かくVPCに関するAPIコールログを見ることないんじゃない？って言われそうですよね。
はい、そうだと思います。ですが、どのような新たな攻撃が来るかわかりません。
ビジネスアプリケーションに必要な通信に対して、少しでも違和感がないかを見極めるには
必要になることもあります。

AWS Config Rules[^1]でも見張れるものもあります。
`restricted-ssh`や`eip-attached`、`ec2-security-group-attached-to-eni`
などを利用する感じですね。

しかしマネージドルールにない要件を検知したい場合は、カスタムルールを作成するか
CloudTrailを活用した検知ルールをCloudWatchで作成していくことになります。

いずれにしてもAPIコールログを理解できるに越したことはないと思います。
皆様にとっても役に立つナレッジになっていれば良いなと思う次第です^^

[^1]: [AWS Config マネージドルールのリスト][35]


[00]:https://qiita.com/hssh2_bin/items/b71da0455cf21e4c823d "【CloudTrail解説編】AWSマネージメントコンソールのログイン監視"
[01]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpc.html "CreateVpc"
[02]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateVpcCidrBlock.html "AssociateVpcCidrBlock"
[03]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpc.html "DeleteVpc"
[04]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSubnet.html "CreateSubnet"
[05]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySubnetAttribute.html "ModifySubnetAttribute"
[06]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSubnet.html "DeleteSubnet"
[07]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRouteTable.html "CreateRouteTable"
[08]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRoute.html "CreateRoute"
[09]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceRoute.html "ReplaceRoute"
[10]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRoute.html "DeleteRoute"
[11]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRouteTable.html "DeleteRouteTable"
[12]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateInternetGateway.html "CreateInternetGateway"
[13]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttachInternetGateway.html "AttachInternetGateway"
[14]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DetachInternetGateway.html "DetachInternetGateway"
[15]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteInternetGateway.html "DeleteInternetGateway"
[16]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateAddress.html "AllocateAddress"
[17]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateAddress.html "AssociateAddress"
[18]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateAddress.html "DisassociateAddress"
[19]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseAddress.html "ReleaseAddress"
[20]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNatGateway.html "CreateNatGateway"
[21]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNatGateway.html "DeleteNatGateway"
[22]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpcPeeringConnection.html "CreateVpcPeeringConnection"
[23]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpcPeeringConnection.html "DeleteVpcPeeringConnection"
[24]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkAcl.html "CreateNetworkAcl"
[25]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkAclEntry.html "CreateNetworkAclEntry"
[26]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceNetworkAclAssociation.html "ReplaceNetworkAclAssociation"
[27]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkAclEntry.html "DeleteNetworkAclEntry"
[28]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkAcl.html "DeleteNetworkAcl"
[29]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSecurityGroup.html "CreateSecurityGroup"
[30]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AuthorizeSecurityGroupIngress.html "AuthorizeSecurityGroupIngress"
[31]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyNetworkInterfaceAttribute.html "ModifyNetworkInterfaceAttribute"
[32]:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSecurityGroup.html "DeleteSecurityGroup"
[33]:https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html "CloudTrail レコードの内容"
[34]:https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html "CloudTrail userIdentity要素"
[35]:https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/managed-rules-by-aws-config.html "AWS Config マネージドルールのリスト"