Agrupamento de conexões com PgBouncer

PgBouncer é um gerenciador de pool de conexões leve para o PostgreSQL. Ele mantém um número reduzido de conexões com o banco de dados e as compartilha entre vários clientes do aplicativo, o que ajuda a manter sua implantação dentro do limite de conexões e evita a sobrecarga de abrir uma nova conexão para cada cliente.

IBM Cloud® Databases for PostgreSQL As implantações incluem suporte integrado para PgBouncer's auth_query. Cada implantação fornece uma função public.pgbouncer_lookup e uma função pgbouncer_auth ; assim, uma instância PgBouncer que você executar poderá validar os usuários do banco de dados diretamente em relação à sua implantação. Você não mantém uma lista local de senhas para os usuários do banco de dados, e as alterações de senha entram em vigor imediatamente, sem a necessidade de reiniciar ou recarregar o PgBouncer.

Databases for PostgreSQL não hospeda nem opera o site PgBouncer. Você instala, executa, protege e atualiza o PgBouncer em sua própria infraestrutura, como um servidor virtual, um cluster do Kubernetes ou um sidecar de aplicativo. Para obter mais informações sobre gerenciamento de conexões, consulte “Gerenciamento de conexões ”.

Antes de Iniciar

Você precisa de:

  • Uma implantação do Databases for PostgreSQL com a senha de administrador definida.
  • Um usuário do banco de dados para seu aplicativo, criado na interface do usuário, na linha de comando ou na API.
  • PgBouncer 1.11.0 ou versão posterior, que ofereça suporte à autenticação SCRAM, instalada em uma infraestrutura sob seu controle. Se você planeja usar instruções preparadas no nível do protocolo no modo de agrupamento de transações, utilize o PgBouncer 1.21.0 ou uma versão posterior.
  • Um cliente do psql.
  • Informações de conexão da sua implantação:
    • Nome do host e porta, das [cadeias de conexão]...
    • Certificado CA, obtido em ibmcloud cdb deployment-cacert.

O suporte ao “ pgbouncer_lookup ” está sendo implementado em todas as instâncias. Para confirmar se sua implantação possui essa função, acesse psql usando o endereço admin e execute \df public.pgbouncer_lookup. Se o resultado for vazio, sua implantação receberá a função em uma próxima atualização de manutenção.

Criação de um usuário dedicado à autenticação

PgBouncer executa o auth_query como uma função de login designada, a auth_user``. Crie uma função destinada exclusivamente a essa finalidade. Uma função dedicada que não possui dados e não executa nenhuma outra tarefa é a opção de privilégios mínimos.

Conecte-se ao psql como usuário admin, em seguida, crie a função e conceda a ela o direito pgbouncer_auth:

CREATE ROLE pool_auth WITH LOGIN PASSWORD '<POOL_AUTH_PASSWORD>';
GRANT pgbouncer_auth TO pool_auth;

A função “ pgbouncer_auth ” possui um único privilégio: a permissão para executar a função “ pgbouncer_lookup ”. O usuário admin possui o pgbouncer_auth com a opção de administrador; portanto, você mesmo concede e revoga a adesão. Você também pode criar o usuário com ibmcloud cdb user-create caso queira que ele apareça nas credenciais do seu serviço, mas os usuários criados dessa forma são membros do grupo ibm-cloud-base-user e podem criar usuários e bancos de dados, o que é mais do que o usuário de autenticação precisa.

Conceda o direito “ pgbouncer_auth ” apenas ao usuário de autenticação dedicado. Qualquer membro da função pode ler os verificadores de senha armazenados dos demais usuários do banco de dados; portanto, cada membro adicional amplia o impacto de uma credencial comprometida.

Para desativar um usuário de autenticação, revogue sua adesão:

REVOKE pgbouncer_auth FROM pool_auth;

Configuração PgBouncer

As seguintes configurações do PgBouncer são necessárias ao se conectar a uma implantação do Databases for PostgreSQL:

  • auth_type = scram-sha-256, pois as implantações armazenam verificadores de senh SCRAM-SHA-256 es.
  • auth_query = SELECT * FROM public.pgbouncer_lookup($1), porque o arquivo padrão PgBouncer's auth_query acessa diretamente o arquivo pg_authid, e os usuários do seu banco de dados não têm permissão para acessá-lo.
  • TLS do lado do servidor, pois as implantações aceitam apenas conexões TLS. Defina server_tls_sslmode = verify-full e salve o certificado que você recuperou com ibmcloud cdb deployment-cacert no caminho definido em server_tls_ca_file.

PgBouncer lê as credenciais do próprio auth_user a partir de auth_file``; portanto, nessa configuração, userlist.txt contém apenas as credenciais do auth_user. Todos os outros usuários acessam o site auth_query. Restrinja as permissões do arquivo ao proprietário do processo “ PgBouncer ”, por exemplo, com o modo 0600.

"pool_auth" "<POOL_AUTH_PASSWORD>"

