2 min de leitura

Segurança e Autenticação

O PgArachne depende inteiramente do sistema de permissões do PostgreSQL. Ele não reinventa Listas de Controle de Acesso (ACLs). Todas as consultas são executadas sob o papel de banco de dados específico do usuário autenticado usando SET LOCAL ROLE.

1. Login Interativo (JWT)

Os usuários se autenticam usando seu nome de usuário e senha reais do PostgreSQL via a função de login. Se bem-sucedido, eles recebem um JWT genérico. Quando este token é usado, o PgArachne muda o papel ativo para esse usuário pela duração da requisição.

2. Contas de Serviço (Tokens de API)

Para sistemas automatizados ou scripts, você pode usar chaves de API de longa duração.

  • Os tokens são armazenados na tabela pgarachne.api_tokens.
  • Cada token é mapeado para um usuário/papel de banco de dados específico.
  • Envie o token através do cabeçalho Authorization: Bearer <token>.

A criação de tokens de API requer pgarachne_admin. Use pgarachne.add_api_token(...) com um papel membro de pgarachne_admin.

3. Provedor de identidade externo (JWT próprio)

Se você autentica usuários fora do PgArachne (por exemplo, em um serviço de autenticação externo), pode emitir os JWTs nesse serviço e enviá-los diretamente ao PgArachne.

  • Formato do cabeçalho: Authorization: Bearer <jwt>.
  • Assinatura: apenas HMAC (HS256/HS384/HS512) com o mesmo JWT_SECRET configurado no PgArachne.
  • Claims obrigatórios: db_role (string não vazia) e db_name (string que deve corresponder a /api/:database).
  • Claim recomendado: exp (timestamp Unix) para expiração do token.

Exemplo mínimo de payload:

{
  "db_role": "demo_user",
  "db_name": "my_database",
  "exp": 1767225600
}

Importante: algoritmos JWT assimétricos (por exemplo RS256/ES256) não são aceitos pela implementação atual do servidor.

Configuração Crítica: Privilégios do Proxy

Como o PgArachne se conecta como o usuário definido em DB_USER (ex: pgarachne) e muda a identidade para outros usuários, o usuário proxy deve ser membro desses papéis alvo.

Execute este SQL para cada usuário/papel que precisa fazer login:

-- Permitir que 'pgarachne' mude para 'demo_user'
GRANT demo_user TO pgarachne;