在 Amazon Glue Studio 外部使用敏感数据检测 - Amazon Glue
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon Glue Studio 外部使用敏感数据检测

Amazon Glue Studio 允许您检测敏感数据,但是,您也可以在 Amazon Glue Studio 之外使用敏感数据检测功能。

有关托管的敏感数据类型的完整列表,请参阅 Managed data types

使用 Amazon 托管 PII 类型检测敏感数据检测

Amazon Glue 在一个 Amazon Glue ETL 任务中提供了两个 API。它们是 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 来识别 Amazon 托管 PII 类型和自定义实体类型。将使用检测结果自动创建一个新列。classifyColumns() API 将返回一个映射,其中键是列名,值是检测到的实体类型列表。SampleFraction 表示扫描 PII 实体时要采样的一小部分数据,而 ThresholdFraction 表示为了将列标识为 PII 数据而必须满足的一小部分数据。

行级别检测

在示例中,该任务使用 detect()classifyColumns() API 执行以下操作:

  • 从 Amazon S3 存储桶中读取数据并将其变成 DynamicFrame

  • 在 dynamicFrame 中检测“电子邮件”和“信用卡”的实例

  • 返回一个 dynamicFrame,其中包含原始值和一列,其中包含每行的检测结果

  • 将返回的 DynamicFrame 写入另一条路径 Amazon S3

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() API 执行以下操作:

  • 从 Amazon S3 存储桶读取数据并将其转换为 dynamicFrame

  • 检测 dynamicFrame 中的“USA_PTIN”、“ BANK_ACCOUNT”、“USA_SSN”、“USA_PASSPORT_NUMBER”和“PHONE_NUMBER”等敏感数据类型

  • 返回一个 dynamicFrame,其中包含修改后的遮蔽值以及一个包含每行的检测结果的列

  • 将返回的 dynamicFrame 写入另一个 Amazon S3 路径

与上述 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() API 执行以下操作:

  • 从 Amazon S3 存储桶读取数据并将其转换为 dynamicFrame

  • 在 dynamicFrame 中检测“电子邮件”和“信用卡”的实例

  • 将参数设置为对列进行 100% 采样,如果实体位于 10% 的单元格中,并且敏感性为“低”,则将其标记为已检测

  • 返回一个以列名为键,以检测到的实体类型列表为值的映射

  • 将返回的 dynamicFrame 写入另一个 Amazon S3 路径

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() } }

使用 Amazon CustomEntityType PII 类型检测敏感数据检测

您可以通过 Amazon Studio 定义自定义实体。但是,要在 Amazon Studio 中使用此功能,必须先定义自定义实体类型,然后将定义的自定义实体类型添加到列表中entityTypesToDetect

如果您的数据中有特定的敏感数据类型(例如“员工 ID”),则可以通过调用 CreateCustomEntityType() API 创建自定义实体。以下示例使用请求参数将自定义实体类型“EMPLOYEE_ID”定义到 CreateCustomEntityType() API:

{ "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 包含原始值的新列和一个包含 PII 检测元数据的附加列 outputColumnName 。自定义屏蔽可以在Amazon Glue脚本中返回后完成,也可以改用带有细粒度操作的 DynamicFrame detect () API。

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

参数:

  • fram e —(类型:DynamicFrame) DynamicFrame 包含待处理数据的输入。

  • entityTypesTo检测-(类型:[Seq[String])要检测的实体类型列表。可以是托管式实体类型,也可以是自定义实体类型。

  • outputColumnName—(type:String,默认值:DetectedEntities“”)存储检测到的实体的列的名称。如果未提供,则默认列名为 “DetectedEntities”。

  • detectionSensitivity –(类型:String,选项:“低”或“高”,默认值:“低”)指定检测过程的灵敏度。有效选项为“低”或“高”。如果未提供此参数,则默认灵敏度设置为“低”。

outputColumnName 设置:

用于存储检测到的实体的列名。如果未提供,则默认列名为 “DetectedEntities”。对于输出列中的每一行,补充列都用以下键值对来包含了列名与检测到的实体元数据的映射:

  • entityType – 检测到的实体类型。

  • start – 检测到的实体在原始数据中的起始位置。

  • end – 检测到的实体在原始数据中的结束位置。

  • 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 列,其原始值替换为屏蔽的敏感数据,以及一个包含 PII 检测元数据的附加列outputColumnName

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

参数:

  • fram e —(类型:DynamicFrame): DynamicFrame 包含待处理数据的输入。

  • detectionParameters –(类型:JsonOptions):为检测进程指定参数的 JSON 选项。

  • outputColumnName—(type:String,默认值:"DetectedEntities“):将存储检测到的实体的列的名称。如果未提供,则默认列名为 “DetectedEntities”。

  • detectionSensitivity –(类型:String,选项:“低”或“高”,默认值:“低”):指定检测过程的灵敏度。有效选项为“低”或“高”。如果未提供此参数,则默认灵敏度设置为“低”。

detectionParameters 设置

如果未包含任何设置,则将使用默认值。

  • action –(类型: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)用于部分编辑的正则表达式模式。不能与 numLeftCharsToExclude 或结合使用numRightCharsToExclude

      • numLeftCharsToExclude—(类型:String, integer)要排除的左侧字符数。不能与 matchPattern 组合使用,但可以与 numRightCharsToExclude 组合使用。

      • numRightCharsToExclude—(类型:String, integer)要排除的正确字符数。不能与 matchPattern 组合使用,但可以与 numRightCharsToExclude 组合使用。

outputColumnName 设置

查看 outputColumnName 设置

classifyColumns() 方法的检测参数

此方法用于检测中的实体 DynamicFrame。这将返回一个以列名为键,以检测到的实体类型列表为值的映射。返回此映射后可以在 Amazon Glue 脚本中进行自定义遮蔽。

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

参数:

  • fram e —(类型:DynamicFrame) DynamicFrame 包含待处理数据的输入。

  • entityTypesTo检测-(类型:Seq[String])要检测的实体类型列表。可以是托管式实体类型,也可以是自定义实体类型。

  • sampleFraction –(类型:Double,默认值:10%)扫描 PII 实体时的数据采样率。

  • thresholdFraction –(类型:Double,默认值:10%):要将列标识为 PII 数据时必须达到的数据占比。

  • detectionSensitivity –(类型:String,选项:“低”或“高”,默认值:“低”)指定检测过程的灵敏度。有效选项为“低”或“高”。如果未提供此参数,则默认灵敏度设置为“低”。