

# 詳細な機密データ検出の使用
<a name="sensitive-data-fine-grained-actions"></a>

**注記**  
 詳細なアクションは AWS Glue 3.0 および 4.0 でのみ使用できます。これには AWS Glue Studio エクスペリエンスも含まれます。永続的な監査ログの変更も 2.0 では使用できません。  
 すべての AWS Glue Studio 3.0 および 4.0 のビジュアルジョブでは、詳細なアクション API を自動的に使用するスクリプトが作成されます。

 Detect Sensitive Data は、定義したエンティティ、または AWS Glue によって事前定義されたエンティティを検出、マスキング、削除する機能を提供します。さらに、詳細なアクションを使用することで、エンティティごとに特定のアクションを適用できます。その他の利点には次が含まれます。
+  データが検出されるとすぐにアクションが適用されるようになり、パフォーマンスが改善されました。
+  特定の列を含めるか、または除外するオプション。
+  部分的なマスキングを使用する機能。これにより、文字列全体をマスキングするのではなく、検出された機密データエンティティを部分的にマスキングできます。オフセットを含むシンプルなパラメータと正規表現の両方がサポートされます。

 次のセクションで参照するサンプルジョブで使用される機密データ検出 API と詳細なアクションのコードスニペットを次に示します。

 **detect API** – 詳細なアクションは、新しい `detectionParameters` パラメータを使用します。

```
def detect(
    frame: DynamicFrame,
    detectionParameters: JsonOptions,
    outputColumnName: String = "DetectedEntities",
    detectionSensitivity: String = "LOW"
): DynamicFrame = {}
```

## 詳細なアクションで機密データ検出 API を使用する
<a name="sensitive-data-fine-grained-actions-glue-jobs"></a>

 **detect** を使用する機密データ検出 API は、指定されたデータを分析し、行または列が機密データエンティティタイプであるかどうかを判断して、エンティティタイプごとにユーザーが指定したアクションを実行します。

### 詳細なアクションでの detect API の使用
<a name="sensitive-data-fine-grained-actions-glue-jobs-detect"></a>

 **detect** API を使用して、`outputColumnName` と ` detectionParameters` を指定します。

```
    object GlueApp {
      def main(sysArgs: Array[String]) {
      
        val spark: SparkContext = new SparkContext()
        val glueContext: GlueContext = new GlueContext(spark)
        
        // @params: [JOB_NAME]
        val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
        Job.init(args("JOB_NAME"), glueContext, args.asJava)
        
        // Script generated for node S3 bucket. Creates DataFrame from data stored in S3.
        val S3bucket_node1 = glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ",", "optimizePerformance": false}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://189657479688-ddevansh-pii-test-bucket/tiny_pii.csv"], "recurse": true}"""), transformationContext="S3bucket_node1").getDynamicFrame()
     
        // Script generated for node Detect Sensitive Data. Will run detect API for the DataFrame
        // detectionParameter contains information on which EntityType are being detected
        // and what actions are being applied to them when detected. 
        val DetectSensitiveData_node2 = EntityDetector.detect(
            frame = S3bucket_node1, 
            detectionParameters = JsonOptions(
             """
                {
                    "PHONE_NUMBER": [
                        {
                            "action": "PARTIAL_REDACT",
                            "actionOptions": {
                                "numLeftCharsToExclude": "3",
                                "numRightCharsToExclude": "4",
                                "redactChar": "#"
                            },
                            "sourceColumnsToExclude": [ "Passport No", "DL NO#" ]
                        }
                    ],
                    "USA_PASSPORT_NUMBER": [
                        {
                            "action": "SHA256_HASH",
                            "sourceColumns": [ "Passport No" ]
                        }
                    ],
                    "USA_DRIVING_LICENSE": [
                        {
                            "action": "REDACT",
                            "actionOptions": {
                                "redactText": "USA_DL"
                            },
                            "sourceColumns": [ "DL NO#" ]
                        }
                    ]
                    
                }
            """
            ),
            outputColumnName = "DetectedEntities"
        )
     
        // Script generated for node S3 bucket. Store Results of detect to S3 location
        val S3bucket_node3 = glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://amzn-s3-demo-bucket/test-output/", "partitionKeys": []}"""), transformationContext="S3bucket_node3", format="json").writeDynamicFrame(DetectSensitiveData_node2)
     
        Job.commit()
      }
```

 上記のスクリプトは、Amazon S3 内の場所から DataFrame を作成し、`detect` API を実行します。`detect` API ではフィールド `detectionParameters` (エンティティに使用されるすべてのアクション設定のリストに対するエンティティ名のマップ) が AWS Glue の `JsonOptions` オブジェクトによって表されるため、API の機能を拡張することもできます。

 エンティティごとに指定された各アクションについて、エンティティ/アクションの組み合わせを適用するすべての列名のリストを入力します。これにより、エンティティをカスタマイズしてデータセット内のすべての列を検出したり、特定の列に存在しないことがわかっているエンティティをスキップしたりできます。また、これらのエンティティを呼び出す不要な検出を実行しないことでジョブのパフォーマンスが改善し、各列とエンティティの組み合わせに固有のアクションを実行できるようになります。

 `detectionParameters` を詳しく見てみると、サンプルジョブには 3 つのエンティティタイプがあることがわかります。これらは、`Phone Number`、`USA_PASSPORT_NUMBER`、`USA_DRIVING_LICENSE` です。これらの各エンティティタイプについて、AWS Glue は、異なるアクション (`PARTIAL_REDACT`、`SHA256_HASH`、`REDACT`、`DETECT` のいずれか) を実行します。各エンティティタイプには、適用する `sourceColumns` および/または `sourceColumnsToExclude` (検出された場合) があります。

