Estamos administrando banco de dados em kubernetes para nossos clientes. Para cada novo cluster, criamos um novo usuário com CREATE ROLE
funções CREATE DB
atribuídas a eles, para que possam criar seus próprios bancos de dados e novos usuários com funções mais restritas.
O problema é que, com CREATE ROLE
permissão, o usuário pode CONCEDER a si mesmo pg_execute_server_program
o papel e, em seguida, usar o ataque reverso do shell e, em seguida, obter o shell do nosso pod e ler as variáveis de ambiente, o que não é desejado. Por exemplo, temos vários segredos em ambientes que o cliente pode aproveitar e então aumentar seu alcance de ataque e assumir mais coisas.
Resumindo, quero ter um usuário que possa criar novos usuários, mas não possa conceder a si mesmo funções predefinidas específicas.
Atualização: procurei e descobri que ADMIN_OPTION
foi adicionado no PostgreSQL 16 para resolver esse problema. Meu problema é que estamos usando o PostgreSQL versão 13,14,15 e não podemos simplesmente forçar a atualização de todos os clusters.
Você deve usar pelo menos o PostgreSQL v16. Nessa versão,
CREATEROLE
foi modificado para não permitir a concessão de associação em funções arbitrárias. Você só pode conceder associação em funções para as quais tenha privilégioADMIN
.Com versões mais antigas do PostgreSQL, você não pode fornecer com segurança a um usuário arquivos
CREATEROLE
.Uma maneira de contornar isso poderia ser uma
SECURITY DEFINER
função pertencente a um superusuário que permite ao chamador criar uma função. Certifique-se de definirsearch_path
algo seguro comopg_catalog
essa função.Se você não estiver preso apenas à execução,
CREATE ROLE
crie uma função/procedimento personalizado para permitir que seus clientes criem novos usuários. Essa função precisaria ser criada comSECURITY DEFINER
permissões e restringir quais opções poderiam ser fornecidas. Obviamente, a conta de usuário do cliente não seria capaz de criar usuários sozinha.Consegui descobrir uma solução alternativa com a biblioteca supautils que existe apenas para resolver o problema que tenho aqui.
Como estou fazendo isso para resolver um problema de segurança, a criação de funções
SECURITY DEFINER
pode apenas adicionar outro problema.