Implementação de privacidade ao nível de entidade com políticas de agregação

A privacidade ao nível de entidade fortalece as proteções de privacidade fornecidas pelas políticas de agregação. Com a privacidade no nível da entidade, o Snowflake pode garantir que cada grupo contenha um número mínimo de entidades exclusivas, e não apenas um número mínimo de linhas.

A maioria das tarefas e considerações relacionadas às políticas de agregação são as mesmas, independentemente de você estar implementando privacidade ao nível de entidade. Para obter informações gerais sobre como trabalhar com políticas de agregação, consulte Políticas de agregação.

Sobre a privacidade ao nível de entidade

Uma entidade se refere a um conjunto de atributos que pertencem a um objeto lógico (por exemplo, um perfil de usuário ou informações familiares). Esses atributos podem ser usados para identificar uma entidade em um conjunto de dados. A privacidade ao nível de entidade é um recurso das tecnologias de aprimoramento de privacidade (PET) que protege a privacidade de uma entidade armazenada em um conjunto de dados compartilhado. Ela garante que as consultas não possam expor atributos confidenciais de uma entidade, mesmo que esses atributos sejam encontrados em vários registros.

Para obter privacidade no nível de entidade, o Snowflake permite que você especifique quais colunas identificam uma entidade (uma chave de entidade). Isso permite que o Snowflake identifique todos os registros que pertencem a uma entidade específica dentro de um conjunto de dados. Por exemplo, se a chave da entidade for definida como a coluna email, então o Snowflake pode determinar que todos os registros com email=joe.smith@example.com pertencem à mesma entidade.

Ao avaliar várias entidades para uma tabela, a política de agregação é avaliada separadamente para cada chave de entidade.

A política é aplicada a uma consulta mesmo que as colunas-chave não apareçam na consulta. Por exemplo, dada uma política que se aplica à chave de entidade (user_id), a consulta SELECT age FROM T1 GROUP BY age; ainda aplicará a restrição min_group_size para user_id em cada grupo, embora user_id não apareça na consulta.

Políticas de agregação sem privacidade ao nível de entidade

Por padrão, as políticas de agregação exigem que os analistas executem consultas que agregam dados em vez de recuperar linhas individuais, alcançando assim privacidade ao nível de linha. No entanto, a privacidade ao nível de linha não impede que uma consulta exponha os atributos de uma entidade quando esses atributos são encontrados em várias linhas (por exemplo, em uma tabela contendo dados transacionais).

Por exemplo, suponha que um serviço de streaming, ActonViz, tem uma tabela transacional com o endereço de e-mail (user_id) e doméstico (household_id) de cada visualizador enquanto eles assistem aos programas.

user_id

household_id

program_id

watch_time

start_time

dave_sr@example.com

12345

1

29

2023-09-12 09:00

mary@bazco.com

23485

1

30

2023-09-12 09:00

dave_sr@example.com

12345

6

18

2023-09-11 13:00

joe@jupiterlink.com

85456

6

25

2023-09-15 22:00

junior@example.com

12345

5

30

2023-09-13 11:00

ActonViz pode usar uma política de agregação para forçar os anunciantes a agregar dados em grupos com pelo menos 2 registros. Isso impede que os anunciantes recuperem os dados de um registro individual (privacidade ao nível de linha). Se cada visualizador e residência aparecesse apenas uma vez na tabela, isso seria suficiente para proteger sua privacidade.

No entanto, a consulta de um anunciante ainda pode obter informações sobre os visualizadores e suas famílias. Uma consulta pode criar um grupo que consiste inteiramente em registros de residências 12345 ou, pior ainda, um grupo que consistia inteiramente de registros para o visualizador dave_sr. Em ambos os casos, o número de registros no grupo atenderia aos requisitos definidos por ActonViz (mínimo de 2 registros por grupo).

Políticas de agregação com privacidade ao nível de entidade

Para obter privacidade no nível da entidade, o Snowflake permite que você especifique uma ou mais chaves de entidade ao atribuir uma política de agregação a uma tabela ou exibição. Depois que a chave da entidade é definida, os grupos retornados por uma consulta em uma tabela ou exibição com restrição de agregação devem conter pelo menos o número especificado de entidades, e não um número especificado de linhas.

