CloudWatch Logsの機密情報保護をCloudFormationで設定する #reinvent

Amazon CloudWatch Logsの機密情報保護をCloudFormationで設定してみました。 実際に運用する場合に役立つと思います。
2022.12.06

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

本記事では、CloudFormationでデータ保護を設定してみました。

おすすめの方

  • Amazon CloudWatch Logsのデータ保護機能をCloudFormationで利用したい方

CloudFormationテンプレート

適当なロググループと動作確認用のIAMロールを作成します。 動作確認用のIAMロールには、logs:Unmask権限がありません。

なお、指定するARNは次のドキュメントを参照してください。

logs.yaml

AWSTemplateFormatVersion: '2010-09-09'

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

Resources:
  TestFunctionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub ${LambdaLogGroupNamePrefix}/test-2022-12
      DataProtectionPolicy:
        Name: test-2022-12-data-protection-policy
        Version: 2021-06-01
        Statement:
          - DataIdentifier:
              - arn:aws:dataprotection::aws:data-identifier/EmailAddress
            # 監査結果の送信は設定しない
            Operation:
              Audit:
                FindingsDestination: {}
          - DataIdentifier:
              - arn:aws:dataprotection::aws:data-identifier/EmailAddress
            # 監査結果の送信は設定しない
            Operation:
              Deidentify:
                MaskConfig: {}

  # 動作確認用のIAMロール
  CloudWatchReadOnlyMaskRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: cloudwatch-read-only-mask-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              AWS:
                - !Sub ${AWS::AccountId} # 実際には最小限なAssumeRole元を指定してください。
      Policies:
        - PolicyName: cloudwatch-read-only-mask-policy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - logs:DescribeLogGroups
                  - logs:DescribeLogStreams
                  - logs:GetLogEvents
                  # - logs:Unmask   設定しない
                Resource: "*"

デプロイ

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

メールアドレスをロググループに送信し、マスク表示を確認する

CloudWatchに対する全権限を持っているユーザ(IAMロール)で操作します。

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

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

CloudWatch Logsにテスト用イベントを送信する(メールアドレス)

メールアドレスがマスク表示されました。

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

動作確認

unmask権限がある場合、メールアドレスが表示される

「Temporarily unmask protected data」を選択します。

CloudWatch Logsのマスクを解除してみる

マスクが解除されて、メールアドレスが表示されました。

CloudWatch Logsのマスクが解除されて、メールアドレスが表示された

unmask権限がない場合、メールアドレスが表示されない

動作確認用のIAMロールに切り替えて、同様の操作をおこないます。

結果は表示されませんでした。

CloudWatch Logsでマスク解除できない(権限がない)

すべてがmaskされたログの場合は、一時的に表示が消えるみたいです。 再読み込み(リロード)すると「****」が表示されます。

さいごに

Amazon CloudWatch Logsの機密情報保護をCloudFormationで設定してみました。 実際に運用する場合に役立つと思います。

参考