Com configurações emprestadas de um servidor semelhante executando Postgres 9.4.1 e pgbouncer 1.6.1, tenho vários usuários se conectando ao banco de dados por meio de pgbouncer na porta 6543. Também tenho um segundo servidor executando PostgreSQL 9.4.5 onde verifiquei que todos os usuários só podem se conectar diretamente aos bancos de dados (na porta 5432) usando TLS/SSL definido como verify-full
.
No entanto, preciso criar um ambiente combinando essas configurações: um onde todos os usuários se conectem ao banco de dados via TLS/SSL com pooling de conexão através do pgbouncer. Isso significa que preciso usar a nova funcionalidade TLS/SSL no pgbouncer 1.7 lançado recentemente (a partir de 18 de dezembro de 2015), mas além da documentação dos novos parâmetros TLS , não encontrei nenhum exemplo disponível demonstrando a nova funcionalidade nem tinha qualquer sucesso por conta própria estabelecendo uma conexão válida através do pgbouncer usando TLS/SSL no meu segundo servidor.
Incluí trechos pertinentes do postgresql.conf
, pg_hba.conf
, & pgbouncer.ini
do meu segundo servidor.
postgresql.conf:
ssl = on # (change requires restart)
ssl_cert_file = 'server.crt' # (change requires restart)
ssl_key_file = 'server.key' # (change requires restart)
ssl_ca_file = 'root.crt' # (change requires restart)
pg_hba.conf:
hostssl all all 10.10.5.0/24 cert
pgbouncer.ini:
;
; pgbouncer configuration
;
[databases]
mydatabase = host=localhost port=5432 dbname=mydatabase
;
[pgbouncer]
listen_port = 6543
listen_addr = *
admin_users = lalligood, postgres
logfile = /tmp/pgbouncer.log
pidfile = /tmp/pgbouncer.pid
ignore_startup_parameters = application_name
server_reset_query = DISCARD ALL;
pool_mode = session
max_client_conn = 1000
default_pool_size = 300
log_pooler_errors = 0
; Improve compatibility with Java/JDBC connections
ignore_startup_parameters = extra_float_digits
; USER AUTHENTICATION (old way commented out with new lines below)
;auth_type = md5
;auth_file = pgbouncer/users.txt
auth_type = hba
auth_hba_file = pg_hba.conf
; TLS SETTINGS (NEW STUFF!)
client_tls_sslmode = verify-full
client_tls_key_file = server.key
client_tls_cert_file = server.crt
client_tls_ca_file = root.crt
server_tls_sslmode = verify-full
server_tls_key_file = /tmp/pgb_user.key
server_tls_cert_file = /tmp/pgb_user.crt
server_tls_ca_file = root.crt
O pgbouncer inicia, no entanto, quando tento me conectar como qualquer usuário, mas digamos que quero ser o usuário 'lalligood', recebo o seguinte erro:
ERROR: no such user: lalligood
pgbouncer.log contém a seguinte linha para cada tentativa:
2016-01-13 16:00:36.971 2144 LOG C-0xcad410:
(nodb)/(nouser)@10.10.5.194:54848 closing because: No such user:
lalligood (age=0)
Posso fornecer mais informações se necessário. Se alguém tiver algum conselho / sugestão sobre o que posso estar esquecendo para fazer isso funcionar, agradeço muito a ajuda!
Eu descobri... Eu era (parcialmente?) culpado por tentar usar muitos recursos novos no pgbouncer 1.7.
Existem as configurações TLS/SSL e os controles de acesso HBA. (TLS/SSL não precisa de controles de acesso HBA e vice-versa para funcionar). Além disso, como pgbouncer e o banco de dados estão na mesma caixa, não há necessidade de sobrecarga extra de TLS/SSL entre pgbouncer e o banco de dados.
A simplificação para usar apenas as configurações de autenticação de usuário mais comumente usadas provou ser a solução.
Primeiro,
postgresql.conf
&pg_hba.conf
foram deixados intocados como mostrado acima.pgbouncer.ini
, no entanto, é isso:Portanto, as alterações específicas são
auth_type = cert
&auth_file = pgbouncer/users.txt
(alterar/remover as referências HBA) e remover as 4server_tls_...
linhas no final.Os usuários se autenticam no pgbouncer e no banco de dados postgres usando o certificado SSL.
Isso também significa que tenho que montar uma lista de usuários que passarão pelo pgbouncer em
./pgbouncer/users.txt
. O formato deve ser assim (para cada usuário):já que o pgbouncer não verificará nenhuma conexão com base em uma senha.
Então, tudo isso significa que a autenticação/conectividade TLS/SSL por meio do pgbouncer funciona. Mas também me deixa com a sensação de que sou, na melhor das hipóteses
auth_type = hba
,auth_hba_file = pg_hba.conf
suspeito; não está funcionando corretamente na pior das hipóteses.