Mascaramento de dados usando o PostgreSQL Anonymizer

Databases for PostgreSQL O Anonymizer é uma extensão do PostgreSQL projetada para tornar os dados anônimos, mascarando ou substituindo informações comerciais sensíveis e de identificação pessoal em um banco de dados do Databases for PostgreSQL.

A extensão é compatível com as seguintes estratégias de mascaramento, cada uma delas adequada a diferentes casos de uso:

  • Mascaramento estático: Remover as PII de acordo com as regras.
  • Mascaramento dinâmico: oculte as PII somente para os usuários mascarados.
  • Despejos anônimos: Basta exportar os dados mascarados para um arquivo SQL.
  • Generalização: Substitui valores específicos por categorias ou intervalos mais amplos e menos precisos.

Mascaramento estático

O mascaramento estático é uma técnica de anonimização de dados que substitui irreversivelmente informações confidenciais por valores gerados sinteticamente, valores que preservam o formato. Esse processo garante a remoção completa e permanente dos dados originais, eliminando assim a a possibilidade de reidentificação ou reconstrução. Para obter mais informações, consulte Mascaramento estático.

Ativação do mascaramento estático

  1. Instale a extensão Anonymizer.

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. Inicialize o anonimizador.

    select public.run_anon_init();
    
  3. Definir regras de mascaramento.

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION anon.<masking_function>()';
    
  4. Verifique as regras de mascaramento aplicadas.

    SELECT objoid::regclass, provider, label
    FROM pg_seclabel
    WHERE provider = 'anon' AND objoid = '<table_name>'::regclass;
    
  5. Aplique as regras permanentemente. O comando abaixo substitui permanentemente os dados originais na tabela especificada pelos dados mascarados.

    SELECT anon.anonymize_table('<table_name>');
    
  • O mascaramento estático é um processo lento. O princípio do mascaramento estático é atualizar todas as linhas de todas as tabelas que contenham pelo menos uma coluna mascarada. Isso significa que o PostgreSQL reescreverá todos os dados no disco. Dependendo do tamanho do banco de dados, do hardware e da configuração da instância, pode ser mais rápido exportar os dados anônimos e recarregá-los no banco de dados.

  • Para aplicar o mascaramento a linhas recém-inseridas em uma tabela, execute o seguinte comando.

    SELECT anon.anonymize_table('<table_name>');
    

    Esse comando garante que todos os novos dados adicionados à tabela sejam mascarados de acordo com as regras de anonimização configuradas.

Mascaramento dinâmico

O mascaramento dinâmico permite que o proprietário do banco de dados oculte dados confidenciais para usuários específicos, enquanto permite que usuários autorizados acessem e modifiquem os valores originais e não mascarados. Para obter mais informações, consulte Mascaramento dinâmico.

Ativação do mascaramento dinâmico

  1. Instale a extensão Anonymizer.

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. Inicialize o anonimizador.

    select public.run_anon_init();
    
  3. Ativar o mecanismo de mascaramento dinâmico.

    show anon.transparent_dynamic_masking;
    
    select public.enable_dynamic_masking ('<database_name>');
    

    Reinicie sua sessão se anon.transparent_dynamic_masking estiver sendo exibido como desativado.

  4. Crie a função para acesso mascarado.

    CREATE ROLE <role_name> LOGIN;
    
  5. Marque a função como um usuário mascarado.

      SECURITY LABEL FOR anon ON ROLE <role_name> IS 'MASKED';
    
  6. Conceder permissões na tabela de mascaramento a uma função.

      grant select on <schema_name>.<table_name> to <role_name> ;
    
  7. Declare as regras de mascaramento.

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION anon.<masking_function>()';
    
  8. Verifique as regras de mascaramento.

    SELECT objoid::regclass, provider, label
    FROM pg_seclabel
    WHERE provider = 'anon' AND objoid = '<table_name>'::regclass;
    
  9. Conecte-se ao banco de dados usando a função mascarada e consulte a tabela. Você deverá ver os dados mascarados de acordo com as regras definidas.

select * from <table_name>;

