在 AWS Glue Studio 外部使用敏感資料偵測 - AWS Glue

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

在 AWS Glue Studio 外部使用敏感資料偵測

AWS Glue Studio 可讓您偵測敏感資料,但您也可以在 AWS Glue Studio 外部使用敏感資料偵測功能。

如需受管敏感資料類型的完整清單,請參閱 Managed data types

使用 AWS 受管PII類型偵測敏感資料偵測

AWS Glue 在任務APIs中提供 AWS Glue ETL兩個 。它們是 detect()classifyColumns()

detect(frame: DynamicFrame, entityTypesToDetect: Seq[String], outputColumnName: String = "DetectedEntities", detectionSensitivity: String = "LOW"): DynamicFrame detect(frame: DynamicFrame, detectionParameters: JsonOptions, outputColumnName: String = "DetectedEntities", detectionSensitivity: String = "LOW"): DynamicFrame classifyColumns(frame: DynamicFrame, entityTypesToDetect: Seq[String], sampleFraction: Double = 0.1, thresholdFraction: Double = 0.1, detectionSensitivity: String = "LOW")

您可以使用 detect()API來識別 AWS 受管PII類型和自訂實體類型。系統會自動建立包含偵測結果的新欄。classifyColumns() API 會傳回地圖,其中索引鍵是資料欄名稱,而值是偵測到的實體類型清單。 SampleFraction表示掃描PII實體時要取樣的資料部分,而 ThresholdFraction表示資料欄識別為PII資料時必須符合的資料部分。

資料列層級偵測

在此範例中,任務使用 detect()classifyColumns() 執行下列動作APIs:

  • 從儲存 Amazon S3 貯體讀取資料並將其轉換為 dynamicFrame

  • 在 中偵測「電子郵件」和「信用卡」的執行個體 dynamicFrame

  • 傳回 dynamicFrame 具有原始值的 加上包含每一列偵測結果的一欄

  • 在另一個 Amazon S3 路徑 dynamicFrame 中寫入傳回的

import com.amazonaws.services.glue.GlueContext import com.amazonaws.services.glue.MappingSpec import com.amazonaws.services.glue.errors.CallSite import com.amazonaws.services.glue.util.GlueArgParser import com.amazonaws.services.glue.util.Job import com.amazonaws.services.glue.util.JsonOptions import org.apache.spark.SparkContext import scala.collection.JavaConverters._ import com.amazonaws.services.glue.ml.EntityDetector object GlueApp { def main(sysArgs: Array[String]) { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) Job.init(args("JOB_NAME"), glueContext, args.asJava) val frame= glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ","}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="AmazonS3_node1650160158526").getDynamicFrame() val frameWithDetectedPII = EntityDetector.detect(frame, Seq("EMAIL", "CREDIT_CARD")) glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput/", "partitionKeys": []}"""), transformationContext="someCtx", format="json").writeDynamicFrame(frameWithDetectedPII) Job.commit() } }

具有微調動作的資料列層級偵測

在此範例中,任務使用 detect() 執行下列動作APIs:

  • 從 Amazon S3 儲存貯體讀取資料,並將其轉換為 dynamicFrame

  • 在 中偵測「USA_PTIN」、「BANK_ACCOUNT」、「USA_SSN」、「USA_PASSPORTNUMBER_」和「PHONE_NUMBER」的敏感資料類型 dynamicFrame

  • 傳回 dynamicFrame 具有修改後遮罩值的 ,加上包含每一列偵測結果的一欄

  • 在另一個 Amazon S3 路徑 dynamicFrame 中寫入傳回的

與上述 相反detect()API,這會針對實體類型使用精細動作來偵測。如需詳細資訊,請參閱 使用 detect() 的偵測參數

