O que é a propriedade User Type?
Ao criar ou alterar um usuário no Snowflake, existem dezenas de propriedades e parâmetros que podem ser definidos, conforme explicado na documentação do Snowflake. Uma das Object Properties que podem ser definidas para usuários é a propriedade type, que aceita os valores person, service, legacy_service ou null.
Essa propriedade foi lançada pelo Snowflake no terceiro trimestre de 2024 como uma forma de registrar a finalidade de cada usuário. Acredito que ela também seja uma maneira sutil de o Snowflake incentivar os clientes a adotar autenticação por par de chaves nas contas de serviço, como veremos a seguir.
Definindo cada tipo
personé, claramente, voltado para usuários humanos. Esses usuários normalmente acessam o Snowflake via SSO (SAML) ou por autenticação simples com usuário e senha. O MFA do Snowflake é sempre recomendado para usuários do tipoperson.- O tipo
serviceé voltado para contas de serviço. Esse tipo tem uma particularidade: não permite autenticação por usuário/senha nem MFA. Ele exige o uso da autenticação por par de chaves do Snowflake; por isso, os comandos e propriedades ligados a MFA e senhas não são permitidos. Além disso, usuários do tiposervicenão podem ter Primeiro, Segundo e Último Nome.
legacy_serviceé uma conta de serviço que pode se autenticar por senha ou SAML.
Quais são as vantagens?
Hardening da conta
Ao diferenciar service de legacy_service, mantemos a segurança da conta sempre em foco. A autenticação por par de chaves é amplamente reconhecida como mais segura do que a autenticação por senha; sinalizar cada conta que ainda usa a abordagem menos segura é uma boa prática e pode virar uma lista de pendências para uma futura faxina.
Analisando o query history
Outro benefício de manter a propriedade Type para todos os usuários é poder usar essa informação em análises. Por exemplo, imagine que você queira ver a contagem de queries em uma tabela separada por tipo de serviço, usando o query history do Snowflake:
select
users.type = 'PERSON' as is_person,
count(*)
from snowflake.account_usage.query_history
left join snowflake.account_usage.users
on query_history.user_name=users.name
where true
and query_history.query_text ilike '%analytics.public.orders%'
and start_time > current_date - 30
group by 1
Exemplo de código: definindo a propriedade Type
Definindo o User Type ao criar um novo usuário
Definir a propriedade type na criação de um usuário é simples:
create user if not exists my_service_user
type = service
rsa_public_key = <string>;
Atualizando o User Type de um usuário existente
Imagine que queremos definir type=service para uma conta de serviço já existente que hoje usa autenticação por senha. Ao atualizar um usuário existente, dá para fazer só o essencial:
alter user my_service_user set
type = service
rsa_public_key = <string>
;
Nesse caso, não usamos unset na senha nem em outras propriedades incompatíveis; elas continuam armazenadas, mas desativadas. Definir o user type como legacy_service, person ou null reativaria essas propriedades.
Para manter tudo organizado, sugiro o seguinte:
alter user my_service_user unset password;
alter user my_service_user unset first_name;
alter user my_service_user unset middle_name;
alter user my_service_user unset last_name;
alter user my_service_user set disable_mfa = true;
Limitações
Até o momento (setembro de 2024), a propriedade type não aparece na interface do Snowsight e só pode ser definida via código. Além disso, o comando show users não exibe uma coluna para o user type, mas espero que isso mude em breve.
A única forma de consultar o tipo de um usuário é com o comando describe user <username> ou consultando a tabela snowflake.account_usage.users.
Conclusão e recomendações
A nova propriedade type no Snowflake é uma ótima forma de acompanhar os tipos de usuário na sua conta e funciona também como um recurso de hardening, já que obriga você a reconhecer onde ainda existem contas de serviço com autenticação legada.
Recomendo revisar cada conta de serviço da sua conta Snowflake e marcar uma a uma como type = service ou type = legacy_service. Para as contas legacy_service, monte um plano de ação para migrá-las para o tipo service em um futuro próximo.
Jeff é consultor de dados e analytics com mais de 15 anos de experiência em automatizar insights e usar dados para controlar processos de negócio. Do lado tecnológico, é especialista em Snowflake + dbt + Tableau. Do lado de negócios, tem experiência em utilidades públicas, ensaios clínicos, publishing, CPG e manufatura. Fale com ele quando quiser: [email protected].