<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 19.1\. `pg_hba.conf`文件 客戶端認證是由一個配置文件(通常名為`pg_hba.conf`)控制的, 它存放在數據庫集群的數據目錄里。HBA的意思是"host-based authentication", 也就是基于主機的認證。在`initdb`初始化數據目錄的時候, 它會安裝一個缺省的`pg_hba.conf`文件。不過我們也可以把認證配置文件放在其它地方; 參閱[hba_file](#calibre_link-1558)配置參數。 `pg_hba.conf`文件的常用格式是一組記錄,每行一條。空白行將被忽略, 井號`#`開頭的注釋也被忽略。記錄不能跨行存在。 一條記錄是由若干用空格和/或制表符分隔的字段組成。如果字段用引號包圍,那么它可以包含空白。 在數據庫、用戶或地址文件中引用一個關鍵詞(如,`all` 或 `replication`) 使這個詞失去它的特殊角色,只是用這個名字匹配一個數據庫、用戶或主機。 每條記錄聲明一種連接類型、一個客戶端 IP 地址范圍(如果和連接類型相關的話)、 一個數據庫名、一個用戶名字、對匹配這些參數的連接使用的認證方法。第一條匹配連接類型、 客戶端地址、連接請求的數據庫名和用戶名的記錄將用于執行認證。這個處理過程沒有 "跨越"或者"回頭"的說法:如果選擇了一條記錄而且認證失敗, 那么將不再考慮后面的記錄。如果沒有匹配的記錄,那么訪問將被拒絕。 每條記錄可以是下面七種格式之一: ``` local _database_ _user_ _auth-method_ [`_auth-options_`] host _database_ _user_ _address_ _auth-method_ [`_auth-options_`] hostssl _database_ _user_ _address_ _auth-method_ [`_auth-options_`] hostnossl _database_ _user_ _address_ _auth-method_ [`_auth-options_`] host _database_ _user_ _IP-address_ _IP-mask_ _auth-method_ [`_auth-options_`] hostssl _database_ _user_ _IP-address_ _IP-mask_ _auth-method_ [`_auth-options_`] hostnossl _database_ _user_ _IP-address_ _IP-mask_ _auth-method_ [`_auth-options_`] ``` 各個字段的含義如下: `local` 這條記錄匹配企圖通過 Unix 域套接字進行的連接。沒有這種類型的記錄,就不允許 Unix 域套接字的連接。 `host` 這條記錄匹配企圖通過 TCP/IP 進行的連接。`host`記錄匹配 SSL和非SSL的連接請求。 > **Note:** 除非服務器帶著合適的[listen_addresses](#calibre_link-1559)配置參數值啟動, 否則將不可能進行遠程的 TCP/IP 連接,因為缺省的行為是只監聽本地自環地址`localhost`的連接。 `hostssl` 這條記錄匹配企圖使用 TCP/IP 的 SSL 連接。但必須是使用SSL加密的連接。 要使用這個選項,編譯服務器的時候必須打開SSL支持。 而且在服務器啟動的時候必須打開[ssl](#calibre_link-1385)配置選項(參閱[Section 17.9](#calibre_link-657))。 `hostnossl` 這條記錄與`hostssl`行為相反:它只匹配那些在 TCP/IP 上不使用SSL的連接請求。 `_database_` 聲明記錄所匹配的數據庫名稱。值 `all`表明該記錄匹配所有數據庫, 值`sameuser`表示如果被請求的數據庫和請求的用戶同名,則匹配。 值`samerole`表示請求的用戶必須是一個與數據庫同名的角色中的成員。 (`samegroup`是一個已經廢棄了,但目前仍然被接受的`samerole`同義詞。) 對`samerole`來說,不認為超級用戶是角色的一個成員,除非他們明確的是角色的成員, 直接的或間接的,并且不只是由于超級用戶。值`replication`表示如果請求一個復制鏈接, 則匹配(注意復制鏈接不表示任何特定的數據庫)。在其它情況里,這就是一個特定的 PostgreSQL數據庫名字。可以通過用逗號分隔的方法聲明多個數據庫, 也可以通過前綴`@`來聲明一個包含數據庫名的文件。 `_user_` 為這條記錄聲明所匹配的數據庫用戶。值`all`表明它匹配于所有用戶。否則, 它就是特定數據庫用戶的名字或者是一個前綴`+`的組名稱。請注意, 在PostgreSQL里,用戶和組沒有真正的區別,`+`實際上只是意味著 "匹配任何直接或者間接屬于這個角色的成員",而沒有`+`記號的名字只匹配指定的角色。 為此,超級用戶如果明確是角色的成員,也只算是一個角色的成員,直接的或間接的,而不只是由于超級用戶。 多個用戶名可以通過用逗號分隔的方法聲明。一個包含用戶名的文件可以通過在文件名前面前綴 `@`來聲明。 `_address_` 聲明這條記錄匹配的客戶端機器地址。這個文件可以包含主機名、IP地址范圍或下面提到的特殊關鍵字之一。 IP 地址用標準的帶有CIDR掩碼長度的點分十進制聲明。 掩碼長度表示客戶端 IP 地址必須匹配的高位二進制位數。在給出的 IP 地址里, 這個長度的右邊的二進制位應該為零。在 IP 地址、`/`、 CIDR 掩碼長度之間不能有空白。 典型的這種方式指定的IP地址范圍舉例:`172.20.143.89/32`表示一個主機, `172.20.143.0/24`表示一個小子網,`10.6.0.0/16` 表示一個大子網。`0.0.0.0/0`代表所有IPv4地址,`::/0` 代表所有IPv6地址。要聲明單個主機,給 IPv4 地址聲明 CIDR 掩碼 32 ,給 IPv6 地址聲明 128 。 不要在地址中省略結尾的 0 。 以 IPv4 格式給出的 IP 地址會匹配那些擁有對應地址的 IPv6 連接,比如`127.0.0.1` 將匹配 IPv6 地址`::ffff:127.0.0.1`。一個以 IPv6 格式給出的記錄將只匹配 IPv6 連接, 即使對應的地址在 IPv4-in-IPv6 范圍內。請注意如果系統的 C 庫不支持 IPv6 地址, 那么 IPv6 的格式將被拒絕。 你也可以寫`all`來匹配所有IP地址,`samehost` 來匹配任意服務器IP地址,或`samenet`來匹配任何服務器直接連接到的子網的任意地址。 如果指定了主機名(不是IP地址或作為潛在主機名處理的特殊關鍵字), 那么該名稱與客戶端IP地址進行反向名稱解析的結果進行比較(例如,如果使用了DNS, 那么是反向DNS查找)。主機名的比較是大小寫無關的。如果有一個匹配, 那么正向名稱解析(例如,正向DNS查找)在主機名上執行,以檢查是否有解析的地址等于客戶端IP地址。 如果雙向都匹配,那么這個條目被認為是匹配的。(在`pg_hba.conf` 中使用的主機名應該是客戶端IP地址返回的地址到名稱(address-to-name)解析的那個, 否則這行將不被匹配。某些主機名數據庫允許一個IP地址關聯多個主機名, 但是當要求解析一個IP地址時,操作系統將只返回一個主機名。) 主機名規范以一個點(`.`)開頭,匹配一個實際主機名后綴。 所以`.example.com`將匹配`foo.example.com` (但不只是`example.com`)。 當主機名在`pg_hba.conf`中指定時,你應該確保那個名字解析是相當快的。 它將比建立一個本地名字解析緩存(如`nscd`)有優勢。同樣, 你可能希望啟用配置參數`log_hostname`來查看客戶端主機名,而不是日志中的IP地址。 有時,用戶想知道為什么主機名用這個帶有兩個名字解析和要求反向查找IP地址的看起來復雜的方式處理, 這有時沒有設置或者指向一些不受歡迎的主機名。效率是首要的:一個連接請求需要兩個解析器查找當前客戶端地址。 如果那個地址有解析器問題,那么就只是客戶端問題。一個假想的可供選擇的只做正向查找的實現, 將在每個連接請求時必須解析`pg_hba.conf`中提到的每個主機名。這樣本身就是緩慢的。 并且如果有一個主機名有解析問題,那么所有主機名都會有問題。 另外,要實現后綴匹配功能必須要一個反向查找,因為實際客戶端主機名需要是已知的,為了它對模式匹配。 請注意,這個行為與其他受歡迎的主機基于名稱訪問控制的實現是一致的,比如Apache HTTP Server 和 TCP Wrappers。 這些字段只適用于`host`,`hostssl`,`hostnossl`記錄。 `_IP-address_``_IP-mask_` 這些方法可以用于作為`_CIDR-address_`表示法的替補。它不是聲明掩碼的長度, 而是在另外一個字段里聲明實際的掩碼。比如,`255.0.0.0`表示 IPv4 CIDR 掩碼長度 8 , 而`255.255.255.255`表示 CIDR 掩碼長度 32 。 這些字段只適用于`host`,`hostssl`,`hostnossl`記錄。 `_auth-method_` 聲明連接匹配這條記錄的時候使用的認證方法。可能的選擇在下面簡介, 詳細情況在[Section 19.3](#calibre_link-1259)中介紹。 `trust` 無條件地允許連接。這個方法允許任何可以與PostgreSQL 數據庫服務器連接的用戶以他們期望的任意PostgreSQL 數據庫用戶身份進行連接,而不需要口令或任何其他認證。參閱[Section 19.3.1](#calibre_link-1552)獲取細節。 `reject` 無條件地拒絕連接。常用于從一個組中"過濾"某些主機,例如, 一個`拒絕`行能夠從連接中鎖定一個指定的主機,而稍后的行允許指定網絡中的剩余的主機連接。 `md5` 要求客戶端提供一個 MD5 加密的口令進行認證。參閱[Section 19.3.2](#calibre_link-1553)獲取細節。 `password` 要求客戶端提供一個未加密的口令進行認證。因為口令是以明文形式在網絡上傳遞的, 所以我們不應該在不安全的網絡上使用這個方式。參閱[Section 19.3.2](#calibre_link-1553)獲取細節。 `gss` 使用GSSAPI認證用戶。這只能用于TCP/IP連接。參閱[Section 19.3.3](#calibre_link-505)獲取細節。 `sspi` 使用SSPI認證用戶。這只能在Windows上使用。參閱[Section 19.3.4](#calibre_link-1554)獲取細節。 `krb5` 用 Kerberos V5 認證用戶。只有在進行 TCP/IP 連接的時候才能用。 參閱[Section 19.3.5](#calibre_link-504)獲取細節。 `ident` 獲取客戶的操作系統名然后檢查該用戶是否匹配要求的數據庫用戶名, 方法是用戶的身份通過與運行在客戶端上的 ident 服務器連接進行判斷的。 Ident認證只在進行TCP/IP連接的時候才能用。當指定本地連接時,將使用peer認證。 參閱[Section 19.3.6](#calibre_link-1555)獲取細節。 `peer` 為操作系統獲取客戶端操作系統用戶名,并檢查該用戶是否匹配要求的數據庫用戶名。 該方法只適用于本地連接。參閱[Section 19.3.7](#calibre_link-503)獲取細節。 `ldap` 使用LDAP服務器進行認證。參閱[Section 19.3.8](#calibre_link-1052)獲取細節。 `radius` 使用RADIUS服務器進行認證,參閱[Section 19.3.9](#calibre_link-1051)獲取細節。 `cert` 使用SSL客戶端證書進行認證。參閱[Section 19.3.10](#calibre_link-1391)獲取細節。 `pam` 使用操作系統提供的可插入認證模塊服務(PAM)來認證。參閱[Section 19.3.11](#calibre_link-1556)獲取細節。 `_auth-options_` 在`_auth-method_`字段之后,字段格式可以是`_name_``=``_value_`, 指定認證方法的選項。關于哪個選項可用于哪個認證方法的詳情在下面描述。 用`@`構造包含的文件是當作一列名字讀取的,這些名字可以用空白或者逗號分隔。 注釋用`#`引入,就像在`pg_hba.conf`里那樣, 允許嵌套`@`構造。除非跟在`@`后面的文件名是一個絕對路徑, 否則被當作與該文件所在目錄相對的路徑。 因為認證時系統是為每個連接請求順序檢查`pg_hba.conf`里的記錄的, 所以這些記錄的順序是非常關鍵的。通常,靠前的記錄有比較嚴的連接匹配參數和比較弱的認證方法, 而靠后的記錄有比較松的匹配參數和比較嚴的認證方法。比如,我們一般都希望對本地 TCP/IP 連接使用 `trust`認證,而對遠端的 TCP/IP 連接要求口令。在這種情況下我們將`trust` 認證方法用于來自 127.0.0.1 的連接,這條記錄將出現在允許更廣泛的客戶端 IP 地址的使用口令認證的記錄前面。 在啟動和主服務器進程收到SIGHUP 信號的時候,系統都會重新裝載`pg_hba.conf`文件。 如果你在活躍的系統上編輯了該文件,就必須通知主服務器(使用`pg_ctl reload` 或`kill -HUP`)重新加載該文件。 > **Tip:** 一個用戶要想成功連接到特定的數據庫,不僅需要通過`pg_hba.conf`的檢查, 還必須要有該數據庫上的`CONNECT`權限。如果希望限制哪些用戶能夠連接到哪些數據庫, 賦予/撤銷`CONNECT`權限通常比在`pg_hba.conf`中設置規則簡單。 [Example 19-1](#calibre_link-1560)里是`pg_hba.conf`記錄的一些例子。 閱讀下文理解不同認證方法的細節。 **Example 19-1\. `pg_hba.conf`記錄的例子** ``` # 允許在本機上的任何用戶使用 Unix 域套接字(本地連接的缺省) # 以任何數據庫用戶身份連接任何數據庫 # # TYPE DATABASE USER ADDRESS METHOD local all all trust # 和上面相同,但是使用的是回環的(loopback)TCP/IP 連接 # # TYPE DATABASE USER ADDRESS METHOD host all all 127.0.0.1/32 trust # 和上面一行相同,但是用的是獨立的子網掩碼字段 # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust # 在IPv6上相同。 # # TYPE DATABASE USER ADDRESS METHOD host all all ::1/128 trust # 和上面相同,但是使用一個主機名(通常包括IPv4 和 IPv6)。 # # TYPE DATABASE USER ADDRESS METHOD host all all localhost trust # 允許 IP 地址為 192.168.93.x 的任何主機與 "postgres" 數據庫相連, # 用與他們在自己的主機上相同 ident 的用戶名標識他自己(通常是他的操作系統用戶名) # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.93.0/24 ident # 允許來自主機 192.168.12.10 的用戶提供了正確的口令之后與 "postgres" 數據庫連接。 # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.12.10/32 md5 # 允許來自在example.com域里的主機的用戶在提供了正確的口令之后與任意數據庫連接。 # # TYPE DATABASE USER ADDRESS METHOD host all all .example.com md5 # 如果前面沒有其它 "host" 行,那么下面兩行將拒絕所有來自 192.168.54.1 的連接請求(因為前面的記錄先匹配)。 # 但是允許來自互聯網上其它任何地方的有效的 Kerberos 5 認證的連接。 # 零掩碼引起不考慮主機 IP 的任何位。因此它匹配任何主機。 # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.54.1/32 reject host all all 0.0.0.0/0 krb5 # 允許來自 192.168.x.x 的任何用戶與任意數據庫連接,只要他們通過 ident 檢查。 # 但如果 ident 說該用戶是 "bryanh" 且他要求以 PostgreSQL 用戶 "guest1" 連接, # 那么只有在 pg_ident.conf 里有 "omicron" 的映射說 "bryanh" 允許以 "guest1" 進行連接時才真正可以進行連接。 # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.0.0/16 ident map=omicron # 如果下面是用于本地連接的僅有的三行,那么它們將允許本地用戶只和同名數據庫連接。 # 只有管理員和 "support" 角色里的成員例外,他們可以連接到任何數據庫。 # $PGDATA/admins 文件列出了那些允許與所有數據庫連接的用戶名。 # 在所有情況下都需要口令。 # # TYPE DATABASE USER ADDRESS METHOD local sameuser all md5 local all @admins md5 local all +support md5 # 上面最后兩行可以合起來寫成一行 local all @admins,+support md5 # 數據庫字段也可以使用列表和文件名: local db1,db2,@demodbs all md5 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看