nota
As ações minuciosas só estão disponíveis no AWS Glue versões 3.0 e 4.0. Isso inclui a experiência do AWS Glue Studio. As alterações persistentes do log de auditoria também não estão disponíveis na versão 2.0.
Todas as tarefas visuais do AWS Glue Studio 3.0 e 4.0 terão um script criado que usa automaticamente APIs de ações minuciosas.
A transformação Detectar dados confidenciais permite detectar, mascarar ou remover entidades definidas por você ou que são predefinidas pelo AWS Glue. Além disso, ações minuciosas permitem que você aplique uma ação específica por entidade. Os benefícios adicionais incluem:
-
Performance aprimorada à medida que as ações são aplicadas assim que os dados são detectados.
-
A opção de incluir ou excluir colunas específicas.
-
A capacidade de usar mascaramento parcial. Isso permite mascarar parcialmente as entidades de dados confidenciais detectadas, em vez de mascarar a string inteira. Ambos os parâmetros simples com deslocamentos e regex são aceitos.
A seguir são mostrados trechos de código de APIs de detecção de dados confidenciais e ações minuciosas usados nos exemplos de trabalhos mencionados na próxima seção.
API de detecção: as ações minuciosas usam o novo parâmetro detectionParameters
:
def detect(
frame: DynamicFrame,
detectionParameters: JsonOptions,
outputColumnName: String = "DetectedEntities",
detectionSensitivity: String = "LOW"
): DynamicFrame = {}
Usar APIs de detecção de dados confidenciais com ações minuciosas
As APIs de detecção de dados confidenciais que usam detect analisam os dados fornecidos, determinam se as linhas ou colunas são tipos de entidades de dados confidenciais e executam ações especificadas pelo usuário para cada tipo de entidade.
Usar a API de detecção com ações minuciosas
Use a API detect e especifique outputColumnName
e
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://189657479688-ddevansh-pii-test-bucket/test-output/", "partitionKeys": []}"""), transformationContext="S3bucket_node3", format="json").writeDynamicFrame(DetectSensitiveData_node2)
Job.commit()
}
O script acima criará um DataFrame com base em um local no Amazon S3 e, em seguida, executará a API detect
. Como a API detect
exige que o campo detectionParameters
(um mapa do nome da entidade para uma lista de todas as configurações de ação a serem usadas para essa entidade) seja representado pelo objeto JsonOptions
do AWS Glue, ela também nos permitirá estender a funcionalidade da API.
Para cada ação especificada por entidade, insira uma lista de todos os nomes das colunas às quais deseja aplicar a combinação entidade/ação. Isso permite personalizas as entidades a serem detectadas em cada coluna em seu conjunto de dados e ignorar as entidades que você sabe que não estão em uma coluna específica. Isso também permite que seus trabalhos apresentem uma melhor performance ao não realizar chamadas de detecção desnecessárias para essas entidades e permite a você executar ações exclusivas para cada combinação de coluna e entidade.
Examinando mais de perto o detectionParameters
, há três tipos de entidades no trabalho de exemplo. São elas: Phone Number
, USA_PASSPORT_NUMBER
e USA_DRIVING_LICENSE
. Para cada um desses tipos de entidade, o AWS Glue executará ações diferentes que são PARTIAL_REDACT
, SHA256_HASH
, REDACT
e DETECT
. Cada um dos tipos de entidade também tem sourceColumns
para ser aplicado a ele e/ou sourceColumnsToExclude
, se detectado.
nota
Somente uma ação de edição no local (PARTIAL_REDACT
, SHA256_HASH
ou REDACT
) pode ser usada por coluna, mas a ação DETECT
pode ser usada com qualquer uma dessas ações.
O campo detectionParameters
tem o layout abaixo:
ENTITY_NAME -> List[Actions]
{
"ENTITY_NAME": [{
Action, // required
ColumnSpecs,
ActionOptionsMap
}],
"ENTITY_NAME2": [{
...
}]
}
Os tipos de actions
e actionOptions
estão listados abaixo:
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"
]
}
Depois que o script é executado, os resultados são enviados para a localização específica do Amazon S3. Você pode visualizar seus dados no Amazon S3, mas com os tipos de entidade selecionados sendo sensibilizados com base na ação selecionada. No caso, teríamos uma linha que teria a seguinte aparência:
{
"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"
}
No script acima, o Phone Number
foi parcialmente redigido com #
. O Passport No
foi transformado em um hash SHA256. O DL NO#
foi detectado como um número da carteira de motorista dos EUA e foi redigido como "USA_DL", assim como indicado no detectionParameters
.
nota
A API classifyColumns não está disponível para uso com ações minuciosas devido à natureza da API. Essa API realiza a amostragem de colunas (ajustável pelo usuário, mas tem valores padrão) para realizar a detecção mais rapidamente. Por esse motivo, as ações minuciosas exigem a iteração de cada valor.
Log de auditoria persistente
Um novo recurso introduzido com ações minuciosas (mas também disponível ao usar as APIs normais) é a presença de um log de auditoria persistente. No momento, a execução da API de detecção acrescenta um parâmetro adicional de coluna (o padrão é DetectedEntities
, mas ele personalizável via outputColumnName
) com metadados de detecção de PII. Ela agora tem uma chave de metadados "actionUsed", que é uma de 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
}
]
}
Até mesmo clientes que usam APIs sem ações minuciosas, como detect(entityTypesToDetect, outputColumnName)
, verão esse log de auditoria persistente no dataframe resultante.
Os clientes que usam APIs com ações minuciosas verão todas as ações, independentemente de terem sido editadas ou não. Exemplo:
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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}]}} |
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Se você não quiser ver a coluna DetectedEntities, basta soltar a coluna adicional em um script personalizado.