2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1

19.3. 連線和認證 #

19.3.1. 連線設定 #

listen_addresses (string) #

指定伺服器監聽客戶端連線的 TCP/IP 地址。該值可以是一個或多個由逗號分隔的 主機名 和/或數字 IP 地址的列表。特殊條目 * 對應所有可用的 IP 介面。條目 0.0.0.0 允許監聽所有 IPv4 地址,而 :: 允許監聽所有 IPv6 地址。如果列表為空,伺服器根本不會監聽任何 IP 介面,在這種情況下只能使用 Unix 域套接字連線伺服器。如果列表不為空,伺服器將在至少一個 TCP/IP 地址上啟動監聽。對於任何無法開啟的 TCP/IP 地址都會發出警告。預設值為 localhost,它只允許建立本地 TCP/IP “迴環” 連線。

儘管客戶端認證 (第 20 章) 允許對誰可以訪問伺服器進行細粒度控制,但 listen_addresses 控制哪些介面接受連線嘗試,這可以幫助防止在不安全的網路介面上反覆出現惡意連線請求。此引數只能在伺服器啟動時設定。

port (integer) #

伺服器監聽的 TCP 埠;預設是 5432。請注意,伺服器監聽的所有 IP 地址都使用相同的埠號。此引數只能在伺服器啟動時設定。

max_connections (integer) #

確定到資料庫伺服器的最大併發連線數。預設值通常是 100 個連線,但如果您的核心設定不支援(在 initdb 期間確定),可能會更少。此引數只能在伺服器啟動時設定。

PostgreSQL 根據 max_connections 的值直接調整某些資源的大小。增加其值會導致對這些資源的分配增加,包括共享記憶體。

執行備用伺服器時,必須將此引數設定為與主伺服器相同或更高的值。否則,將不允許在備用伺服器上執行查詢。

reserved_connections (integer) #

確定為具有 pg_use_reserved_connections 角色的連線保留的連線“”數量。當空閒連線槽的數量大於 superuser_reserved_connections 但小於或等於 superuser_reserved_connectionsreserved_connections 的總和時,新連線將僅接受給超級使用者和具有 pg_use_reserved_connections 許可權的角色。如果可用連線槽的數量等於或少於 superuser_reserved_connections,新連線將僅接受給超級使用者。

預設值為零連線。該值必須小於 max_connections 減去 superuser_reserved_connections。此引數只能在伺服器啟動時設定。

superuser_reserved_connections (integer) #

確定為 PostgreSQL 超級使用者連線保留的連線“”數量。最多隻能有 max_connections 個連線可以同時處於活動狀態。當活動併發連線數至少為 max_connections 減去 superuser_reserved_connections 時,新連線將僅接受給超級使用者。此引數保留的連線槽旨在作為最後儲備,在 reserved_connections 保留的槽用完後用於緊急使用。

預設值為三個連線。該值必須小於 max_connections 減去 reserved_connections。此引數只能在伺服器啟動時設定。

unix_socket_directories (string) #

指定伺服器監聽客戶端連線的 Unix 域套接字目錄。可以透過列出多個由逗號分隔的目錄來建立多個套接字。條目之間的空格將被忽略;如果目錄名稱包含空格或逗號,請用雙引號將其括起來。空值表示不監聽任何 Unix 域套接字,在這種情況下只能使用 TCP/IP 套接字連線伺服器。

@ 開頭的值表示將建立一個 抽象名稱空間 中的 Unix 域套接字(目前僅支援 Linux)。在這種情況下,該值不指定“目錄”,而是計算實際套接字名稱的字首,其方式與檔案系統名稱空間相同。儘管抽象套接字名稱字首可以自由選擇,但由於它不是檔案系統位置,因此習慣上仍使用類似 @/tmp 的檔案系統類值。

預設值通常是 /tmp,但可以根據構建時間進行更改。在 Windows 上,預設值為空,這意味著預設情況下不會建立 Unix 域套接字。此引數只能在伺服器啟動時設定。