No exemplo anterior, suponha que ActonViz defina household_id como a chave da entidade porque identifica exclusivamente cada residência. A privacidade de cada residência agora é aprimorada. Antes da mudança, um grupo poderia consistir inteiramente de registros com household_id = 12345, mas agora deve conter pelo menos dois valores distintos para household_id.

Observe que a chave da entidade nem sempre é a mesma que a chave primária de uma tabela. Neste exemplo, a tabela pode usar user_id como a chave primária porque identifica exclusivamente um visualizador. Mas neste caso, ActonViz quer proteger a privacidade de uma família inteira, que consiste em vários visualizadores, e, portanto, household_id foi escolhida como a chave da entidade.

Sobre os tamanhos mínimos de grupo

Cada política de agregação especifica um tamanho mínimo de grupo. Sem privacidade ao nível de entidade, o tamanho mínimo do grupo define o número de registros que devem ser inclusos em um grupo de agregação. Quando uma chave de entidade é especificada, o tamanho mínimo do grupo define o número mínimo de entidades exclusivas que devem aparecer no grupo para permitir que ele apareça nos resultados finais. Lembre-se de que as funções de agregação, como SUM e AVG, retornam um grupo, enquanto as colunas GROUP BY retornam um grupo por valor exclusivo nas colunas agrupadas.

As seguintes políticas ao nível de coluna não afetam como o Snowflake calcula se há entidades suficientes em um grupo de agregação:

  • As políticas de projeção são aplicadas após as políticas de agregação.

  • As políticas de mascaramento são aplicadas antes das políticas de agregação. Todas as funções ou políticas de agregação funcionam em dados mascarados.

Nos casos em que as referências de nome forem usadas várias vezes (por exemplo, em operadores JOIN ou UNION), o Snowflake impõe o tamanho mínimo de grupo para cada referência de nome de cada conjunto de dados separadamente. Isso se aplica mesmo quando a referência aponta para o mesmo conjunto de dados várias vezes.

Aplicação de privacidade ao nível de entidade com as políticas de agregação

Para impor privacidade ao nível de entidade com políticas de agregação, faça o seguinte:

  1. Ao executar o comando CREATE AGGREGATION POLICY para criar a política de agregação, especifique o número de entidades que devem ser inclusas em cada grupo de agregação.

  2. Defina a chave da entidade ao atribuir a política de agregação a uma tabela ou exibição.

Especifique o número mínimo de entidades

A sintaxe para criar uma política de agregação com CREATE AGGREGATION POLICY não muda se você estiver usando uma chave de entidade para obter privacidade ao nível de entidade. Você ainda usa o argumento MIN_GROUP_SIZE da função AGGREGATION_CONSTRAINT para especificar um tamanho mínimo de grupo. Assim que você definir uma chave de entidade, o tamanho mínimo do grupo muda de um requisito sobre o número de registros em um grupo para o número de entidades em um grupo.

Por exemplo, o código a seguir cria uma política de agregação com um tamanho mínimo de grupo de 5. Se você definir uma chave de entidade ao atribuir a política a uma tabela, cada grupo de agregação deve conter pelo menos 5 entidades.

CREATE AGGREGATION POLICY my_agg_policy
  AS () RETURNS AGGREGATION_CONSTRAINT ->
  AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
Copy

Para obter detalhes completos sobre a criação de políticas de agregação, incluindo um exemplo de uma política de agregação condicional que impõe diferentes restrições em diferentes circunstâncias, consulte Criação de uma política de agregação.

Definição de uma chave de entidade

Você define uma chave de entidade para uma tabela quando atribui a política de agregação à tabela ou exibição. Você pode definir a chave da entidade ao criar uma nova tabela ou exibição, ou ao atualizar uma tabela de exibição existente.

Defina uma chave de entidade para tabelas e exibições existentes

Ao executar o comando ALTER TABLE … SET AGGREGATION POLICY ou ALTER VIEW. … SET AGGREGATION POLICY para atribuir a política de agregação, use a cláusula ENTITY KEY para especificar quais colunas na tabela ou exibição contêm os atributos de identificação de uma entidade (ou seja, a chave da entidade).

