Log Obfuscation

Este interceptor é usado para ocultar dados selecionados (presentes no header ou body de uma requisição ou resposta) no log do Trace.

Para criar logs no Trace (acessados por meio do ícone icon view), é necessário utilizar o Log interceptor. Se quiser que os dados sejam criptografados ao invés de ofuscados, é só configurar essa opção no próprio interceptor de Log.

Configurando o interceptor

Para configurar o interceptor de Log Obfuscation, é necessário informar a localização (Location — body ou header) da informação a ser ofuscada. Se a informação que você deseja omitir estiver localizada no corpo (body) da requisição, defina uma expressão regular para que a informação seja identificada (Custom regex). Se estiver no header, informe o atributo (Attribute), usando letras minúsculas. Por fim, defina os símbolos nos quais a informação será transformada (no campo Replace to).

O campo Replace to também aceita backreferences, o que permite preservar trechos do valor original no log — como os primeiros e os últimos dígitos de um documento. Veja Preservando parte do valor original.
log obfuscation
É possível ofuscar múltiplas informações com um único interceptor de Log Obfuscation usando uma expressão regular adequada (como explicado aqui). Válido para informações que estiverem no body da requisição.

Exemplos de ofuscamento de uma única informação

Imagine que o corpo de uma requisição contenha as informações a seguir:

{
  "name": "Jonathan Crane",
  "alias": "Scarecrow",
  "baseOfOperations": [
    "Gotham City",
    "Arkham Asylum"
  ],
  "status": {
    "alignment": "bad",
    "citizenship": "american",
    "maritalStatus": "single",
    "occupation": [
      "anarchist",
      "serial killer",
      "former psychiatrist",
      "university professor"
    ],
    "active": true
  },
  "characteristics": {
    "gender": "male",
    "height": 1.83,
    "weight": 64,
    "eyes": "blue",
    "hair": "brown"
  }
}

Para ofuscar um campo é necessário criar uma expressão regular adequada. Se quisermos ofuscar o campo "name", por exemplo, podemos incluir as configurações:

log obfuscation ex name

Como resultado, o Trace mostrará o seguinte log para essa requisição:

{
  "name": **********,
  "alias": "Scarecrow",
  "baseOfOperations": [
    "Gotham City",
    "Arkham Asylum"
  ],
  "status": {
    "alignment": "bad",
    "citizenship": "american",
    "maritalStatus": "single",
    "occupation": [
      "anarchist",
      "serial killer",
      "former psychiatrist",
      "university professor"
    ],
    "active": true
  },
  "characteristics": {
    "gender": "male",
    "height": 1.83,
    "weight": 64,
    "eyes": "blue",
    "hair": "brown"
  }
}

Para ofuscar o campo "occupation", podemos incluir as configurações:

log obfuscation ex occupation

Como resultado, o Trace mostrará o seguinte log para essa requisição:

{
  "name": "Jonathan Crane",
  "alias": "Scarecrow",
  "baseOfOperations": [
    "Gotham City",
    "Arkham Asylum"
  ],
  "status": {
    "alignment": "bad",
    "citizenship": "american",
    "maritalStatus": "single",
    "occupation": ##########,
    "active": true
  },
  "characteristics": {
    "gender": "male",
    "height": 1.83,
    "weight": 64,
    "eyes": "blue",
    "hair": "brown"
  }
}

Por fim, para ofuscar o campo "characteristics", uma forma é incluir as configurações:

log obfuscation ex characteristics

Como resultado, o Trace mostrará o seguinte log para essa requisição:

{
  "name": "Jonathan Crane",
  "alias": "Scarecrow",
  "baseOfOperations": [
    "Gotham City",
    "Arkham Asylum"
  ],
  "status": {
    "alignment": "bad",
    "citizenship": "american",
    "maritalStatus": "single",
    "occupation": [
      "anarchist",
      "serial killer",
      "former psychiatrist",
      "university professor"
    ],
    "active": true
  },
  "characteristics": {****}
}