除了套接字檔案本身(命名為 .s.PGSQL.nnnn,其中 nnnn 是伺服器的埠號)之外,在 unix_socket_directories 中的每個目錄中還會建立一個名為 .s.PGSQL.nnnn.lock 的普通檔案。這兩個檔案都不應手動刪除。對於抽象名稱空間中的套接字,不會建立鎖定檔案。

unix_socket_group (string) #

設定 Unix 域套接字的所有者組。(套接字的所有者使用者始終是啟動伺服器的使用者。)與 unix_socket_permissions 引數結合使用,可以作為 Unix 域連線的額外訪問控制機制。預設值為空字串,它使用伺服器使用者的預設組。此引數只能在伺服器啟動時設定。

此引數在 Windows 上不受支援。任何設定都將被忽略。同樣,抽象名稱空間中的套接字沒有檔案所有者,因此在這種情況下此設定也將被忽略。

unix_socket_permissions (integer) #

設定 Unix 域套接字的訪問許可權。Unix 域套接字使用通常的 Unix 檔案系統許可權集。引數值應以 chmodumask 系統呼叫接受的格式指定的數字模式。(要使用習慣的八進位制格式,數字必須以 0(零)開頭。)

預設許可權為 0777,表示任何人都可以連線。合理的替代方案是 0770(僅限使用者和組,另請參見 unix_socket_group)和 0700(僅限使用者)。(請注意,對於 Unix 域套接字,只有寫許可權才重要,因此設定或撤銷讀或執行許可權沒有意義。)

此訪問控制機制獨立於 第 20 章 中描述的機制。

此引數只能在伺服器啟動時設定。

此引數在忽略套接字許可權的系統(例如 Solaris 10 之後的 Solaris)上無關緊要。在那裡,可以透過將 unix_socket_directories 指向具有受限搜尋許可權的目錄來實現類似效果。

抽象名稱空間中的套接字沒有檔案許可權,因此在這種情況下此設定也將被忽略。

bonjour (boolean) #

啟用透過 Bonjour 廣告伺服器的存在。預設值為 off。此引數只能在伺服器啟動時設定。

bonjour_name (string) #

指定 Bonjour 服務名稱。如果此引數設定為空字串 ''(這是預設值),則使用計算機名稱。如果伺服器不是使用 Bonjour 支援編譯的,則此引數將被忽略。此引數只能在伺服器啟動時設定。

19.3.2. TCP 設定 #

tcp_keepalives_idle (integer) #

指定在沒有網路活動後作業系統應向客戶端傳送 TCP keepalive 訊息的時間量。如果此值未指定單位,則視為秒。值為 0(預設值)會選擇作業系統的預設值。在 Windows 上,將值設定為 0 會將此引數設定為 2 小時,因為 Windows 不提供讀取系統預設值的方法。此引數僅在支援 TCP_KEEPIDLE 或等效套接字選項的系統以及 Windows 上受支援;在其他系統上,它必須為零。在透過 Unix 域套接字連線的會話中,此引數將被忽略,並且始終讀為零。

tcp_keepalives_interval (integer) #

指定在未被客戶端確認的 TCP keepalive 訊息應該被重傳的時間量。如果此值未指定單位,則視為秒。值為 0(預設值)會選擇作業系統的預設值。在 Windows 上,將值設定為 0 會將此引數設定為 1 秒,因為 Windows 不提供讀取系統預設值的方法。此引數僅在支援 TCP_KEEPINTVL 或等效套接字選項的系統以及 Windows 上受支援;在其他系統上,它必須為零。在透過 Unix 域套接字連線的會話中,此引數將被忽略,並且始終讀為零。

tcp_keepalives_count (integer) #

