Postgresql

帶有 TLS/SSL 客戶端和伺服器連接的 pgbouncer 1.7

  • January 15, 2016

使用從執行 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 證書對 pgbouncerpostgres 數據庫進行身份驗證。

意味著我必須匯總將通過 pgbouncer 的使用者列表./pgbouncer/users.txt。格式應該是這樣的(對於每個使用者):

"lalligood" ""

因為 pgbouncer 不會根據密碼驗證任何連接。

所以這一切意味著通過 pgbouncer 的 TLS/SSL 身份驗證/連接有效。但這也讓我覺得auth_type = hba/auth_hba_file = pg_hba.conf充其量是可疑的;在最壞的情況下無法正常工作。

引用自:https://dba.stackexchange.com/questions/126276