import com.amazonaws.services.glue.GlueContext import com.amazonaws.services.glue.MappingSpec import com.amazonaws.services.glue.errors.CallSite import com.amazonaws.services.glue.util.GlueArgParser import com.amazonaws.services.glue.util.Job import com.amazonaws.services.glue.util.JsonOptions import org.apache.spark.SparkContext import scala.collection.JavaConverters._ import com.amazonaws.services.glue.ml.EntityDetector object GlueApp { def main(sysArgs: Array[String]) { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) Job.init(args("JOB_NAME"), glueContext, args.asJava) val frame = glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ","}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="AmazonS3_node_source").getDynamicFrame() val detectionParameters = JsonOptions( """ { "USA_DRIVING_LICENSE": [{ "action": "PARTIAL_REDACT", "sourceColumns": ["Driving License"], "actionOptions": { "matchPattern": "[0-9]", "redactChar": "*" } }], "BANK_ACCOUNT": [{ "action": "DETECT", "sourceColumns": ["*"] }], "USA_SSN": [{ "action": "SHA256_HASH", "sourceColumns": ["SSN"] }], "IP_ADDRESS": [{ "action": "REDACT", "sourceColumns": ["IP Address"], "actionOptions": {"redactText": "*****"} }], "PHONE_NUMBER": [{ "action": "PARTIAL_REDACT", "sourceColumns": ["Phone Number"], "actionOptions": { "numLeftCharsToExclude": 1, "numRightCharsToExclude": 0, "redactChar": "*" } }] } """ ) val frameWithDetectedPII = EntityDetector.detect(frame, detectionParameters, "DetectedEntities", "HIGH") glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput/", "partitionKeys": []}"""), transformationContext="AmazonS3_node_target", format="json").writeDynamicFrame(frameWithDetectedPII) Job.commit() } }

資料欄層級偵測

在此範例中,任務使用 執行下列動作classifyColumns()APIs:

  • 從 Amazon S3 儲存貯體讀取資料,並將其轉換為 dynamicFrame

  • 在 中偵測「電子郵件」和「信用卡」的執行個體 dynamicFrame

  • 設定參數以取樣 100% 的資料欄,如果實體位於 10% 的儲存格中,則將實體標記為已偵測到,並具有「LOW」敏感度

  • 傳回一個對應,其中金鑰為資料欄名稱,而值為偵測到的實體類型清單

  • 在另一個 Amazon S3 路徑 dynamicFrame 中寫入傳回的

import com.amazonaws.services.glue.GlueContext import com.amazonaws.services.glue.MappingSpec import com.amazonaws.services.glue.errors.CallSite import com.amazonaws.services.glue.util.GlueArgParser import com.amazonaws.services.glue.util.Job import com.amazonaws.services.glue.util.JsonOptions import org.apache.spark.SparkContext import scala.collection.JavaConverters._ import com.amazonaws.services.glue.DynamicFrame import com.amazonaws.services.glue.ml.EntityDetector object GlueApp { def main(sysArgs: Array[String]) { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) Job.init(args("JOB_NAME"), glueContext, args.asJava) val frame = glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ",", "optimizePerformance": false}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="frame").getDynamicFrame() import glueContext.sparkSession.implicits._ val detectedDataFrame = EntityDetector.classifyColumns( frame, entityTypesToDetect = Seq("CREDIT_CARD", "PHONE_NUMBER"), sampleFraction = 1.0, thresholdFraction = 0.1, detectionSensitivity = "LOW" ) val detectedDF = (detectedDataFrame).toSeq.toDF("columnName", "entityTypes") val DetectSensitiveData_node = DynamicFrame(detectedDF, glueContext) glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput", "partitionKeys": []}"""), transformationContext="someCtx", format="json").writeDynamicFrame(DetectSensitiveData_node) Job.commit() } }

使用 AWS CustomEntityType PII類型偵測敏感資料偵測

您可以透過 AWS Studio 定義自訂實體。不過,若要在 AWS Studio 中使用此功能,您必須先定義自訂實體類型,然後將定義的自訂實體類型新增至 清單entityTypesToDetect

