[アップデート] AWS CloudTrail Lake が AWS Config の設定項目情報を取り込めるようになりました #reinvent

2022.11.29

AWS CloudTrail Lake が AWS Config の設定項目情報を取り込めるようになりました。 CloudTrail のログからは「いつ」「誰が」「どのリソースを」が分かり、Config のログからは「どのように変更したか」が分かります。今回のアップデートにより、これらを組み合わせた調査が実施しやすくなります。

AWS CloudTrail Lake now supports configuration items from AWS Config

昨日の発表と同時に AWS のブログでも紹介されています。

Announcing AWS CloudTrail Lake integration with AWS Config | AWS Cloud Operations & Migrations Blog


試してみた

AWS Config の設定項目情報を格納するイベントデータストアを新規に作成して利用するようです。早速、イベントデータストアを作成して検索を試してみました。

イベントデータストアの作成

早速、AWS Config 用のイベントデータストアを作成します。

イベントデータストア名と保存期間を入力します。

少し話が逸れますが、少し前のアップデートで AWS KMS キーによる暗号化が利用可能となっています。

AWS CloudTrail Lake now supports encryption using Customer Managed KMS Keys (CMK)

次の「イベントの選択」で「設定項目」を選択することで AWS Config の情報を取り込みます。

最後にレビューして作成すれば環境の構築完了です。簡単ですね。

作成後、1 分程度で有効状態になりました。

検索

事前準備としてログを残すために、Security Hub のセキュリティ基準「AWS 基礎セキュリティのベストプラクティス v1.0.0」を有効化している環境で、SSH を全開放しているセキュリティグループを作成します。

CloudTrail Lake においてセキュリティグループを作成した時間帯で検索してみます。クエリ結果は S3 に保管するようにしています。

実行クエリ

SELECT
    *
FROM
    1b07f9d9-f017-xxxx-xxxx-xxxxxexample
WHERE
    eventTime >= '2022-11-29 06:21:00' AND eventTime <= '2022-11-29 06:24:00'
ORDER BY
    eventTime ASC

クエリ実行結果画面

S3 に保管した検索結果の CSV ファイルの中身です。

