CloudWatch Logsの機密情報保護の監査結果を確認する #reinvent

CloudWatch Logsの機密情報保護の監査結果の内容を確認してみました。
2022.12.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon CloudWatch Logsで、機密情報を保護できるようになりました。

この機密情報の保護は、監査結果を3つのルートで送信できます。

  • CloudWatch Logs -> CloudWatch Logs
  • CloudWatch Logs -> S3
  • CloudWatch Logs -> Firehose

本記事では、どのような監査結果になるのか?を確認してみました。

おすすめの方

  • Amazon CloudWatch Logsのデータ保護機能をCloudFormationで利用したい方
  • Amazon CloudWatch Logsのデータ保護機能の監査結果の内容を知りたい方

CloudFormationテンプレート

メールアドレスを機密情報としています。他の機密情報の内容や設定すべきARNは、次のドキュメントをご覧ください。

logs.yaml

AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  LambdaLogGroupNamePrefix:
    Type: String
    Default: /aws/lambda

Resources:
  # 機密情報を保護する対象のロググループ
  TestLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub ${LambdaLogGroupNamePrefix}/test-2022-12-aaa
      DataProtectionPolicy:
        Name: test-2022-12-aaa-data-protection-policy
        Version: 2021-06-01
        Statement:
          - DataIdentifier:
              - arn:aws:dataprotection::aws:data-identifier/EmailAddress
            Operation:
              Audit:
                FindingsDestination:
                  CloudWatchLogs:
                    LogGroup: !Ref AuditLogGroup
                  Firehose:
                    DeliveryStream: !Ref CloudWatchLogsAuditFirehose
                  S3:
                    Bucket: !Ref CloudWatchLogsAuditBucket
          - DataIdentifier:
              - arn:aws:dataprotection::aws:data-identifier/EmailAddress
            Operation:
              Deidentify:
                MaskConfig: {}

  # 監査結果を保持するロググループ
  AuditLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub ${LambdaLogGroupNamePrefix}/test-2022-12-audit

  # 監査結果を保持するS3バケット
  CloudWatchLogsAuditBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub cloudwatch-logs-audit-${AWS::AccountId}-${AWS::Region}
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true

  # 監査結果を受け取るFirehose
  CloudWatchLogsAuditFirehose:
    Type: AWS::KinesisFirehose::DeliveryStream
    Properties: 
      DeliveryStreamName: cloudwatch-logs-audit-delivery-stream
      DeliveryStreamType: DirectPut
      S3DestinationConfiguration:
        BucketARN: !GetAtt CloudWatchLogsAuditBucket.Arn
        Prefix: CloudWatchLogs-DeliveryStream-Prefix/
        BufferingHints:
          SizeInMBs: 50
          IntervalInSeconds: 60
        CompressionFormat: GZIP
        RoleARN: !GetAtt CloudWatchLogsAuditFirehoseRole.Arn

  # Firehose用のIAMロール
  CloudWatchLogsAuditFirehoseRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: cloudwatch-logs-audit-delivery-stream-role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: sts:AssumeRole
            Effect: Allow
            Principal:
              Service: firehose.amazonaws.com
      Policies:
        - PolicyName: cloudwatch-logs-audit-delivery-stream-policy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:AbortMultipartUpload
                  - s3:GetBucketLocation
                  - s3:GetObject
                  - s3:ListBucket
                  - s3:ListBucketMultipartUploads
                  - s3:PutObject
                Resource: !Sub 'arn:aws:s3:::${CloudWatchLogsAuditBucket}/*'

デプロイ

aws cloudformation deploy \
  --template-file logs.yaml \
  --stack-name CloudWatch-Data-Protection-audit-Test-Stack \
  --capabilities CAPABILITY_NAMED_IAM \
  --no-fail-on-empty-changeset

メールアドレスをロググループに送信する

作成したロググループに適当なログストリームを作成し、テスト用のログイベントを送信します。

  • メールアドレスのみ
  • メールアドレス以外とメールアドレスの混在
  • メールアドレスなし
  • 複数のメールアドレス

CloudWatch Logsにテストイベントを送信する

CloudWatch Logsにテストイベントを送信する

CloudWatch Logsにテストイベントを送信する

いくつかのログイベントを送信しました。メールアドレスがマスク表示されました。

CloudWatch Logsのメールアドレスがマスクされた

CloudWatch Logsの機密情報保護の監査結果を確認する

CloudWatch Logsに送信された監査結果

監査結果が保存されるCloudWatch Logsのログは次のようになっていました。 機密情報に該当したログについて、機密情報の種類・出現個数・出現位置が残るようです。

