Estamos usando o modo de arquivo de autenticação no pgbouncer. A parte de autenticação do Pgbouncer é muito confusa. Seria útil se alguém pudesse esclarecer minhas dúvidas abaixo.
As conexões Pgbouncer são autenticadas duas vezes no lado do segurança e na camada de banco de dados?
Qual é a utilidade da autenticação no Pgbouncer se ele estiver usando as mesmas credenciais do banco de dados ?
É possível usar um conjunto diferente de credenciais de usuário para a autenticação Pgbouncer diferente das próprias credenciais do banco de dados?
Isto é confuso. Como o pgBouncer atua como proxy entre o cliente e o banco de dados, a autenticação acontece em dois estágios:
o cliente precisa se autenticar com o pgBouncer
pgBouncer precisa se autenticar no banco de dados
Essas duas etapas são teoricamente independentes, mas muitas vezes você gostaria de usar as credenciais do banco de dados para autenticar com o pgBouncer. É
auth_query
para isso que serve. Por outro lado, você normalmente instala o pgBouncer na máquina do banco de dados e então pode usartrust
a autenticação entre o pgBouncer e o banco de dados, a menos que seus requisitos de segurança sejam bastante avançados.Talvez meu artigo introdutório sobre o tema possa ser útil para você.
O objetivo do pgbouncer é que nem toda conexão com o pgbouncer cria uma nova conexão com o banco de dados. Ou pelo menos esse é um ponto importante, talvez não seja o único.
Uma conexão de entrada com o pgbouncer pode levar a uma autenticação no próprio banco de dados ou pode apenas usar uma conexão existente com o banco de dados que já foi autenticada. Portanto, a conexão é autenticada 1 + 1/N vezes, uma vez para o pgbouncer e uma fração do tempo para o banco de dados (se foi a primeira conexão naquele pool, ou fez o pool crescer, ou precisou substituir um expirado ou conexão skunked). Eu acho que
você,um desenvolvedor do pgbouncer, poderia organizá-lo para que ele seja autenticado no pooler (N-1)/N do tempo e canalize para o banco de dados 1/N do tempo, mas como ainda precisaria fazer ping-pong através do pooler, é difícil ver qual seria o sentido disso.Como seria a alternativa? O pgbouncer autentica no banco de dados pela primeira vez e depois compartilha essa conexão com qualquer pessoa que aparecer, sem verificação? Ou as conexões nunca são reutilizadas; nesse caso, seu pooler não faz pooling? Ou alguma outra coisa?
Sim, isso é possível (mas não acho que seja muito comum). Mas devido a um aparente bug no pgbouncer, não é possível se o SCRAM estiver tentando ser usado para ambos os conjuntos de credenciais.