# Execution Time: 2022-11-29T06:56:43.891250Z Query Statement: SELECT * FROM 1b07f9d9-f017-4b5b-94c3-662c79a52056 WHERE eventTime >= '2022-11-29 06:21:00' AND eventTime <= '2022-11-29 06:24:00' ORDER BY eventTime ASC
eventVersion,eventCategory,eventType,eventID,eventTime,awsRegion,recipientAccountId,addendum,metadata,eventData
1.08,ConfigurationItem,AwsConfigurationItem,e9172fc8-7b5c-4fed-aa16-65af3d697780,2022-11-29 06:21:36.000,ap-northeast-1,111122223333,,,"{configurationitemversion=1.3, configurationitemcapturetime=2022-11-29 06:21:35.000, configurationitemstatus=ResourceDiscovered, configurationstateid=1669702895013, accountid=111122223333, resourceid=sg-046c1d7d2c0c9d5ee, resourcetype=AWS::EC2::SecurityGroup, resourcename=test-sg, arn=arn:aws:ec2:ap-northeast-1:111122223333:security-group/sg-046c1d7d2c0c9d5ee, awsregion=ap-northeast-1, availabilityzone=Not Applicable, resourcecreationtime=null, configuration={groupName=test-sg, groupId=sg-046c1d7d2c0c9d5ee, vpcId=vpc-057355bebd0cc89b2, ipPermissionsEgress=[{""ipProtocol"":""-1"",""ipv6Ranges"":[],""prefixListIds"":[],""userIdGroupPairs"":[],""ipv4Ranges"":[{""cidrIp"":""0.0.0.0/0""}]}], description=test-sg, ownerId=111122223333, ipPermissions=[{""fromPort"":22.0,""ipProtocol"":""tcp"",""ipv6Ranges"":[],""prefixListIds"":[],""toPort"":22.0,""userIdGroupPairs"":[],""ipv4Ranges"":[{""cidrIp"":""0.0.0.0/0""}]}], tags=[]}, supplementaryconfiguration=null, relatedevents=null, relationships=[{name=Is contained in Vpc, resourcetype=AWS::EC2::VPC, resourceid=vpc-057355bebd0cc89b2, resourcename=null}], tags=null}"
1.08,ConfigurationItem,AwsConfigurationItem,d8084daf-accb-4b54-8e3c-129df3613909,2022-11-29 06:21:36.000,ap-northeast-1,111122223333,,,"{configurationitemversion=1.3, configurationitemcapturetime=2022-11-29 06:21:35.000, configurationitemstatus=OK, configurationstateid=1669702895137, accountid=111122223333, resourceid=vpc-057355bebd0cc89b2, resourcetype=AWS::EC2::VPC, resourcename=null, arn=arn:aws:ec2:ap-northeast-1:111122223333:vpc/vpc-057355bebd0cc89b2, awsregion=ap-northeast-1, availabilityzone=Multiple Availability Zones, resourcecreationtime=null, configuration={instanceTenancy=default, isDefault=false, dhcpOptionsId=dopt-0ae97f3769798f9ff, cidrBlock=10.0.0.0/16, vpcId=vpc-057355bebd0cc89b2, cidrBlockAssociationSet=[{""associationId"":""vpc-cidr-assoc-0139b25954038b32a"",""cidrBlock"":""10.0.0.0/16"",""cidrBlockState"":{""state"":""associated""}}], state=available, ownerId=111122223333, ipv6CidrBlockAssociationSet=[], tags=[{""key"":""Name"",""value"":""test-vpc""}]}, supplementaryconfiguration=null, relatedevents=null, relationships=[{name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-0416f7768abeb2b36, resourcename=null}, {name=Contains NetworkInterface, resourcetype=AWS::EC2::NetworkInterface, resourceid=eni-0680e54f74046ee29, resourcename=null}, {name=Contains Subnet, resourcetype=AWS::EC2::Subnet, resourceid=subnet-0e8a21edbfaed39ae, resourcename=null}, {name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-0ebfaadf64045b6c0, resourcename=null}, {name=Is attached to InternetGateway, resourcetype=AWS::EC2::InternetGateway, resourceid=igw-0f8ac80ef1c0f31a2, resourcename=null}, {name=Contains Subnet, resourcetype=AWS::EC2::Subnet, resourceid=subnet-0375cdacaaa606235, resourcename=null}, {name=Contains Subnet, resourcetype=AWS::EC2::Subnet, resourceid=subnet-0fc2a89d2becc136e, resourcename=null}, {name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-046c1d7d2c0c9d5ee, resourcename=null}, {name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-03dff1269b307cedc, resourcename=null}, {name=Contains NetworkInterface, resourcetype=AWS::EC2::NetworkInterface, resourceid=eni-0ca93c6507721ae2e, resourcename=null}, {name=Contains Subnet, resourcetype=AWS::EC2::Subnet, resourceid=subnet-09c886a3b1bf815b9, resourcename=null}, {name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-0975a27f67a1d829f, resourcename=null}, {name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-06a74ff0e03d88f89, resourcename=null}, {name=Contains Subnet, resourcetype=AWS::EC2::Subnet, resourceid=subnet-07066041a721ec18f, resourcename=null}, {name=Contains RouteTable, resourcetype=AWS::EC2::RouteTable, resourceid=rtb-04b4f2219e14b415f, resourcename=null}, {name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-0c98425dc168a58e2, resourcename=null}, {name=Contains RouteTable, resourcetype=AWS::EC2::RouteTable, resourceid=rtb-07f29027a33a3245b, resourcename=null}, {name=Contains SecurityGroup, resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-0d0e9f8bfedbdcc52, resourcename=null}, {name=Contains NetworkAcl, resourcetype=AWS::EC2::NetworkAcl, resourceid=acl-01cb0e5e1f3878fb0, resourcename=null}, {name=Contains RouteTable, resourcetype=AWS::EC2::RouteTable, resourceid=rtb-04f937c175ba3a494, resourcename=null}, {name=Contains Subnet, resourcetype=AWS::EC2::Subnet, resourceid=subnet-0f8c91c1aed1376b3, resourcename=null}], tags={Name=test-vpc}}"
1.08,ConfigurationItem,AwsConfigurationItem,7c58d44f-e851-4823-8355-b64619c11059,2022-11-29 06:22:55.000,ap-northeast-1,111122223333,,,"{configurationitemversion=1.3, configurationitemcapturetime=2022-11-29 06:21:52.000, configurationitemstatus=ResourceDiscovered, configurationstateid=1669702912029, accountid=111122223333, resourceid=AWS::EC2::SecurityGroup/sg-046c1d7d2c0c9d5ee, resourcetype=AWS::Config::ResourceCompliance, resourcename=null, arn=null, awsregion=ap-northeast-1, availabilityzone=null, resourcecreationtime=null, configuration={targetResourceId=sg-046c1d7d2c0c9d5ee, configRuleList=[{""configRuleArn"":""arn:aws:config:ap-northeast-1:111122223333:config-rule/aws-service-rule/securityhub.amazonaws.com/config-rule-c14hrq"",""configRuleId"":""config-rule-c14hrq"",""configRuleName"":""securityhub-vpc-sg-open-only-to-authorized-ports-92316b6a"",""complianceType"":""NON_COMPLIANT""}], complianceType=NON_COMPLIANT, targetResourceType=AWS::EC2::SecurityGroup}, supplementaryconfiguration=null, relatedevents=null, relationships=[{name=Is associated with , resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-046c1d7d2c0c9d5ee, resourcename=null}], tags=null}"
1.08,ConfigurationItem,AwsConfigurationItem,5994d1f8-8c26-4d96-88bb-d12baca8b684,2022-11-29 06:23:02.000,ap-northeast-1,111122223333,,,"{configurationitemversion=1.3, configurationitemcapturetime=2022-11-29 06:21:56.000, configurationitemstatus=OK, configurationstateid=1669702916639, accountid=111122223333, resourceid=AWS::EC2::SecurityGroup/sg-046c1d7d2c0c9d5ee, resourcetype=AWS::Config::ResourceCompliance, resourcename=null, arn=null, awsregion=ap-northeast-1, availabilityzone=null, resourcecreationtime=null, configuration={targetResourceId=sg-046c1d7d2c0c9d5ee, configRuleList=[{""configRuleArn"":""arn:aws:config:ap-northeast-1:111122223333:config-rule/aws-service-rule/securityhub.amazonaws.com/config-rule-jznzxf"",""configRuleId"":""config-rule-jznzxf"",""configRuleName"":""securityhub-vpc-sg-restricted-common-ports-8938113c"",""complianceType"":""NON_COMPLIANT""},{""configRuleArn"":""arn:aws:config:ap-northeast-1:111122223333:config-rule/aws-service-rule/securityhub.amazonaws.com/config-rule-c14hrq"",""configRuleId"":""config-rule-c14hrq"",""configRuleName"":""securityhub-vpc-sg-open-only-to-authorized-ports-92316b6a"",""complianceType"":""NON_COMPLIANT""}], complianceType=NON_COMPLIANT, targetResourceType=AWS::EC2::SecurityGroup}, supplementaryconfiguration=null, relatedevents=null, relationships=[{name=Is associated with , resourcetype=AWS::EC2::SecurityGroup, resourceid=sg-046c1d7d2c0c9d5ee, resourcename=null}], tags=null}"