CloudWatch Logsに機密情報の監査結果が残った

CloudWatch Logsに機密情報の監査結果が残った

{
    "auditTimestamp": "2022-12-07T02:38:17Z",
    "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
    "dataIdentifiers": [
        {
            "name": "EmailAddress",
            "count": 1,
            "detections": [
                {
                    "start": 0,
                    "end": 15
                }
            ]
        }
    ]
}
{
    "auditTimestamp": "2022-12-07T02:38:38Z",
    "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
    "dataIdentifiers": [
        {
            "name": "EmailAddress",
            "count": 1,
            "detections": [
                {
                    "start": 7,
                    "end": 24
                }
            ]
        }
    ]
}
{
    "auditTimestamp": "2022-12-07T02:43:29Z",
    "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
    "dataIdentifiers": [
        {
            "name": "EmailAddress",
            "count": 2,
            "detections": [
                {
                    "start": 8,
                    "end": 22
                },
                {
                    "start": 25,
                    "end": 39
                }
            ]
        }
    ]
}

S3バケットに送信された監査結果

S3バケットの中身(直下)は次のようになっていました。

CloudWatch Logsの監査結果を保存するS3バケットの様子

CloudWatch Logs -> S3バケットの場合

オブジェクトは次のように保存されていました。

  • AWSLogs/xxxxyyyyzzzz/AuditLogs/logs/ap-northeast-1//aws/lambda/test-2022-12-aaa/2022/12/07/findings/20221207T0240Z_28e94d64.log.gz
  • AWSLogs/xxxxyyyyzzzz/AuditLogs/logs/ap-northeast-1//aws/lambda/test-2022-12-aaa/2022/12/07/findings/20221207T0235Z_f362c706.log.gz

S3 Selectで中身を確認してみました。同じです。

{
  "auditTimestamp": "2022-12-07T02:38:17Z",
  "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
  "dataIdentifiers": [
    {
      "name": "EmailAddress",
      "count": 1,
      "detections": [
        {
          "start": 0,
          "end": 15
        }
      ]
    }
  ]
}
{
  "auditTimestamp": "2022-12-07T02:38:38Z",
  "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
  "dataIdentifiers": [
    {
      "name": "EmailAddress",
      "count": 1,
      "detections": [
        {
          "start": 7,
          "end": 24
        }
      ]
    }
  ]
}
{
  "auditTimestamp": "2022-12-07T02:43:29Z",
  "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
  "dataIdentifiers": [
    {
      "name": "EmailAddress",
      "count": 2,
      "detections": [
        {
          "start": 8,
          "end": 22
        },
        {
          "start": 25,
          "end": 39
        }
      ]
    }
  ]
}

CloudWatch Logs -> Firehose-> S3バケットの場合

オブジェクトは次のように保存されていました。

  • CloudWatchLogs-DeliveryStream-Prefix/2022/12/07/02/cloudwatch-logs-audit-delivery-stream-1-2022-12-07-02-38-28-5690a456-b4a0-4f2c-a3e1-e24f7cba0d15.gz
  • CloudWatchLogs-DeliveryStream-Prefix/2022/12/07/02/cloudwatch-logs-audit-delivery-stream-1-2022-12-07-02-43-37-96add8c2-ade6-4198-8713-7126e973bc9a.gz

S3 Selectで中身を確認してみました。同じです。

{
  "auditTimestamp": "2022-12-07T02:38:17Z",
  "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
  "dataIdentifiers": [
    {
      "name": "EmailAddress",
      "count": 1,
      "detections": [
        {
          "start": 0,
          "end": 15
        }
      ]
    }
  ]
}
{
  "auditTimestamp": "2022-12-07T02:38:38Z",
  "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
  "dataIdentifiers": [
    {
      "name": "EmailAddress",
      "count": 1,
      "detections": [
        {
          "start": 7,
          "end": 24
        }
      ]
    }
  ]
}
{
  "auditTimestamp": "2022-12-07T02:43:29Z",
  "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*",
  "dataIdentifiers": [
    {
      "name": "EmailAddress",
      "count": 2,
      "detections": [
        {
          "start": 8,
          "end": 22
        },
        {
          "start": 25,
          "end": 39
        }
      ]
    }
  ]
}

さいごに

監査結果の送信ルートが異なっても、監査結果の内容は同じでした。 監査機能を使えば、「ログに残るはずのない情報(メールアドレスや住所など)が残ったとき」に通知する仕組みなども実現できそうです。

参考