Por exemplo, para criar uma chave de entidade ao atribuir uma política de agregação my_agg_policy a uma tabela viewership_log, execute:

ALTER TABLE viewership_log
  SET AGGREGATION POLICY my_agg_policy
  ENTITY KEY (first_name,last_name);
Copy

Como as colunas first_name e last_name são a chave de entidade, a política de agregação pode determinar que todas as linhas com first_name = joe e last_name = peterbilt pertencem à mesma entidade.

Defina várias chaves de entidade para tabelas e exibições existentes

Para definir várias chaves de entidade para uma tabela existente, você pode adicionar novas chaves em várias chamadas ou adicionar várias chaves em uma única chamada. A definição de uma chave em uma tabela é aditiva; ela não substitui ou elimina chaves definidas anteriormente.

Adicione duas chaves de entidade em duas chamadas. A primeira chave contém duas colunas.

ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id, user_email);
ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (vendor_id);
Copy

Adicione duas chaves de entidade em uma única chamada

ALTER TABLE transactions ADD AGGREGATION POLICY ap ENTITY KEY (user_id) ENTITY KEY (vendor_id);
Copy

Defina uma chave de entidade para novas tabelas e exibições

Ao executar o comando CREATE TABLE … WITH AGGREGATION POLICY ou CREATE VIEW … WITH AGGREGATION POLICY para atribuir a política de agregação, use a cláusula ENTITY KEY para especificar quais colunas na tabela ou exibição contêm os atributos de identificação de uma entidade.

Por exemplo, para criar uma nova tabela t1 ao atribuir uma política de agregação e definir uma chave de entidade, execute:

CREATE TABLE t1
  WITH AGGREGATION POLICY my_agg_policy
  ENTITY KEY (first_name,last_name);
Copy

Como as colunas first_name e last_name são a chave de entidade, a política de agregação pode determinar que todas as linhas com first_name = joe e last_name = peterbilt pertencem à mesma entidade.

Políticas de agregação diferida

Se uma consulta tiver subconsultas, o Snowflake tentará aplicar quaisquer políticas de agregação de entidades na consulta mais interna. Se essa consulta tiver uma cláusula GROUP BY e as colunas GROUP BY corresponderem à chave de entidade de uma política de agregação, essa política de agregação não será aplicada a essa subconsulta, mas à consulta pai dessa subconsulta. Esse adiamento continua na cadeia até que se chegue a uma consulta que não tenha um conjunto de colunas GROUP BY que correspondam à chave de entidade da política ou até que se chegue à consulta de nível superior; em ambos os casos, a política de agregação será aplicada a essa consulta. Uma política de agregação é aplicada apenas uma vez em uma cadeia de consultas.

Por exemplo, suponha que você tenha uma política de agregação my_agg_policy com chave de entidade (name, zipcode). Na pseudoconsulta a seguir, a consulta interna tem um conjunto GROUP BY que corresponde à chave de entidade para my_agg_policy e, portanto, a política é adiada para seu pai. A política é aplicada ao pai porque é uma consulta de nível superior, mesmo que as colunas GROUP BY também correspondam às colunas de política.

SELECT age, name, zipcode FROM(                        -- Outermost query: my_agg_policy enforced.
  SELECT name, zipcode FROM T GROUP BY name, zipcode   -- Matches my_agg_policy entity key: my_agg_policy deferred
)
  GROUP BY age, name, zipcode;
Copy

Observe que as colunas GROUP BY podem ser um superconjunto das colunas da chave de entidade para acionar um adiamento, e as políticas são adiadas somente quando as colunas GROUP BY são correspondidas; as funções de agregação não acionam o adiamento.

Cada política de agregação é aplicada separadamente a todos os blocos de consulta na consulta. Uma consulta composta de vários blocos por meio de um operador de conjunto (como UNION) avaliará as políticas de agregação separadamente para cada bloco de consulta.

O adiamento da agregação tem alguns efeitos úteis, demonstrados no exemplo a seguir.

Exemplo de diferimento

Imagine que você queira agregar usuários em dois buckets, “baixo consumo” e “alto consumo” com base em entidades definidas como (zipcode, email). O diferimento permite que isso funcione conforme demonstrado no exemplo a seguir. Sem adiamento, a consulta interna retornaria NULL, porque cada grupo consistiria em uma entidade (zipcode, email), que seria suprimida quando min_group_size fosse definido como qualquer valor maior que 1

