CloudWatch Logs に個人情報が出たら通知する方法 ── データ保護ポリシーと LogEventsWithFindings のアラーム
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| CloudWatch Logs ロググループ | /soa/clinic-app | 医療系アプリのログの出力先(標準ログクラス) | ─ |
| SNS トピック | soa-sensitive-data-alerts | アラームの通知先(標準トピック) | Amazon SNS でトピックを作成しメッセージを配信する |
※ この記事では、通知がトピックに届くところまでを扱います。メールなどで受け取るには、トピックにサブスクリプションを追加します。
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| データ保護ポリシー | (/soa/clinic-app に設定) | メールアドレスと患者番号の検出・マスク |
| カスタムデータ識別子 | PatientId | 患者番号(PT- に続く 8 桁の数字)を検出する |
| ログストリーム | test-01 | テスト用のログの送り先 |
| CloudWatch アラーム | soa-sensitive-data-alarm | LogEventsWithFindings が 1 以上になったら通知 |
手順 1: データ保護ポリシーを作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに CloudWatch と入力し、「CloudWatch」を選択します。
左側ナビゲーションの「ログ」→「ロググループ」を選択し、/soa/clinic-app を選択します。「アクション」→「データ保護ポリシーを作成」を選択します。「データ保護ロググループポリシー」の作成画面が開くので、以下を設定します。
- マネージドデータ識別子: 「データ識別子を選択」を開き、
EmailAddressで絞り込んで「EmailAddress」を選択 - 「カスタムデータ識別子を追加」をクリックし、名前:
PatientId、正規表現:PT-[0-9]{8}を入力 - 監査結果の送信先: どれも選択しない
「データ保護をアクティブ化」をクリックします。ロググループの詳細の「データ保護」タブで、ポリシーが有効になり、2 つのデータ識別子が設定されていることを確認します。
手順 2: 機密データを含むログを送る
コンソール下部の「CloudShell」をクリックして CloudShell を開き、次のコマンドを実行します。ログストリーム test-01 を作り、患者番号とメールアドレスを含むログと、含まないログを 1 件ずつ送ります。
LG=/soa/clinic-app
aws logs create-log-stream --log-group-name "$LG" --log-stream-name test-01
now=$(date +%s%3N)
aws logs put-log-events --log-group-name "$LG" --log-stream-name test-01 --log-events \
"[{\"timestamp\":$now,\"message\":\"reservation created patient=PT-20261021 contact=banana.taro@example.com\"},{\"timestamp\":$now,\"message\":\"reservation list loaded count=3\"}]"
コマンドが rejectedLogEventsInfo のエラーを返さずに終わることを確認します。
手順 3: ログがマスクされたことを確かめる
CloudWatch のコンソールに戻り、/soa/clinic-app の「ログストリーム」タブで test-01 を選択します。1 件目のログでは、患者番号とメールアドレスの部分が * で伏せられています。2 件目のログはそのまま表示されています。
画面右上の「表示」→「マスク解除」を選ぶと、元の値が表示されます。いまログインしているユーザーが logs:Unmask の権限を持っているためです。
手順 4: LogEventsWithFindings メトリクスを確かめる
左側ナビゲーションの「メトリクス」→「クラシックメトリクス」を選択します。「参照」タブで「Logs」→「DataProtectionOperation, LogGroupName」を選択し、LogGroupName が /soa/clinic-app の LogEventsWithFindings の行にチェックを入れます。メトリクスはロググループごと(ディメンション LogGroupName)に出ます。ログを送ってから表示されるまで 2 分ほどかかります。
「グラフ化したメトリクス」タブで、統計を「合計」、期間を「1 分」に変更します。既定の「平均」「5 分」のままだと「データがありません」と表示されることがあります。手順 2 で送った時刻に、値が 1 のデータポイントが表示されます。送ったログは 2 件ですが、機密データを含むログイベントは 1 件なので、値は 1 です。
手順 5: アラームを作る
「グラフ化したメトリクス」タブで、LogEventsWithFindings の行の「アクション」列にあるベルのアイコン(「アラームを作成」)をクリックします。「メトリクスと条件の指定」が、名前空間・ディメンションの入った状態で開きます。以下を設定します。
- 統計:
合計 - 期間:
1 分 - 条件: しきい値の種類「静的」、「LogEventsWithFindings が」「以上」(既定では選ばれていません)、「…よりも」に
1
「次へ」をクリックし、「通知」で以下を設定します。
- アラーム状態トリガー: 「アラーム状態」
- SNS トピックの選択: 「既存の SNS トピックを選択」の入力欄に
soa-sensitive-data-alertsと入力し、候補から選択
「次へ」をクリックし、アラーム名に soa-sensitive-data-alarm と入力します。「次へ」をクリックし、確認画面で「アラームの作成」をクリックします。
手順 6: アラーム状態になることを確かめる
CloudShell に戻り、もう一度機密データを含むログを送ります。
now=$(date +%s%3N)
aws logs put-log-events --log-group-name "$LG" --log-stream-name test-01 --log-events \
"[{\"timestamp\":$now,\"message\":\"reservation updated patient=PT-20261022 contact=banana.jiro@example.com\"}]"
CloudWatch のコンソールで左側ナビゲーションの「アラーム」→「すべてのアラーム」を選択します。数分待つと、soa-sensitive-data-alarm の状態が「アラーム状態」に変わります。アラームを選択して「履歴」タブを開くと、状態の変化と、SNS トピックへのアクションが実行されたことを確認できます。この実践ではトピックにサブスクリプションを付けていないため、アラーム一覧の「アクション」列に警告が表示されますが、動作には影響しません。実際の運用では、トピックに通知先(メールやチャットなど)をサブスクライブしておきます。