帶有 TLS/SSL 客戶端和伺服器連接的 pgbouncer 1.7
使用從執行 Postgres 9.4.1 和 pgbouncer 1.6.1 的類似伺服器借用的設置,我有多個使用者通過埠 6543 上的 pgbouncer 連接到數據庫。我還有第二台執行 PostgreSQL 9.4.5 的伺服器,我已經驗證了所有使用者只能使用設置為 的 TLS/SSL 直接連接到數據庫(在埠 5432 上)
verify-full
。但是,我需要創建一個結合這些配置的環境:所有使用者通過 TLS/SSL 連接到數據庫,並通過 pgbouncer 進行連接池。這意味著我需要在最近發布的(截至 2015 年 12 月 18 日)pgbouncer 1.7 中使用新的 TLS/SSL 功能,但除了新 TLS 參數的文件之外,我還沒有找到任何可用的範例來展示新功能,也沒有我自己通過 pgbouncer 在我的第二台伺服器上使用 TLS/SSL 建立有效連接的任何成功。
我已經包含了來自我的第二台伺服器的
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
但是,當我嘗試以任何使用者身份連接但假設我想成為使用者“lalligood”時,pgbouncer 啟動,我收到以下錯誤:
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 引用) & 去掉最後的 4server_tls_...
行。使用者使用 SSL 證書對 pgbouncer和postgres 數據庫進行身份驗證。
這也意味著我必須匯總將通過 pgbouncer 的使用者列表
./pgbouncer/users.txt
。格式應該是這樣的(對於每個使用者):"lalligood" ""
因為 pgbouncer 不會根據密碼驗證任何連接。
所以這一切意味著通過 pgbouncer 的 TLS/SSL 身份驗證/連接有效。但這也讓我覺得
auth_type = hba
/auth_hba_file = pg_hba.conf
充其量是可疑的;在最壞的情況下無法正常工作。