Amazon Macieのカスタムデータ識別子を試してみた

# 背景・目的 
[Amazon Macieのマネージドデータ識別子を試してみた](https://qiita.com/zumax/items/6dc8a3e2728a98a2c142)では、AWSで用意された識別子を元に、設定から検出まで一連の動作を確認しました。

今回は、カスタムデータ識別子を試してみます。

# まとめ
下記の特徴があります。

|特徴|説明|
|:--|:--|
|検出方法 |正規表現で指定する<BR>Perl互換の正規表現ライブラリによって提供される正規表現パターン構文をサポートしている|
|重要度|デフォルトでは中。カスタム可能|


# 概要
[Amazon Macie でのカスタムデータ識別子の構築](https://docs.aws.amazon.com/ja_jp/macie/latest/user/custom-data-identifiers.html)を元に整理します。

> カスタムデータ識別子は、機密データを検出するために定義する基準のセットです。基準は、一致するテキストパターン、オプションで文字シーケンス、結果を絞り込む近接ルールを定義する正規表現 (正規表現) から設定されています。

- テキストパターン
- オプションで文字シーケンス、正規表現から設定されている


> カスタムデータ識別子を使用すると、従業員 ID、顧客アカウント番号、内部データの分類など、組織の特定のシナリオ、知的財産、または独自のデータを反映する検出基準を定義できます。機密データ検出ジョブまたは機密データ自動検出をこれらの識別子を使用するように設定すると、Amazon Macie が提供しているマネージドデータ識別子を補足する方法で S3 オブジェクトを分析できます。

- 組織の特定シナリオや知財、独自データの検出基準を定義できる
- マネージドデータ識別子を補足する位置づけ


> 検出基準に加えて、カスタムデータ識別子が生成する機密データ結果のカスタム重要度設定を定義できます。デフォルトでは、Macie はカスタムデータ識別子が生成するすべての結果に中重要度を自動的に割り当てます。カスタムデータ識別子の検出基準に一致するテキストの出現回数に基づいて重要度が変化することはありません。カスタム重要度設定を定義することにより、基準に一致するテキストの出現回数に基づいて、割り当てる重要度を指定できます。

- カスタム重要度設定を定義できる
    - デフォルトでは中
    - 指定が可能


## カスタムデータ識別子の検出基準の定義
> 各カスタムデータ識別子を作成するときに、S3 オブジェクト内で一致するテキストパターンを定義する正規表現 (正規表現) を指定します。Macie は、Perl 互換正規表現 (PCRE) ライブラリによって提供される正規表現パターン構文のサブセットをサポートしています。詳細については、このセクションで後述する正規表現のサポートを参照してください。

- オブジェクト内で一致するテキストパターンを定義する正規表現を指定する
- Perlライブラリにより提供される正規表現パターン構文のサブセットをサポートしている

> また、単語やフレーズなどの文字シーケンス、および結果を絞り込む近接ルールを指定することもできます。

### キーワード
> これらは、正規表現パターンに一致するテキストの近接内にある必要がある文字シーケンスです。近接要件は、S3 オブジェクトのストレージ形式またはファイルタイプによって異なります。

> - 構造化列データでは、テキストが正規表現パターンに一致し、キーワードがテキストを保存するフィールドまたは列の名前に含まれている場合、またはテキストの前にキーワードがあり、かつテキストが同じフィールドまたはセル値内のキーワードの最大一致距離内にある場合に、Macie は結果をレポートします。これは、Microsoft Excel ワークブック、CSV ファイル、および TSV ファイルに当てはまります。

- 構造化列データ
    - Excelワークブーク、CSV、TSVなど
    - 正規表現パターンに一致
    - キーワードがテキストを保存するフィールド、列の名前に含まれる場合
    - テキストが同じフィールドまたはセル値内のキーワードの最大一致距離内


> - 構造化レコードベースデータでは、テキストが正規表現パターンに一致し、テキストがキーワードの最大一致距離内にある場合、Macie は結果を含めます。キーワードは、テキストを保存するフィールドまたは配列へのパス内の要素の名前に含めるか、またはテキストを保存するフィールドまたは配列内の同じ値の前にくるかその一部にすることができます。これは Apache Avro オブジェクトコンテナ、Apache Parquet ファイル、JSON ファイル、および JSON Lines ファイルに当てはまります。

- 構造化レコードベース
    - Avro、Parquet、JSON、JSONLなど
    - 正規表現パターンに一致
    - テキストがキーワードの最大一致距離内
    - テキストを保存するフィールドまたは配列のパス内の要素の名前煮含める
    - テキストを保存するフィールドまたは配列内の同じ値の前に来るか、その一部


> - 非構造化データでは、テキストが正規表現パターンに一致し、テキストの前にキーワードがあり、かつテキストがキーワードの最大一致距離内にある場合、Macie は結果をレポートします。これは、Adobe ポータブルドキュメント形式ファイル、Microsoft Word ドキュメント、E メールメッセージ、および CSV、JSON、JSON Lines、および TSV ファイル以外の非バイナリテキストファイルに当てはまります。これには、これらのタイプのファイルに含まれるテーブルなどの構造化データが含まれます。

- 非構造化データ
    - Word、Eメール、CSV、JSON、JSONL。、TSV以外のバイナリ
    - 正規表現パターンに一致

> 最大 50 個のキーワードを指定できます。各キーワードには、3～90 の UTF-8 文字を含めることができます。キーワードでは、大文字と小文字が区別されません。

- 各キーワードには、3〜90のUTF-8文字を含める
- 大文字と小文字は区別されない


### Maximum match distance (最大一致距離)
> これは文字ベースのキーワードの近接ルールです。Macie はこの設定を使用して、キーワードが正規表現パターンに一致するテキストの前に置かれているかどうかを判断します。この設定は、キーワード全体の終わりと正規表現パターンに一致するテキストの終わりの間に存在できる最大文字数を定義します。テキストが正規表現パターンに一致し、少なくとも 1 つのキーワードが完了した後に出現し、キーワードから指定された距離内にある場合、Macie はそのテキストを結果に含めます。それ以外の場合、Macie はそのテキストを結果から除外します。

- 文字ベースのキーワードの近接ルール
- キーワードが正規表現パターンに一致するテキストの前に置かれているか判断する
- キーワード全体の終わりと正規表現パターンに一致するテキストの終わりの間に存在できる最大文字数を定義する。

> 1～300 文字の距離を指定できます。デフォルトの距離は 50 文字です。最良の結果を得るには、この距離が正規表現が検出するように設計されているテキストの最小文字数よりも大きくなければなりません。テキストの一部だけがキーワードの最大一致距離内にある場合、Macie はそのテキストを結果に含めません。

- 1〜300文字の距離を指定
- デフォルト50文字
- テキストの最小文字数よりも大きくある必要がある

### 無視する単語
> これらは、結果から除外する文字シーケンスです。テキストが正規表現パターンと一致しても、無視する単語が含まれている場合、Macie はそのテキストを結果に含めません。

- 結果から除外する文字シーケンス
- テキストが正規表現パターンと一致しても、無視する単語が含まれている場合に、Macieはそのテキストを結果に含めない

> 無視する単語を 10 個まで指定できます。無視する単語には、4～90 の UTF-8 文字を含めることができます。無視する単語では、大文字と小文字が区別されます。

- 除外は10個まで

# 実践

- 従業員IDが含まれるか確認します
- 従業員IDは、employee_idというキーで設定されます。また値は、Eから始まり、2文字以降は英数字で、全部で11桁とします

## 事前準備
下記のデータを用意します。
1. バケットを作成します
1. 下記のテストデータをアップします
    ```
    {"employee_id":"E0123456789"}
    {"employee_id":"Eabcdefghij"}
    ```

## カスタムデータ識別子の作成
1. AWSにサインインし、Macineに移動します
1. ナビゲーションペインの設定下の「カスタムデータ識別子」をクリックします
1. 画面右上の「作成」をクリックします
1. 下記を入力します
    - 名前
    - 説明
    - 正規表現
    - キーワード
    - 最大一致距離
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/72602461-336a-16ad-6990-9121a385d417.png)

1. 評価欄でサンプルデータを指定し、「テスト」をクリックします
    ```
    {"employee_id": "E1a2b3c4d51"}
    {"employee_id": "E123456789A"}
    {"employee_id": "Eabcdefg123"}
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/81a8764a-5bba-724e-9a54-ae285cb7c278.png)

1. もう一度、該当しないデータを指定し、「テスト」をクリックします
    ```
    {"employee_id": "E1234"}
    {"employee_id": "A1234567890"}
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/48ff906b-eccb-3153-c760-817b7c8c64b5.png)

