PostgreSQL的訪問控制(pg_hba.conf)

9.4英文文檔:http://www.postgresql.org/docs/9.4/static/auth-pg-hba-conf.htmlphp

9.3中文文檔:http://58.58.27.50:8079/doc/html/9.3.1_zh/auth-pg-hba-conf.html
html

參考:http://database.51cto.com/art/201108/286176.htm
sql


  在PostgreSQL數據庫中,配置文件(一般名爲pg_hba.conf)負責控制客戶端認證(也就是設置PostgreSQL容許哪些IP的及其訪問), 它存放在數據庫集羣的數據目錄裏。HBA的意思是"host-based authentication", 也就是基於主機的認證。在initdb初始化數據目錄的時候, 它會安裝一個缺省的pg_hba.conf文件。不過咱們也能夠把認證配置文件放在其它地方; 參閱hba_file配置參數。數據庫

  經常使用的pg_hba.conf配置:安全

# TYPE    DATABASE   USER     CIDR-ADDRESS            METHOD  
# "local" is for Unix domain socket connections only  
  local   all      all                             ident  
# IPv4 local connections:  
  host    all      all     127.0.0.1/32            md5  
# IPv6 local connections:  
  host    all      all    ::1/128               md5

  TYPE定義了多種鏈接PostgreSQL的方式,分別是:「local」使用本地unix套接字,「host」使用TCP/IP鏈接(包括SSL和非SSL),「host」結合「IPv4地址」使用IPv4方式,結合「IPv6地址」則使用IPv6方式,「hostssl」只能使用SSL TCP/IP鏈接,「hostnossl」不能使用SSL TCP/IP鏈接。
服務器

  DATABASE指定哪一個數據庫,多個數據庫,庫名間以逗號分隔。「all」只有在沒有其餘的符合條目時才表明「全部」,若是有其餘的符合條目則表明「除了該條以外的」,由於「all」的優先級最低。以下例:dom

local      db1      user1          reject  
local      all      all            ident

  這兩條都是指定local訪問方式,由於前一條指定了特定的數據庫db1,因此後一條的all表明的是除了db1以外的數據庫,同理用戶的all也是這個道理。
socket

  USER 指定哪一個數據庫用戶(PostgreSQL正規的叫法是角色,role)。多個用戶以逗號分隔。tcp

  CIDR-ADDRESS 項local方式沒必要填寫,該項能夠是IPv4地址或IPv6地址,能夠定義某臺主機或某個網段。
ide

  IP 地址用標準的帶有CIDR掩碼長度的點分十進制聲明。 掩碼長度表示客戶端 IP 地址必須匹配的高位二進制位數。在給出的 IP 地址裏, 這個長度的右邊的二進制位應該爲零。在 IP 地址、/、 CIDR 掩碼長度之間不能有空白。

  典型的這種方式指定的IP地址範圍舉例:

  172.20.143.89/32表示一個主機, 

  172.20.143.0/24表示一個小子網(172.20.143.0-172.20.143.255),

  10.6.0.0/16 表示一個大子網(10.6.0.0-10.6.255.255)。

  0.0.0.0/0表明全部IPv4地址,

  ::/0表明全部IPv6地址。

  要聲明單個主機,給 IPv4 地址聲明 CIDR 掩碼 32 ,給 IPv6 地址聲明 128 。 不要在地址中省略結尾的 0 。

  METHOD 指定如何處理客戶端的認證。經常使用的有ident,md5,password,trust,reject。

  ident是Linux下PostgreSQL默認的local認證方式,凡是能正確登陸服務器的操做系統用戶(注:不是數據庫用戶)就能使用本用戶映射的數據庫用戶不需密碼登陸數據庫。用戶映射文件爲pg_ident.conf,這個文件記錄着與操做系統用戶匹配的數據庫用戶,若是某操做系統用戶在本文件中沒有映射用戶,則默認的映射數據庫用戶與操做系統用戶同名。好比,服務器上有名爲user1的操做系統用戶,同時數據庫上也有同名的數據庫用戶,user1登陸操做系統後能夠直接輸入psql,以user1數據庫用戶身份登陸數據庫且不需密碼。

   不少初學者都會遇到psql -U username登陸數據庫卻出現「username ident 認證失敗」的錯誤,明明數據庫用戶已經createuser。緣由就在於此,使用了ident認證方式,卻沒有同名的操做系統用戶或沒有相應的映射用戶。解決方案:一、在pg_ident.conf中添加映射用戶;二、改變認證方式。

   md5是經常使用的密碼認證方式,若是你不使用ident,最好使用md5。密碼是以md5形式傳送給數據庫,較安全,且不需創建同名的操做系統用戶。

  password是以明文密碼傳送給數據庫,建議不要在生產環境中使用。

  trust是隻要知道數據庫用戶名就不須要密碼或ident就能登陸,建議不要在生產環境中使用。reject是拒絕認證。

   本地使用psql登陸數據庫,是以unix套接字的方式,附合local方式。

   使用PGAdmin3或php登陸數據庫,不管是否本地均是以TCP/IP方式,附合host方式。若是是本地(數據庫地址localhost),CIDR-ADDRESS則爲127.0.0.1/32。

   例如:

一、容許本地使用PGAdmin3登陸數據庫,數據庫地址localhost,用戶user1,數據庫user1db:

host  user1db  user1     127.0.0.1/32   md5

二、容許10.1.1.0~10.1.1.255網段登陸數據庫:

host  all    all     10.1.1.0/24     md5

三、信任192.168.1.10登陸數據庫:

host  all    all     192.168.1.10/32    trust

注意:1.pg_hba.conf修改後須要reload或者重啓服務後才起效。

    使用pg_ctl reload從新讀取pg_hba.conf文件,若是pg_ctl找不到數據庫,則用-D /.../pgsql/data/指定數據庫目錄,或export PGDATA=/.../pgsql/data/ 導入環境變量。

    2.還須要配置postgresql.conf 中的listen_address=*時,才能經過TCP/IP訪問數據庫。

    PostgreSQL默認只監聽本地端口,用netstat -tuln只會看到「tcp 127.0.0.1:5432 LISTEN」。修改postgresql.conf 中的listen_address=*,監聽全部端口,這樣遠程才能經過TCP/IP登陸數據庫,用netstat -tuln會看到「tcp 0.0.0.0:5432 LISTEN」。

相關文章
相關標籤/搜索