如果您的資料中有特定的敏感資料類型 (例如 'Employee Id'),您可以呼叫 CreateCustomEntityType() 來建立自訂實體API。下列範例使用 請求參數定義 CreateCustomEntityType() API 的自訂實體類型 'EMPLOYEE_ID':

{ "name": "EMPLOYEE_ID", "regexString": "\d{4}-\d{3}", "contextWords": ["employee"] }

然後,透過將自訂實體類型 (EMPLOYEE_ID) 新增至 EntityDetector() ,修改任務以使用新的自訂敏感資料類型API:

import com.amazonaws.services.glue.GlueContext import com.amazonaws.services.glue.MappingSpec import com.amazonaws.services.glue.errors.CallSite import com.amazonaws.services.glue.util.GlueArgParser import com.amazonaws.services.glue.util.Job import com.amazonaws.services.glue.util.JsonOptions import org.apache.spark.SparkContext import scala.collection.JavaConverters._ import com.amazonaws.services.glue.ml.EntityDetector object GlueApp { def main(sysArgs: Array[String]) { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) Job.init(args("JOB_NAME"), glueContext, args.asJava) val frame= glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ","}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="AmazonS3_node1650160158526").getDynamicFrame() val frameWithDetectedPII = EntityDetector.detect(frame, Seq("EMAIL", "CREDIT_CARD", "EMPLOYEE_ID")) glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput/", "partitionKeys": []}"""), transformationContext="someCtx", format="json").writeDynamicFrame(frameWithDetectedPII) Job.commit() } }
注意

如果使用與現有受管實體類型相同的名稱來定義自訂敏感資料類型,則自訂敏感資料類型將優先,並覆寫受管實體類型的邏輯。

使用 detect() 的偵測參數

此方法用於偵測 中的實體 DynamicFrame。它會傳回 DataFrame 具有原始值的新 和 outputColumnName 具有PII偵測中繼資料的額外資料欄。自訂遮罩可以在 中 DynamicFrame 傳回後完成 AWS Glue 指令碼或具有精細動作的 detect() API可以改為使用。

detect(frame: DynamicFrame, entityTypesToDetect: Seq[String], outputColumnName: String = "DetectedEntities", detectionSensitivity: String = "LOW"): DynamicFrame