**注記**  
 列ごとに使用できるその場編集アクション (`PARTIAL_REDACT`、`SHA256_HASH`、または `REDACT`) は 1 つだけですが、`DETECT` アクションはこれらのアクションのいずれかと併用できます。

 `detectionParameters` フィールドのレイアウトは以下のとおりです。

```
    ENTITY_NAME -> List[Actions]
    {
    	"ENTITY_NAME": [{
    		Action, // required
    		ColumnSpecs,
    		ActionOptionsMap
        }],
        "ENTITY_NAME2": [{
    		...
        }]
    }
```

 タイプ `actions` および `actionOptions` は以下のとおりです。

```
DETECT
{
    # Required
    "action": "DETECT",
    # Optional, depending on action chosen
    "actionOptions": {
        // There are no actionOptions for DETECT 
    },
    # 1 of below required, both can also used
    "sourceColumns": [
        "COL_1", "COL_2", ..., "COL_N"
    ],
    "sourceColumnsToExclude": [
        "COL_5"
    ]
}

SHA256_HASH
{
    # Required
    "action": "SHA256_HASH",
    # Required or optional, depending on action chosen
    "actionOptions": {
        // There are no actionOptions for SHA256_HASH
    },
    
    # 1 of below required, both can also used
    "sourceColumns": [
        "COL_1", "COL_2", ..., "COL_N"
    ],
    "sourceColumnsToExclude": [
        "COL_5"
    ]
}

REDACT
{
    # Required
    "action": "REDACT",
    # Required or optional, depending on action chosen
    "actionOptions": {
        // The text that is being replaced
        "redactText": "USA_DL"
    },
    
    # 1 of below required, both can also used
    "sourceColumns": [
        "COL_1", "COL_2", ..., "COL_N"
    ],
    "sourceColumnsToExclude": [
        "COL_5"
    ]
}

PARTIAL_REDACT
{
    # Required
    "action": "PARTIAL_REDACT",
    # Required or optional, depending on action chosen
    "actionOptions": {
        // number of characters to not redact from the left side 
        "numLeftCharsToExclude": "3",
        // number of characters to not redact from the right side
        "numRightCharsToExclude": "4",
        // the partial redact will be made with this redacted character  
        "redactChar": "#",
        // regex pattern for partial redaction
        "matchPattern": "[0-9]"
    },
    
    # 1 of below required, both can also used
    "sourceColumns": [
        "COL_1", "COL_2", ..., "COL_N"
    ],
    "sourceColumnsToExclude": [
        "COL_5"
    ]
}
```

 スクリプトが実行されると、指定された Amazon S3 の場所に結果が出力されます。Amazon S3 でデータを表示することはできますが、選択したアクションに基づいて、選択したエンティティタイプの感度が高くなります。この場合、行は次のようになります。