WITH bucketed AS (
  SELECT
    CASE
      WHEN SUM(transaction_amount) BETWEEN 0 AND 100 THEN 'low'
      WHEN SUM(transaction_amount) BETWEEN 101 AND 100000 THEN 'high'
    END AS transaction_bucket,
    zipcode,               -- zipcode and email need not appear in the select list, but this lets us compute entity_count below
    email
  FROM my_transactions
  GROUP BY zipcode, email  -- This would not work if it was only GROUP BY zipcode, since the entity key is (zipcode, email)
)
SELECT
  transaction_bucket,
  COUNT(DISTINCT zipcode, email) AS entity_count
FROM
  bucketed
GROUP BY transaction_bucket;
Copy

Diferimento de múltiplas políticas

Se uma tabela tiver várias políticas de agregação, cada política de agregação será avaliada e possivelmente adiada de forma independente. Se você tiver várias políticas de agregação em uma tabela, projete suas consultas com cuidado, pois poderá encontrar resultados inesperados quando políticas diferentes forem aplicadas em níveis de consulta diferentes.

Por exemplo, aqui está um problema que você pode encontrar se tentar uma consulta aninhada para agrupar em bucket seus usuários em categorias de alto e baixo consumo em uma tabela com duas políticas de agregação separadas:

Tabela T:

user_id, vendor_id, zipcode, email,         transaction_amount
   1     1001       90000    a@example.com        100
   1     1001       90000    a@example.com         50
   2     2001       90001    b@example.com         12
   2     2001       90001    b@example.com          5
   3     3001       90002    c@example.com         40

Políticas de agregação:

  • user_policy: min_group_size = 3, chave da entidade = (user_id)

  • vendor_policy: min_group_size = 2, chave da entidade = (vendor_id)

Consulta para agrupar usuários em bucket como alto ou baixo consumo:

WITH amounts AS (
  SELECT
    user_id,
    IFF(SUM(transaction_amount) > 50, 'high', 'low') AS bucket
  FROM T
  GROUP BY user_id -- user_policy is deferred, but vendor_policy is enforced
)
SELECT COUNT(*) FROM amounts GROUP BY bucket
Copy

Resultados inesperados:

Na consulta interna, vendor_policy é aplicado. Cada linha é agrupada por user_id, que tem apenas um vendor_id correspondente, o que viola o tamanho mínimo do grupo vendor_policy, e a consulta interna retornará NULL, mesmo que três clientes distintos pertençam ao bucket “alto”.

Remoção de restrições de chave de entidade

Para remover uma política de agregação de uma única chave de entidade:

-- Drop agg policy ap associated with entity key user_id
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (user_id)
Copy

Para remover uma política de agregação de várias chaves de entidade, remova cada política separadamente:

-- Drop the agg policies associated with two separate keys
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (user_id)
ALTER TABLE transactions DROP AGGREGATION POLICY ap ENTITY KEY (vendor_id)
Copy

Para remover uma política de agregação junto com todas as suas entidades, omita ENTITY KEY da instrução DROP:

-- Drop agg policy ap from the table entirely
ALTER TABLE transactions DROP AGGREGATION POLICY ap
Copy

Restrições

As restrições a seguir se aplicam ao trabalhar com tabelas que têm várias chaves de entidade ou políticas de agregação definidas:

  • Uma chave de entidade pode ser associada a, no máximo, uma política. A tentativa de atribuir outra política a uma chave de entidade que já esteja mapeada para uma política resultará em um erro.

  • Uma política não pode ser usada tanto para privacidade em nível de linha quanto para privacidade em nível de entidade.

  • No máximo uma política pode ser usada para privacidade em nível de linha. A tentativa de atribuir outra política como a política de agregação em nível de linha resultará em um erro.

Consulta de uma tabela com restrição de agregação

Os requisitos para consultar uma tabela com restrição de agregação com uma chave de entidade são os mesmos para consultar uma tabela sem essa chave. Para obter mais informações sobre quais tipos de consultas estão em conformidade com esses requisitos, consulte Requisitos de consulta.