可以使用 SSH 來加密客戶端和 PostgreSQL 伺服器之間的網路連線。如果正確執行,即使對於不支援 SSL 的客戶端,這也能提供足夠安全的網路連線。
首先,請確保 SSH 伺服器在與 PostgreSQL 伺服器相同的機器上正常執行,並且可以使用 ssh
以某個使用者身分登入;然後,您可以建立到遠端伺服器的安全通道。安全通道會監聽本機埠,並將所有流量轉送到遠端機器上的埠。傳送到遠端埠的流量可以傳送到其 localhost
位址,或根據需要傳送到不同的繫結位址;它不會顯示為來自您的本機機器。此命令會建立從客戶端機器到遠端機器 foo.com
的安全通道
ssh -L 63333:localhost:5432 joe@foo.com
-L
參數中的第一個數字 63333 是通道的本機埠號;它可以是任何未使用的埠。(IANA 保留 49152 到 65535 之間的埠供私人使用。)此後的名稱或 IP 位址是您要連線的遠端繫結位址,即 localhost
,這是預設值。第二個數字 5432 是通道的遠端端點,例如,您的資料庫伺服器正在使用的埠號。為了使用此通道連線到資料庫伺服器,您需要連線到本機上的埠 63333
psql -h localhost -p 63333 postgres
對於資料庫伺服器,它看起來像是您是主機 foo.com
上的使用者 joe
連線到 localhost
繫結位址,並且它將使用為該使用者連線到該繫結位址配置的任何驗證程序。請注意,伺服器不會認為連線已進行 SSL 加密,因為實際上它在 SSH 伺服器和 PostgreSQL 伺服器之間未進行加密。這不應造成任何額外的安全風險,因為它們位於同一機器上。
為了使通道設定成功,您必須被允許透過 ssh
以 joe@foo.com
身分連線,就像您嘗試使用 ssh
建立終端機工作階段一樣。
您也可以將埠轉發設定為
ssh -L 63333:foo.com:5432 joe@foo.com
但這樣資料庫伺服器會將連線視為來自其 foo.com
繫結位址,而預設設定 listen_addresses = 'localhost'
並未開啟該位址。這通常不是您想要的。
如果您必須透過某些登入主機 “跳躍” 到資料庫伺服器,則一種可能的設定可能如下所示
ssh -L 63333:db.foo.com:5432 joe@shell.foo.com
請注意,這樣從 shell.foo.com
到 db.foo.com
的連線將不會由 SSH 通道加密。當網路受到各種方式的限制時,SSH 提供了相當多的組態可能性。有關詳細資訊,請參閱 SSH 說明文件。
還存在其他幾種應用程式,它們可以使用在概念上與剛才描述的程序類似的程序來提供安全通道。
如果您在說明文件中發現任何不正確、與您特定功能的經驗不符或需要進一步澄清的地方,請使用此表單報告說明文件問題。