SELECTでワイルドカードを指定した場合の検索結果として下記の項目がありました。

  • eventVersion
  • eventCategory
  • eventType
  • eventID
  • eventTime
  • awsRegion
  • recipientAccountId
  • addendum
  • metadata
  • eventData


検索結果のeventDataから次のことが分かります(ログの時系列順に記載しています)。

  • セキュリティグループの作成
  • VPC の relationships にセキュリティグループが追加
  • Security Hub のセキュリティ基準「AWS の基本的なセキュリティのベストプラクティス」の[EC2.18] セキュリティ グループは、許可されたポートへの無制限の受信トラフィックのみを許可する必要がありますが非準拠として追加
  • Security Hub のセキュリティ基準「AWS の基本的なセキュリティのベストプラクティス」の[EC2.19] セキュリティグループは、リスクの高いポートへの無制限アクセスを許可してはいけませんが非準拠として追加

「AWS の基本的なセキュリティのベストプラクティス」におけるコントロール名は、eventData内に存在する AWS Config ルール名から対応するコントロールをユーザーガイド等で調べる必要がありました。

(参考)AWS Foundational Security Best Practices コントロール - AWS Security Hub


また、eventDataconfigration内の情報からリソースの設定内容が分かります。今回は新規作成となりますが、設定変更の場合はconfigrationの値を見比べることで変更した内容が分かります。


上述したように主にeventDataに確認したい情報があるため、次のクエリのように表示項目を絞って検索してみます。

実行クエリ

SELECT
    eventTime,eventData.configuration, eventData.accountId, eventData.awsRegion, eventData.resourceId, eventData.resourceName, eventData.resourceType
FROM
    1b07f9d9-f017-xxxx-xxxx-xxxxxexample
WHERE
    eventTime >= '2022-11-29 06:21:00' AND eventTime <= '2022-11-29 06:24:00'
ORDER BY
    eventTime ASC

クエリ実行結果画面

これで結果を確認しやすくなりました!


さらに、AWS Config の情報が保管されているイベントデータストアと CloudTrail のログが保管されているイベントデータストアを JOIN 関数で結合することもできます。

冒頭で紹介した AWS のブログではその例が紹介されています。またの機会に試してみたいと思います。

Announcing AWS CloudTrail Lake integration with AWS Config | AWS Cloud Operations & Migrations Blog


また、上記のブログにて環境の削除方法も記載されていたため引用して記載します。

  1. Choose the Event data stores tab in the Lake console.
  2. Select the event data store from the list.
  3. From the Actions menu, select Change termination protection.
  4. From the change termination protection pop-up select “Disabled” and choose Save.
  5. From the Actions menu select Delete, confirm that you want to delete it by entering the name of the data store. Then choose Delete. This will place your event data store in the pending deletion state.
  6. In seven days, the data store will be deleted permanently.


さいごに

AWS CloudTrail Lake で AWS Config の設定情報を取り込めるようになりました。これまで、AWS Cofnig の画面と CloudTrail Lake の画面をそれぞれ確認して解析する必要がありましたが、今後は CloudTrail Lake の画面から両方を確認することができます。

CloudTrail Lake はどんどんアップデートが行われているので、今後が楽しみなサービスです。

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