```
{
    "Name": "Colby Schuster",
    "Address": "39041 Antonietta Vista, South Rodgerside, Nebraska 24151",
    "Car Owned": "Fiat",
    "Email": "Kitty46@gmail.com",
    "Company": "O'Reilly Group",
    "Job Title": "Dynamic Functionality Facilitator",
    "ITIN": "991-22-2906",
    "Username": "Cassandre.Kub43",
    "SSN": "914-22-2906",
    "DOB": "2020-08-27",
    "Phone Number": "1-2#######1718",
    "Bank Account No": "69741187",
    "Credit Card Number": "6441-6289-6867-2162-2711",
    "Passport No": "94f311e93a623c72ccb6fc46cf5f5b0265ccb42c517498a0f27fd4c43b47111e",
    "DL NO#": "USA_DL"
}
```

 上記のスクリプトでは、`Phone Number` は部分的に `#` でマスキングされています。`Passport No` は SHA256 ハッシュに変更されました。`DL NO# ` は米国の運転免許証番号として検出され、`detectionParameters` で記述されているように「USA\_DL」でマスキングされました。

**注記**  
 classifyColumns API は、API の性質上、詳細なアクションでは使用できません。この API は、列サンプリング (ユーザーによる調整が可能ですが、デフォルト値が設定されています) を実行して、検出をより迅速に実行します。このため、詳細なアクションでは、すべての値に対してイテレーションを実行する必要があります。

### 永続的な監査ログ
<a name="sensitive-data-fine-grained-actions-persistent-audit-log"></a>

 詳細なアクションで導入された新機能 (ただし、通常の API を使用する場合にも使用可能) は、永続的な監査ログです。現在、detect API を実行すると、PII 検出メタデータを含む追加の列 (`DetectedEntities` にデフォルト設定されていますが、`outputColumnName` を通じてカスタマイズ可能です) パラメータが追加されます。これには、「actionUsed」メタデータキーが追加されました。これは、`DETECT`、`PARTIAL_REDACT`、`SHA256_HASH`、`REDACT` のいずれかです。

```
"DetectedEntities": {
    "Credit Card Number": [
        {
            "entityType": "CREDIT_CARD",
            "actionUsed": "DETECT",
            "start": 0,
            "end": 19
        }
    ],
    "Phone Number": [
        {
            "entityType": "PHONE_NUMBER",
            "actionUsed": "REDACT",
            "start": 0,
            "end": 14
        }
    ]
}
```

 `detect(entityTypesToDetect, outputColumnName)` などの詳細なアクションなしで API を使用しているお客様でも、結果として得られるデータフレームでこの永続的な監査ログを確認できます。

 詳細なアクションが設定されている API を使用しているお客様は、マスキングされているかどうかにかかわらず、すべてのアクションを表示できます。例: 

```
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Credit Card Number  |  Phone Number  |                                                                                            DetectedEntities                                                                                             |
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 622126741306XXXX    | +12#####7890   | {"Credit Card Number":[{"entityType":"CREDIT_CARD","actionUsed":"PARTIAL_REDACT","start":0,"end":16}],"Phone Number":[{"entityType":"PHONE_NUMBER","actionUsed":"PARTIAL_REDACT","start":0,"end":12}]}} |
| 6221 2674 1306 XXXX | +12#######7890 | {"Credit Card Number":[{"entityType":"CREDIT_CARD","actionUsed":"PARTIAL_REDACT","start":0,"end":19}],"Phone Number":[{"entityType":"PHONE_NUMBER","actionUsed":"PARTIAL_REDACT","start":0,"end":14}]}} |
| 6221-2674-1306-XXXX | 22#######7890  | {"Credit Card Number":[{"entityType":"CREDIT_CARD","actionUsed":"PARTIAL_REDACT","start":0,"end":19}],"Phone Number":[{"entityType":"PHONE_NUMBER","actionUsed":"PARTIAL_REDACT","start":0,"end":14}]}} |
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

 **[DetectedEntities]** 列を表示したくない場合、必要なのは、カスタムスクリプトに追加の列をドロップすることだけです。