Uma configuração mínima completa, em que <HOSTNAME> e <PORT> são provenientes de suas strings de conexão:

[databases]
ibmclouddb = host=<HOSTNAME> port=<PORT> dbname=ibmclouddb
[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
auth_user = pool_auth
auth_query = SELECT * FROM public.pgbouncer_lookup($1)
server_tls_sslmode = verify-full
server_tls_ca_file = /etc/pgbouncer/ca-certificate.crt
pool_mode = session
max_client_conn = 200
default_pool_size = 20

Não defina auth_dbname = postgres``. A função de pesquisa não está instalada no banco de dados postgres. Deixe a variável auth_dbname sem valor, para que a consulta de autenticação seja executada no banco de dados ao qual o cliente se conecta. Os bancos de dados que você criar posteriormente já incluirão essa função automaticamente.

Para obter descrições de cada configuração, consulte a referência de configuração do PgBouncer.

Verificando a configuração

  1. Verifique se a consulta identifica um dos usuários do seu banco de dados. Conecte-se ao psql como admin e execute:

    SELECT usename, passwd IS NOT NULL AS can_authenticate
      FROM public.pgbouncer_lookup('<APP_USERNAME>');
    

    O resultado é uma linha com o valor “ can_authenticate = t ”. A consulta foi escrita de forma que o verificador de senha não seja exibido. Os usuários reservados para serviços, incluindo admin, não retornam nenhuma linha.

  2. Conecte-se usando PgBouncer como usuário do banco de dados:

    psql "host=127.0.0.1 port=6432 dbname=ibmclouddb user=<APP_USERNAME>"
    

    Se a conexão for bem-sucedida, o PgBouncer estará autenticando corretamente os usuários por meio do auth_query.

  3. Altere a senha do usuário do banco de dados e, em seguida, reconecte-se por meio de PgBouncer com a nova senha:

    ibmcloud cdb user-password <DEPLOYMENT_NAME_OR_CRN> <APP_USERNAME> <NEW_PASSWORD>
    

    A nova senha entra em vigor imediatamente. Não é necessário reiniciar o PgBouncer, atualizar a página ou userlist.txt.

Como funciona o modelo de segurança

A função pgbouncer_lookup expõe apenas as informações necessárias para a autenticação em PgBouncer.

  • A função é executada com SECURITY DEFINER e um search_path fixado, e lê pg_catalog.pg_authid para você. O acesso direto aos sites pg_authid e pg_shadow continua bloqueado.
  • Ele retorna verificadores SCRAM hashados, nunca senhas em texto simples.
  • Somente as funções com permissão para fazer login serão resolvidas. Usuários reservados para serviços, como admin e os usuários internos de replicação e operações, nunca são resolvidos.
  • Se a VALID UNTIL carimbo de data/hora de uma função estiver no passado, a função retorna uma senha NULL, de modo que a autenticação falha e a expiração da senha continua sendo aplicada.
  • A permissão para executar a função foi revogada para PUBLIC e concedida apenas a admin e aos membros de pgbouncer_auth.

PgBouncer's Por padrão, o comando auth_query acessa diretamente o arquivo pg_authid , o que os usuários do seu banco de dados não podem fazer. Nessa situação, a documentação do PgBouncer recomenda chamar uma função SECURITY DEFINER por meio de um usuário que não seja superusuário. A função pgbouncer_lookup é essa função, com os usuários reservados do serviço excluídos.

Limitações e considerações

  • PgBouncer não aumenta o max_connections da sua implantação. Defina o parâmetro default_pool_size de forma que o número total de conexões ao servidor provenientes de todas as suas instâncias do PgBouncer permaneça dentro do limite de conexões. Se você atingir o limite, consulte a seção sobre como aumentar o número máximo de conexões.
  • O usuário admin não consegue se autenticar pelo site auth_query. Para tarefas administrativas, conecte-se como admin diretamente à implantação, e não por meio de PgBouncer.
  • O banco de dados do postgres não possui a função de pesquisa; portanto, nunca defina auth_dbname = postgres``.
  • No modo de agrupamento de transações (pool_mode = transaction), o estado da sessão — como variáveis do tipo “ SET ”, tabelas temporárias, bloqueios consultivos e canais do tipo “ LISTEN ” — não é transferido entre as transações. As instruções preparadas no nível do protocolo exigem o max_prepared_statements e o PgBouncer 1.21.0 ou versões posteriores. Para obter mais informações, consulte os recursos do PgBouncer.
  • Durante uma atualização de versão principal no local, sua implantação passa por um breve período de inatividade e as conexões abertas são encerradas (SQLSTATE 57P01). PgBouncer restabelece automaticamente as conexões com o servidor, mas seus aplicativos devem tentar novamente as transações interrompidas e preparar novamente as instruções.
  • Usuários com permissão apenas de leitura não podem se conectar ao endpoint primário. Para agrupar suas conexões, adicione uma entrada separada em [databases] que aponte para suaréplica somente leitura.

Próximas etapas