

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用微調敏感資料偵測
<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 敏感資料轉換可讓您偵測、遮罩或移除您定義或由 Glue AWS 預先定義的實體。微調動作可讓您進一步針對每個實體套用特定動作。其他優點包括：
+  系統偵測到資料後會隨即套用動作，使效能獲得改善。
+  可選擇包含或排除特定資料欄。
+  可使用部分遮罩。這可讓您部分遮罩偵測到的敏感資料實體，而非遮罩整個字串。支援具有位移和 regex 的兩種簡易參數。

 以下為用於下一節引用之範例任務的敏感資料偵測 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`，會發現範例任務中具有三種實體類型。這三種類型為 `Phone Number`、`USA_PASSPORT_NUMBER` 及 `USA_DRIVING_LICENSE`。對於這些實體類型，Glue AWS 將執行不同的動作，即 `PARTIAL_REDACT`、`REDACT`、 `SHA256_HASH`和 `DETECT`。每個實體類型也會具有要套用的 `sourceColumns` 和/或 `sourceColumnsToExclude` (如果偵測到)。

**注意**  
 每資料欄僅能使用一個就地編輯動作 (`PARTIAL_REDACT`、`SHA256_HASH`、或 `REDACT`)，但 `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# ` 經偵測為美國駕照號碼，因此遭遮蔽為 “USA\_DL” (如 `detectionParameters` 中所述)。

**注意**  
 由於 API 的性質，因此 classifyColumns API 無法與微調動作搭配使用。此 API 會執行資料欄取樣 (可依使用者調整，但具有預設值)，以加快執行偵測速度。由於此原因，微調動作將需要針對每個值進行反覆運算。

### 持續稽核日誌
<a name="sensitive-data-fine-grained-actions-persistent-audit-log"></a>

 全新引進具有微調動作的功能 (但在使用一般 API 時亦適用) 為產生持續稽核日誌。目前執行 detect API 將會新增其他資料欄 (預設為 `DetectedEntities`，但可透過 `outputColumnName` 自訂) 參數，其中包含 PII 偵測中繼資料。現在這樣會產生 "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
        }
    ]
}
```

 即使客戶使用不具有微調動作的 API (例如，`detect(entityTypesToDetect, outputColumnName)`)，仍會在產生的 DataFrame 中看見這項持續稽核日誌。

 使用具有微調動作之 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** 資料欄，可以在自訂程式碼中直接捨棄該額外資料欄。