指定在伺服器與客戶端的連線被視為死掉之前可以丟失多少個 TCP keepalive 訊息。值為 0(預設值)會選擇作業系統的預設值。此引數僅在支援 TCP_KEEPCNT 或等效套接字選項的系統上受支援(不包括 Windows);在其他系統上,它必須為零。在透過 Unix 域套接字連線的會話中,此引數將被忽略,並且始終讀為零。

tcp_user_timeout (integer) #

指定傳輸的資料在被確認之前可能保持未確認的時間量,之後 TCP 連線將被強制關閉。如果此值未指定單位,則視為毫秒。值為 0(預設值)會選擇作業系統的預設值。此引數僅在支援 TCP_USER_TIMEOUT 的系統上受支援(不包括 Windows);在其他系統上,它必須為零。在透過 Unix 域套接字連線的會話中,此引數將被忽略,並且始終讀為零。

client_connection_check_interval (integer) #

設定在執行查詢期間,進行可選的客戶端仍然連線的檢查之間的時間間隔。檢查是透過輪詢套接字進行的,並允許在核心報告連線已關閉時更早地中止長時間執行的查詢。

此選項依賴於 Linux、macOS、illumos 和 BSD 系列作業系統公開的核心事件,目前在其他系統上不可用。

如果未指定單位,則該值視為毫秒。預設值為 0,表示停用連線檢查。沒有連線檢查,伺服器將在下次與套接字互動時(當它等待、接收或傳送資料時)才檢測到連線丟失。

為了讓核心本身在所有場景(包括網路故障)中可靠地在已知時間內檢測到丟失的 TCP 連線,可能還需要調整作業系統的 TCP keepalive 設定,或者 PostgreSQLtcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count 設定。

19.3.3. 認證 #

authentication_timeout (integer) #

完成客戶端認證所允許的最大時間。如果一個潛在的客戶端在此時間內未能完成認證協議,伺服器將關閉連線。這可以防止掛起的客戶端無限期地佔用連線。如果此值未指定單位,則視為秒。預設值為一分鐘(1m)。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

password_encryption (enum) #

當在 CREATE ROLEALTER ROLE 中指定密碼時,此引數決定用於加密密碼的演算法。可能的值為 scram-sha-256,它將使用 SCRAM-SHA-256 加密密碼;以及 md5,它將密碼儲存為 MD5 雜湊。預設值為 scram-sha-256

請注意,較舊的客戶端可能不支援 SCRAM 認證機制,因此無法使用 SCRAM-SHA-256 加密的密碼。有關更多詳細資訊,請參見 20.5. 密碼認證

警告

MD5 加密密碼的支援已棄用,將在 PostgreSQL 的未來版本中移除。有關遷移到其他密碼型別的詳細資訊,請參閱第 20.5 節

scram_iterations (integer) #

使用 SCRAM-SHA-256 加密密碼時執行的計算迭代次數。預設值為 4096。較高的迭代次數可提供額外的保護,防止儲存密碼遭受暴力破解攻擊,但會使認證變慢。更改此值不會影響使用 SCRAM-SHA-256 加密的現有密碼,因為迭代次數在加密時固定。為了利用更改後的值,必須設定新密碼。

md5_password_warnings (boolean) #

控制當 CREATE ROLEALTER ROLE 語句設定 MD5 加密密碼時,是否會生成有關 MD5 密碼棄用的 WARNING。預設值為 on

krb_server_keyfile (string) #

設定伺服器的 Kerberos 金鑰檔案位置。預設值為 FILE:/usr/local/pgsql/etc/krb5.keytab(其中目錄部分是構建時指定的 sysconfdir;使用 pg_config --sysconfdir 來確定)。如果此引數設定為空字串,則忽略它,並使用系統相關的預設值。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。有關更多資訊,請參見 20.6. GSSAPI 認證

krb_caseins_users (boolean) #

設定 GSSAPI 使用者名稱是否應被視為不區分大小寫。預設值為 off(區分大小寫)。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

gss_accept_delegation (boolean) #

設定是否應從客戶端接受 GSSAPI 代理。預設值為 off,表示客戶端的憑據將 被接受。將其更改為 on 將使伺服器接受從客戶端代理給它的憑據。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