Se combinarmos os três interceptores, sequencialmente, o Trace mostrará o seguinte log para essa requisição:

{
  "name": **********,
  "alias": "Scarecrow",
  "baseOfOperations": [
    "Gotham City",
    "Arkham Asylum"
  ],
  "status": {
    "alignment": "bad",
    "citizenship": "american",
    "maritalStatus": "single",
    "occupation": ##########,
    "active": true
  },
  "characteristics": {****}
}

Porém, uma forma melhor de ofuscar múltiplos campos é utilizando uma única expressão regular mais abrangente (veja nos exemplos abaixo).

Exemplo de ofuscamento de informação do header

Para ofuscar uma informação contida no header da requisição, selecione a localização e informe o atributo.

O atributo deve ser escrito usando letras minúsculas.

Atributos informados em letras maiúsculas ou começando por letra maiúscula não serão ocultados e assim, aparecerão no Trace.

Exemplo de configuração para ocultar o atributo authorization:

log obfuscation header

Como resultado, o Trace mostrará o seguinte log para essa requisição:

host: api-testing.sensedia.com
authorization: **********
user-agent: PostmanRuntime/7.28.4
accept: */*
postman-token: 1234a-bcd5-67abc-defg789xyz
accept-encoding: gzip, deflate, br
x-forwarded-for: 123.45.678.900
x-forwarded-proto: https
x-envoy-external-address: 123.45.678.900
x-request-id: abcdefg-456f-789g-00gh-hijk10
content-length: 0

Configure um interceptor de Log Obsfuscation para cada atributo que você deseja ocultar. Para atributos do header, não há como configurar múltiplas informações no mesmo interceptor.

Veja a seguir como ofuscar múltiplas informações do body da requisição.

Expressão regular para múltiplas informações

Quando o conjunto de dados fizer parte de um JSON, a expressão regular para múltiplas informações segue a estrutura:

(?<=(<chaves>):)\s*(<regex_tipos>)
O "\s*" da expressão regular serve para ignorar quaisquer espaços brancos entre chave e valor.

Tanto as chaves (informações) quanto as regex para cada tipo de valor devem ser separados por "|".

As regex para os correspondentes tipos de valor são:

  • números, booleanos e null: [\+\-\w.]+

  • strings: "[^"]*"

  • arrays simples: \[[^\]]*\]

  • objetos simples: \{[^\}]*\}

Exemplos de ofuscamento de múltiplas informações

Agora, imagine que o corpo de uma requisição contenha as informações a seguir:

{
  "name": "Pamela Lillian Isley",
  "alias": "Poison Ivy",
  "baseOfOperations": "Gotham City",
  "status": {
    "alignment": "neutral",
    "citizenship": "american",
    "maritalStatus": "single",
    "occupation": [
      "scientist",
      "eco-terrorist"
    ],
    "active": true
  },
  "characteristics": {
    "gender": "female",
    "height": 1.68,
    "weight": 50,
    "eyes": "green",
    "hair": "red"
  }
}

Para ofuscar simultaneamente os campos "name", "occupation" e "characteristics", por exemplo, podemos incluir as configurações:

log obfuscation ex multiple

Como resultado, o Trace mostrará o seguinte log para essa requisição:

{
  "name":*****,
  "alias": "Poison Ivy",
  "baseOfOperations": "Gotham City",
  "status": {
    "alignment": "neutral",
    "citizenship": "american",
    "maritalStatus": "single",
    "occupation":*****,
    "active": true
  },
  "characteristics":*****
}

Por outro lado, para ofuscar simultaneamente os campos "name", "citizenship", "maritalStatus", "active", "height" e "weight", por exemplo, basta trocar a regex anterior por:

(?<=("name"|"citizenship"|"maritalStatus"|"active"|"height"|"weight"):)\s*("[^"]*"|[\+\-\w.]+)

Como resultado, o Trace mostrará o seguinte log para essa requisição:

{
  "name":*****,
  "alias": "Poison Ivy",
  "baseOfOperations": "Gotham City",
  "status": {
    "alignment": "neutral",
    "citizenship":*****,
    "maritalStatus":*****,
    "occupation": [
      "scientist",
      "eco-terrorist"
    ],
    "active":*****
  },
  "characteristics": {
    "gender": "female",
    "height":*****,
    "weight":*****,
    "eyes": "green",
    "hair": "red"
  }
}
Diferente do caso em que foram utilizados múltiplos interceptores, os símbolos usados para ofuscar as informações são obrigatoriamente os mesmos.

Preservando parte do valor original (backreferences)

Além de texto literal, o campo Replace to aceita backreferences: referências aos grupos de captura definidos na expressão regular do campo Custom regex. Com isso é possível aplicar uma ofuscação parcial, mantendo no log apenas os trechos do valor original que você quiser preservar.

Sintaxe suportada

Token Significado

$1, $2, …

Conteúdo do grupo de captura numerado correspondente.

${nome}

Conteúdo do grupo de captura nomeado (?<nome>...).

\$

Cifrão literal ($).

\\

Barra invertida literal (\).

Como $ e \ passaram a ter significado especial no campo Replace to, um cifrão literal precisa ser escapado como \$. Um $ solto — não seguido de número ou de {nome} — é rejeitado na validação.

Exemplos de ofuscamento parcial

Para manter os 3 primeiros e os 2 últimos dígitos de um campo do body, podemos incluir as configurações:

  • Custom regex: ("documento"\s*:\s*")([^"]{3})[^"]*?([^"]{2})(?=")

  • Replace to: $1$2*******$3

Se o corpo da requisição contiver:

{"documento":"12345678900","nome":"fulano"}

Como resultado, o Trace mostrará o seguinte log para essa requisição:

{"documento":"123*******00","nome":"fulano"}

Para manter os 2 primeiros caracteres de um atributo do header, podemos incluir as configurações:

  • Attribute: token

  • Custom regex: ([0-9]{2})[0-9]*

  • Replace to: $1**

Nesse caso, o valor original 123456 aparecerá no Trace como 12**.

A mesma referência pode ser feita pelo nome do grupo de captura, em vez do número:

  • Custom regex: (?<inicio>[0-9]{2})[0-9]*

  • Replace to: ${inicio}**

O resultado é idêntico ao do exemplo anterior.

A quantidade de símbolos definida no Replace to é fixa e não acompanha o tamanho do valor original. Dessa forma, o log não revela quantos caracteres foram ocultados.

Validações da configuração

A combinação Custom regex + Replace to é validada ao salvar a revisão — inclusive contra todos os ambientes com deploy ativo — e também no deploy. Configurações inválidas são rejeitadas com o status HTTP 400.

As mensagens são retornadas em inglês pelo Manager. Nelas, %s é substituído pelo nome do interceptor e, quando aplicável, pelo nome do grupo ou pela referência inválida.

Caso Mensagem

Expressão regular inválida em Custom regex

Interceptor '%s' has an invalid regular expression in 'Custom regex'.

Referência a grupo numerado inexistente (por exemplo, $3 com uma regex de 2 grupos)

Interceptor '%s' field 'Replace to' references capture group 3, but the regular expression defines only 2 capture group(s).

Referência a grupo nomeado inexistente

Interceptor '%s' field 'Replace to' references named group '%s', which is not defined in the regular expression.

$ solto, ${ sem fechamento ou \ no final

Interceptor '%s' field 'Replace to' contains an invalid reference ('%s'). Use \$ for a literal '$'.

Quando a Custom regex usa uma variável de ambiente, o valor não é conhecido no momento de salvar. Nesse caso, apenas a sintaxe do Replace to é validada ao salvar; as validações que dependem da expressão regular ocorrem no deploy, com a variável já resolvida.

Vídeo

Quer entender melhor como ofuscar dados do Trace usando o Log Obfuscation? Dê uma olhada no vídeo abaixo, gravado por nosso Sensedier Marco Milleo.

Thanks for your feedback!
EDIT

Share your suggestions with us!
Click here and then [+ Submit idea]