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のログは次のようになっていました。 機密情報に該当したログについて、機密情報の種類・出現個数・出現位置が残るようです。
{
"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バケットの場合
オブジェクトは次のように保存されていました。
- 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
}
]
}
]
}
さいごに
監査結果の送信ルートが異なっても、監査結果の内容は同じでした。 監査機能を使えば、「ログに残るはずのない情報(メールアドレスや住所など)が残ったとき」に通知する仕組みなども実現できそうです。
参考
- [アップデート]Amazon CloudWatch Logsでログデータに含まれた機密情報を保護出来るようになりました #reinvent | DevelopersIO
- CloudWatch Logsの機密情報保護をCloudFormationで設定する #reinvent | DevelopersIO
- AWS::Logs::LogGroup - AWS CloudFormation
- Types of data that you can protect - Amazon CloudWatch Logs
- Personally identifiable information (PII) - Amazon CloudWatch Logs