oauth_validator_libraries (string) #

用於驗證 OAuth 連線令牌的庫。如果只提供一個驗證器庫,它將預設用於任何 OAuth 連線;否則,所有 oauth HBA 條目 都必須顯式設定一個從該列表中選擇的 validator。如果設定為(預設的)空字串,OAuth 連線將被拒絕。此引數只能在 postgresql.conf 檔案中設定。

驗證器模組必須單獨實現/獲取;PostgreSQL 不提供任何預設實現。有關實現 OAuth 驗證器的更多資訊,請參見 第 50 章

19.3.4. SSL #

有關設定的資訊,請參見 18.9. 使用 SSL 進行安全 TCP/IP 連線SSL。用於控制使用TLS協議進行傳輸加密的配置引數,出於歷史原因命名為 ssl,儘管對SSL協議的支援已被棄用。SSL在此上下文中使用,與TLS.

ssl (boolean) #

啟用SSL連線。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為 off

ssl_ca_file (string) #

指定包含 SSL 伺服器證書頒發機構 (CA) 的檔名。相對路徑相對於資料目錄。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為空,表示不載入 CA 檔案,並且不執行客戶端證書驗證。

ssl_cert_file (string) #

指定包含 SSL 伺服器證書的檔名。相對路徑相對於資料目錄。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為 server.crt

ssl_crl_file (string) #

指定包含 SSL 客戶端證書吊銷列表 (CRL) 的檔名。相對路徑相對於資料目錄。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為空,表示不載入 CRL 檔案(除非設定了 ssl_crl_dir)。

ssl_crl_dir (string) #

指定包含 SSL 客戶端證書吊銷列表 (CRL) 的目錄名稱。相對路徑相對於資料目錄。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為空,表示不使用 CRL(除非設定了 ssl_crl_file)。

目錄需要使用 OpenSSL 命令 openssl rehashc_rehash 進行準備。有關詳細資訊,請參見其文件。

使用此設定時,指定目錄中的 CRL 將在連線時按需載入。新 CRL 可以新增到目錄中,並將立即使用。這與 ssl_crl_file 不同,後者會導致檔案中的 CRL 在伺服器啟動時或配置重新載入時載入。兩者都可以一起使用。

ssl_key_file (string) #

指定包含 SSL 伺服器私鑰的檔名。相對路徑相對於資料目錄。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為 server.key

ssl_tls13_ciphers (string) #

指定允許使用TLS版本 1.3 的連線使用的密碼套件列表。可以使用冒號分隔的列表指定多個密碼套件。如果留空,將使用 OpenSSL 的預設密碼套件集。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

ssl_ciphers (string) #

指定允許使用 TLS 版本 1.2 及更低版本進行連線的SSL密碼列表,對於 TLS 版本 1.3 連線,請參閱 ssl_tls13_ciphers。有關此設定的語法和支援值的列表,請參閱 OpenSSL 包中的 ciphers 手冊頁。預設值為 HIGH:MEDIUM:+3DES:!aNULL。除非您有特定的安全要求,否則預設值通常是一個合理的選擇。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

預設值的解釋

HIGH #

使用 HIGH 組中的密碼(例如 AES、Camellia、3DES)的密碼套件。

MEDIUM #

使用 MEDIUM 組中的密碼(例如 RC4、SEED)的密碼套件。

+3DES #

HIGHOpenSSL 預設順序存在問題,因為它將 3DES 的優先順序排在 AES128 之前。這是錯誤的,因為 3DES 的安全性低於 AES128,而且速度也慢得多。+3DES 將其重新排序到所有其他 HIGHMEDIUM 密碼之後。

!aNULL #

停用不進行身份驗證的匿名密碼套件。此類密碼套件容易受到MITM攻擊,因此不應使用。

