通过从运行Postgres 9.4.1和pgbouncer 1.6.1的类似服务器上借用的设置,我有多个用户通过端口6543上的pgbouncer连接到数据库。我还有第二台运行PostgreSQL 9.4.5的服务器,在此我已验证所有用户只能使用设置为verify-full
的TLS / SSL直接连接到数据库(在端口5432上)。
但是,我需要创建一个结合以下配置的环境:所有用户都通过TLS / SSL通过pgbouncer连接池连接到数据库的环境。这意味着我需要在最近发布(截至2015年12月18日)的pgbouncer 1.7中使用新的TLS / SSL功能,但是除了the new TLS parameters的文档外,我没有找到任何可用的示例来演示新功能,也没有任何示例。我成功通过我的第二台服务器上的TLS / SSL通过pgbouncer建立了有效的连接。
我已包括第二台服务器中postgresql.conf
,pg_hba.conf
和pgbouncer.ini
的相关摘录。
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
pgbouncer启动,但是,当我尝试以用户'lalligood'进行连接时,出现以下错误:
ERROR: no such user: lalligood
pgbouncer.log包含每次尝试的以下行:
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)
如果需要,我可以提供更多信息。如果有人对我可能无法完成的任何建议或建议,我将非常感谢您的帮助!
最佳答案
我想通了……我(部分?)对尝试在pgbouncer 1.7中使用太多新功能感到内。
有TLS / SSL设置,然后有HBA访问控制。 (TLS / SSL不需要HBA访问控制,反之亦然)。另外,由于pgbouncer和数据库位于同一盒子上,因此在pgbouncer和数据库之间不需要TLS / SSL的额外开销。
解决方法是简化为仅使用更常用的用户身份验证设置。
首先,如上图所示,保持postgresql.conf
和pg_hba.conf
不变。pgbouncer.ini
,但这是:
;
; pgbouncer configuration
;
[databases]
mydatabase = host=localhost port=5432 dbname=mydatabase
;
[pgbouncer]
listen_port = 6543
listen_addr = *
admin_users = lalligood, postgres
auth_type = cert
auth_file = pgbouncer/users.txt
logfile = /var/lib/pgsql/pgbouncer.log
pidfile = /var/lib/pgsql/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
; TLS settings
client_tls_sslmode = verify-full
client_tls_key_file = server.key
client_tls_cert_file = server.crt
client_tls_ca_file = root.crt
因此,具体的更改是
auth_type = cert
和auth_file = pgbouncer/users.txt
(更改/删除HBA引用)并在最后去除4条server_tls_...
行。用户使用SSL证书对pgbouncer和postgres数据库进行身份验证。
这也意味着我必须将要通过
./pgbouncer/users.txt
中的pgbouncer的用户列表放在一起。格式应如下所示(针对每个用户):"lalligood" ""
因为pgbouncer不会基于密码验证任何连接。
因此,这意味着通过pgbouncer进行的TLS / SSL身份验证/连接有效。但是,这也让我感到
auth_type = hba
/ auth_hba_file = pg_hba.conf
最多是可疑的。在最坏的情况下无法正常工作。关于database - 具有TLS/SSL客户端和服务器连接的pgbouncer 1.7,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34771288/