1. 上記で問題なかったので、「送信」をクリックします

## ジョブの作成
1. ナビゲーションペインで「ジョブを作成」をクリックします
1. 上記の「事前準備」で用意したバケットを指定し、「次へ」をクリックします
1. 範囲では、「ワンタイムジョブ」を選択し、「次へ」をクリックします
1. カスタムデータ識別子を選択で、上記の「カスタムデータ識別子の作成」で作成した識別子を選択し、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7f3e8ab3-4753-4aa1-7909-e187a68f4047.png)
1. 許可リストの選択はそのまま「次へ」をクリックします
1. ジョブ名を指定し、「次へ」をクリックします
1. 確認画面で問題なければ、「送信」をクリックします
1. ジョブが実行されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e8cc1b03-ea0a-5c46-f49c-847810d602fd.png)

1. 10分程で完了しました

## 確認
1.　ナビゲーションペインで「検出結果」を確認します
2.　重要度「Medium」で、検出結果タイプは、CustomIdentifierとなっています。クリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c620ee00-01ff-3337-e491-8e244667fbc6.png)


3.　詳細を確認するため、S3バケットのリンクをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ed9c40ae-6cd9-29b0-e586-cc8d74b60d25.png)

4.S3 SELECTで確認します。employee_idで2件検出されていました。

```
"category": "CLASSIFICATION",
      "classificationDetails": {
        "jobArn": "arn:aws:macie2:ap-northeast-1:XXXXX:classification-job/XXXXX",
        "result": {
          "status": {
            "code": "COMPLETE"
          },
          "sizeClassified": "60",
          "mimeType": "application/json",
          "sensitiveData": [],
          "customDataIdentifiers": {
            "totalCount": "2",
            "detections": [
              {
                "arn": "XXXXXXX",
                "name": "employee-id",
                "count": "2",
                "occurrences": {
                  "lineRanges": [],
                  "pages": [],
                  "records": [
                    {
                      "recordIndex": "0",
                      "jsonPath": "$.employee_id"
                    },
                    {
                      "recordIndex": "1",
                      "jsonPath": "$.employee_id"
                    }
                  ],
                  "cells": []
                }
              }
            ]
}
```

# 考察
Amazon Macieでカスタムデータ識別子の検出を試してみました。
前回試した、マネージドデータ識別子に加えて、独自のスキーマに対応できるので企業内の独自の属性などに対応できるので有用そうです。

# 参考
https://docs.aws.amazon.com/ja_jp/macie/latest/user/custom-data-identifiers.html