參數:

  • frame – (類型:DynamicFrame) DynamicFrame 包含要處理之資料的輸入。

  • entityTypesToDetect – (類型:[Seq[String]) 要偵測的實體類型清單。可以是受管實體類型或自訂實體類型。

  • outputColumnName – (類型:String,預設值:"DetectedEntities) 儲存偵測到實體的欄名稱。如果未提供,預設資料欄名稱為 "DetectedEntities"。

  • detectionSensitivity – (類型:String,選項:"LOW" 或 "HIGH",預設值:"LOW") 指定偵測程序的敏感度。有效選項為「LOW」或「HIGH」。如果未提供,預設敏感度會設為「LOW」。

outputColumnName 設定:

資料欄的名稱,其中偵測到的實體將會受到儲存。如果未提供,預設資料欄名稱為 "DetectedEntities"。針對輸出資料欄中的每一列,補充資料欄會包含資料欄名稱至偵測到之實體中繼資料的對應,其中包含下列鍵值組:

  • entityType – 偵測到的實體類型。

  • start:原始資料中偵測到的實體起始位置。

  • start:原始資料中偵測到的實體結束位置。

  • actionUsed – 在偵測到的實體上執行的動作 (例如 "DETECT、" "REDACT、" "PARTIAL_REDACT、" "SHA256_HASH")。

範例:

{ "DetectedEntities":{ "SSN Col":[ { "entityType":"USA_SSN", "actionUsed":"DETECT", "start":4, "end":15 } ], "Random Data col":[ { "entityType":"BANK_ACCOUNT", "actionUsed":"PARTIAL_REDACT", "start":4, "end":13 }, { "entityType":"IP_ADDRESS", "actionUsed":"REDACT", "start":4, "end":13 } ] } }

具有微調動作之 detect() 的偵測參數

此方法用於 DynamicFrame 偵測使用指定參數之 中的實體。它會傳回新的 DataFrame ,並將原始值取代為遮罩敏感資料,並傳回outputColumnName具有PII偵測中繼資料的額外資料欄。

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

參數:

  • frame – (類型:DynamicFrame): DynamicFrame 包含要處理之資料的輸入。

  • detectionParameters – (類型:JsonOptions):指定偵測程序參數JSON的選項。

  • outputColumnName – (類型:String,預設值:"DetectedEntities):儲存偵測到實體的欄名稱。如果未提供,預設資料欄名稱為 "DetectedEntities"。

  • detectionSensitivity – (類型:String,選項:"LOW" 或 "HIGH",預設值:"LOW"):指定偵測程序的敏感度。有效選項為「LOW」或「HIGH」。如果未提供,預設敏感度會設為「LOW」。

detectionParameters 設定

如果未包含任何設定,則會使用預設值。

  • 動作 – (類型:String、選項:"DETECT"、"REDACT"、"PARTIAL_REDACT"、"SHA256_HASH") 指定要在實體上執行的動作。必要。請注意,執行遮罩的動作 (除了 "DETECT" 之外) 每欄只能執行一個動作。此為遮罩合併實體的預防措施。

  • sourceColumns – (類型:List[String],預設值:【「*」】) 要對實體執行偵測的來源資料欄名稱清單。如果不存在,則會預設為 [“*”]。如果使用無效的資料欄名稱,則會引發 IllegalArgumentException

  • sourceColumnsTo排除 – (類型:List[String]) 要對實體在 上執行偵測的來源資料欄名稱清單。使用 sourceColumnssourceColumnsToExclude。如果使用無效的資料欄名稱,則會引發 IllegalArgumentException

  • actionOptions – 根據指定動作的其他選項:

    • 對於 "DETECT" 和 "SHA256_HASH",不允許任何選項。

    • 對於 "REDACT":

      • redactText – (類型:String,預設值:「*****」) 取代偵測到實體的文字。

    • 對於 "PARTIAL_REDACT":

      • redactChar – (類型:String,預設值:"*") 取代實體中每個偵測到字元的字元。

      • matchPattern – (類型:String) 用於部分修訂的 Regex 模式。無法與 numLeftCharsToExclude 或 結合numRightCharsToExclude

      • numLeftCharsToExclude – (類型:String, integer) 要排除的左側字元數。無法與 結合matchPattern使用,但可與 結合使用numRightCharsToExclude

      • numRightCharsToExclude – (類型:String, integer) 要排除的正確字元數。無法與 結合matchPattern使用,但可與 結合使用numRightCharsToExclude

outputColumnName 設定

請參閱 outputColumnName 設定

適用於 classifyColumns() 的偵測參數

此方法用於偵測 中的實體 DynamicFrame。此方法會傳回一個對應,其中金鑰為資料欄名稱,而值為偵測到的實體類型清單。自訂遮罩可以在 中傳回後完成 AWS Glue 指令碼。

classifyColumns(frame: DynamicFrame, entityTypesToDetect: Seq[String], sampleFraction: Double = 0.1, thresholdFraction: Double = 0.1, detectionSensitivity: String = "LOW")

參數:

  • frame – (類型:DynamicFrame) DynamicFrame 包含要處理之資料的輸入。

  • entityTypesToDetect – (類型:Seq[String]) 要偵測的實體類型清單。可以是受管實體類型或自訂實體類型。

  • sampleFraction – (類型:Double,預設值:10%) 掃描PII實體時要取樣的資料部分。

  • thresholdFraction – (類型:Double,預設值:10%):資料必須滿足才能將資料欄識別為PII資料的部分。

  • detectionSensitivity – (類型:String,選項:"LOW" 或 "HIGH",預設值:"LOW") 指定偵測程序的敏感度。有效選項為「LOW」或「HIGH」。如果未提供,預設敏感度會設為「LOW」。