2016-01-13 138 views
0

使用從運行Postgres的類似服務器借用的設置9.4.1 & pgbouncer 1.6.1,我有多個用戶通過端口6543上的pgbouncer連接到數據庫。我也有第二個運行PostgreSQL 9.4.5的服務器,我已驗證所有用戶只能使用設置爲verify-full的TLS/SSL直接連接到數據庫(在端口5432上)。pgbouncer 1.7使用TLS/SSL客戶端和服務器連接

但是,我需要創建一個組合這些配置的環境:其中所有用戶都通過TLS/SSL通過pgbouncer連接池連接到數據庫。這意味着我需要在最近發佈的(截至2015年12月18日)pgbouncer 1.7中使用新的TLS/SSL功能,但除了文檔the new TLS parameters之外,我還沒有發現任何可用的示例來演示新功能,也沒有取得任何成功我自己通過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 

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) 

如果必要的話,我可以提供更多的信息。如果任何人有任何意見/建議,我可能會忽略這個工作,我非常感謝幫助!

回答

0

我想通了......我(部分?)有罪,試圖在pgbouncer 1.7中使用太多新功能。

有TLS/SSL設置&然後有HBA訪問控制。 (TLS/SSL不需要HBA訪問控制&反之亦然)。此外,由於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數據庫。

This 意味着我必須把在./pgbouncer/users.txt將要通過pgbouncer的用戶列表。格式應該像這樣(針對每個用戶):

"lalligood" "" 

因爲pgbouncer不會驗證任何基於密碼的連接。

所以這意味着通過pgbouncer的TLS/SSL認證/連接起作用。但它也讓我感覺最好是懷疑auth_type = hba/auth_hba_file = pg_hba.conf;最壞的情況下工作不正常。