As contas de serviço de banco de dados podem ser tão simples quanto um usuário com uma senha ou certificado separado para autenticação. Usuários mais avançados podem querer configurar contas nas quais o escopo das permissões possa ser alterado dinamicamente com SET ROLE, para permitir a alternância rápida entre perfis sem sair da sessão nem recarregar o conteúdo.
Visão geral
SET ROLE pode ser usado para definir dinamicamente o escopo das permissões de uma conta de serviço durante uma sessão. Isso funciona limitando as permissões efetivas de um usuário apenas àquelas concedidas pelo(s) role(s) ativado(s). Essa abordagem tem várias vantagens:
- Contas de serviço podem receber vários roles, mas ativar apenas o necessário para uma consulta específica.
- Invasores só podem usar as permissões do role ativo se a conta de serviço for comprometida.
- Uma única conta pode executar tarefas diversas alternando entre roles, em vez de exigir credenciais separadas para cada tarefa.
- As permissões podem ser atualizadas para toda uma classe de contas de serviço modificando um role, em vez de atualizar usuários individuais.
- Os logs podem rastrear qual role específico estava ativo durante uma consulta, fornecendo um contexto mais claro para auditorias de segurança.
Na prática, você:
- Projeta roles que definem os limites permitidos (read_only, maintenance etc.)
- Concede esses roles à conta de serviço
- No momento da conexão, escolhe o(s) role(s) ativo(s) por meio de
SET ROLE(ou do parâmetro de role), restringindo assim o que essa sessão pode fazer
Configure uma role de serviço
Conceda roles à conta de serviço
Primeiro, crie roles com os privilégios/configurações desejados e, em seguida, conceda-as à conta de serviço.
CREATE ROLE read_only_role;
GRANT SELECT ON db1.* TO read_only_role;
CREATE ROLE maint_role;
GRANT SELECT, INSERT, ALTER on db1.* TO maint_role;
GRANT read_only_role, maint_role TO service_user;Use SET ROLE para definir limites da sessão
No início de uma sessão, a conta de serviço escolhe quais roles ficam ativas:
-- Comportamento somente leitura para esta sessão
SET ROLE read_only_role;ou:
-- Usa todas as roles concedidas (acesso total)
SET ROLE ALL;SET ROLE ativa roles para o usuário atual; os privilégios efetivos são a união de todas as roles ativas, além daqueles concedidos diretamente ao usuário.
Você também pode desativar todas as roles:
SET ROLE NONE;ou ativar várias roles:
SET ROLE read_only_role, maint_role;As roles ativas no momento podem ser consultadas em system.current_roles.
Defina roles padrão para a conta de serviço
Para garantir que a conta de serviço sempre inicie em modo restrito, configure as roles padrão:
SET DEFAULT ROLE read_only_role TO service_user;ou
SET DEFAULT ROLE ALL EXCEPT maint_role TO service_user;Uso de SET ROLE via HTTP / programaticamente
Se a conta de serviço se conectar via HTTP, você não poderá enviar SET ROLE; SELECT … como múltiplas instruções. Em vez disso, passe a role como um parâmetro de consulta:
curl "https://host:8123?user=service_user&password=...&role=read_only_role" \
--data-binary "SELECT * FROM db1.table1"?role=… equivale a executar SET ROLE read_only_role antes da instrução. Vários parâmetros role se comportam como SET ROLE role 1, role 2.
Alguns drivers (por exemplo, ClickHouse Connect para Python) também expõem uma configuração de role que é enviada com cada requisição e que o servidor usa como role da sessão.