Notas:

  • O anonimizador mascara os dados com base em quem está consultando.
  • As funções mascaradas não devem ter permissão para inserir, atualizar ou excluir dados.
  • Você pode mascarar a tabela em vários esquemas.
  • Uma regra de mascaramento pode quebrar a integridade dos dados. Por exemplo, você pode mascarar uma coluna que tenha uma restrição UNIQUE com o valor NULL. Cabe a você decidir se os usuários da máscara precisam ou não da integridade dos dados.
  • As funções mascaradas não têm permissão para usar o EXPLAIN.

Despejos anônimos

Um dump anônimo refere-se ao processo de exportação de um banco de dados que contém dados anônimos ou não identificados, em vez dos valores confidenciais originais. Normalmente, isso é feito para compartilhar, migrar ou analisar dados com segurança sem expor informações de identificação pessoal (PII) ou atributos confidenciais. Para obter mais informações, consulte Despejos anônimos.

Habilitação de despejos anônimos

  1. Instale a extensão Anonymizer.

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. Inicialize o anonimizador.

    select public.run_anon_init();
    
  3. Crie um esquema dedicado para funções de mascaramento personalizadas.

     CREATE SCHEMA IF NOT EXISTS <schema_name>;
    
  4. Criar uma função para exportar dados mascarados.

     CREATE ROLE <role_name> LOGIN PASSWORD '<enter_password>';
    
  5. Ativar o mascaramento da função.

    select  public.enable_masking_for_dump('<role_name>','<schema_name>');
    
  6. Defina uma função de mascaramento personalizada, como no exemplo a seguir.

    CREATE OR REPLACE FUNCTION <schema_name>.remove_content(j JSONB)
    RETURNS JSONB
    AS $func$
      SELECT j - ARRAY['content']
    $func$
    LANGUAGE SQL;
    
  7. Crie uma regra de mascaramento.

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION <schema_name>.<custom_masking_function>()';
    
  8. Identifique a função como uma função mascarada.

    SECURITY LABEL FOR anon ON ROLE <schema_name> IS 'MASKED';
    
  9. Conceder acesso ao esquema mascarado.

    GRANT USAGE ON SCHEMA <schema_name> TO <masked_role>;
    
  10. Conceder acesso Select em tabelas mascaradas.

grant select ON <schema_name>.<table_name> to <masked_role>;
  1. Exportar dados mascarados usando o pg_dump como função mascarada.

Para obter mais informações, consulte Comandos pg dump.

Para exportar dados mascarados, execute o pg_dump usando a função mascarada. Se o pg_dump for executado por um usuário administrador, os dados serão exportados sem mascaramento.

Generalização

A ideia principal da generalização é desfocar os dados originais. Para obter mais informações, consulte Generalização.

Possibilitando a generalização

  1. Instale a extensão do anonimizador.

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. Inicializar o anonimizador.

    select public.run_anon_init();
    
  3. Crie uma visualização usando funções de generalização.

    CREATE MATERIALIZED VIEW <view_name> AS
    SELECT
        anon.generalize_daterange(<date_column_1>, 'month') AS <generalized_date_1>,
        anon.generalize_daterange(<date_column_2>, 'month') AS <generalized_date_2>
    FROM <source_table>;
    
  4. Declare identificadores indiretos.

    SECURITY LABEL FOR k_anonymity
      ON COLUMN <view_name>.<generalized_date_1> IS 'INDIRECT IDENTIFIER';
    
    SECURITY LABEL FOR k_anonymity
      ON COLUMN <view_name>.<generalized_date_2> IS 'INDIRECT IDENTIFIER';
    
  5. Conceder acesso ao k-anonimato.

    select public.k_anonymity();
    
  6. Execute a verificação de k-anonimato na exibição ou na tabela.

    SELECT anon.k_anonymity('<view_name/table_name>');
    

Desmascarar uma função

Use o seguinte comando para desmascarar uma função.

SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL;

Desativar regra de mascaramento

Use o seguinte comando para desativar a função de mascaramento.

SECURITY LABEL FOR anon
  ON COLUMN <table_name>.<column_name>
  IS NULL;