可用的密碼套件詳細資訊將因 OpenSSL 版本而異。使用命令 openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL' 檢視當前安裝的 OpenSSL 版本的實際詳細資訊。請注意,此列表將在執行時根據伺服器金鑰型別進行過濾。

ssl_prefer_server_ciphers (boolean) #

指定是使用伺服器的 SSL 密碼首選項,而不是客戶端的。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為 on

PostgreSQL 9.4 之前的版本沒有此設定,並且始終使用客戶端的首選項。使用伺服器的首選項通常更好,因為伺服器更有可能經過適當配置。

ssl_groups (string) #

指定在ECDH金鑰交換中使用的曲線的名稱。它需要被所有連線的客戶端支援。可以使用冒號分隔的列表指定多條曲線。它不需要與伺服器的橢圓曲線金鑰使用的曲線相同。此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為 X25519:prime256v1

OpenSSL 中最常見曲線的名稱是:prime256v1 (NIST P-256)、secp384r1 (NIST P-384)、secp521r1 (NIST P-521)。可以使用命令 openssl ecparam -list_curves 顯示可用組的不完整列表。並非所有這些組都可用於TLS,並且許多支援的組名稱和別名已被省略。

PostgreSQL 18.0 之前的版本中,此設定名為 ssl_ecdh_curve,並且只接受單個值。

ssl_min_protocol_version (enum) #

設定要使用的最低 SSL/TLS 協議版本。當前有效值包括:TLSv1TLSv1.1TLSv1.2TLSv1.3。舊版本的 OpenSSL 庫不支援所有值;如果選擇了不支援的設定,將引發錯誤。TLS 1.0 之前的協議版本,即 SSL 版本 2 和 3,始終被停用。

預設值為 TLSv1.2,這符合當前的行業最佳實踐。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

ssl_max_protocol_version (enum) #

設定要使用的最高 SSL/TLS 協議版本。有效值與 ssl_min_protocol_version 相同,此外還有一個空字串,它允許任何協議版本。預設允許任何版本。設定最高協議版本主要用於測試,或當某個元件在與較新協議配合使用時出現問題時。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

ssl_dh_params_file (string) #

指定包含用於所謂的臨時 DH 密碼族的 Diffie-Hellman 引數的檔名。預設值為空,在這種情況下使用編譯時預設的 DH 引數。使用自定義 DH 引數可以減少攻擊者破解廣為人知的編譯時 DH 引數的風險。您可以使用命令 openssl dhparam -out dhparams.pem 2048 建立自己的 DH 引數檔案。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

ssl_passphrase_command (string) #

設定當需要獲取解密 SSL 檔案(如私鑰)的密碼時要呼叫的外部命令。預設情況下,此引數為空,這意味著使用內建的提示機制。

該命令必須將密碼列印到標準輸出並以程式碼 0 退出。在引數值中,%p 會被替換為提示字串。(寫入 %% 表示字面量的 %。)請注意,提示字串可能包含空格,請確保充分引用。如果存在,則從輸出末尾剝離單個換行符。

該命令實際上不必提示使用者輸入密碼。它可以從檔案中讀取密碼,從鑰匙串設施獲取密碼,或者類似操作。由使用者自行確保所選機制足夠安全。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

ssl_passphrase_command_supports_reload (boolean) #

此引數決定在配置重新載入期間是否也呼叫由 ssl_passphrase_command 設定的密碼命令,如果金鑰檔案需要密碼。如果此引數為 off(預設值),則 ssl_passphrase_command 在重新載入期間將被忽略,並且如果需要密碼,SSL 配置將不會被重新載入。該設定適用於需要 TTY 進行提示的命令,因為在伺服器執行時可能無法獲得 TTY。將此引數設定為 on 可能適用於從檔案獲取密碼等情況。

此引數只能在 postgresql.conf 檔案或伺服器命令列中設定。

提交更正

如果您在文件中看到任何不正確的內容,與您使用特定功能的經驗不符,或者需要進一步的解釋,請使用 此表單 來報告文件問題。