日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从pg_hba.conf文件谈谈postgresql的连接认证

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从pg_hba.conf文件谈谈postgresql的连接认证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一直在弄postgresql的東西,搭建postgresql數據庫集群環境什么的。操作數據庫少不得要從遠程主機訪問數據庫環境,例如數據庫管理員的遠程管理數據庫,遠程的客戶存取數據庫文件。

而在postgresql中配置文件pg_hba.conf就是用來設置訪問認證的重要文件。這里重點談談pg_hba.conf這個文件。

首先聲明,本文說明的內容基于postgresql的9.5.4版本,可能和某些低版本的說明有出入,這是postgresql官方自己更新的,如果想看低版本的,可以自己查看下那個對應版本的用戶手冊。

1.pg_hba.conf文件

在pg_hba.conf文件中,每條記錄占一行,指定一條訪問認證規則。

總的來說訪問控制記錄大致有以下7種形式:

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]

下面對每個字段分別進行說明。


連接方式(type)

連接方式有四種:local 、host、hostssl、hostnossl

local

這條記錄匹配通過 Unix 域套接字進行的聯接企圖, 沒有這種類型的記錄,就不允許 Unix 域套接字的聯接。

host

這條記錄匹配通過TCP/IP網絡進行的聯接嘗試.他既匹配通過ssl方式的連接,也匹配通過非ssl方式的連接。

注意:要使用該選項你要在postgresql.conf文件里設置listen_address選項,不在listen_address里的IP地址是無法匹配到的。因為默認的行為是只在localhost上監聽本地連接。

hostssl

這條記錄匹配通過在TCP/IP上進行的SSL聯接企圖。

要使用該選項,服務器編譯時必須使用--with-openssl選項,并且在服務器啟動時ssl設置是打開的,具體內容可見這里。

hostnossl

這個和上面的hostssl相反,只匹配通過在TCP/IP上進行的非SSL聯接企圖。


數據庫(database)

聲明記錄所匹配的數據庫。

值 all 表明該記錄匹配所有數據庫;

值 sameuser表示如果被請求的數據庫和請求的用戶同名,則匹配;

值samegroup 表示請求的用戶必須是一個與數據庫同名的組中的成員;

值 replication 表示匹配一條replication連接,它不指定一個特定的數據庫,一般在流復制中使用;

在其他情況里,這就是一個特定的 PostgreSQL 數據庫的名字。 我們可以通過用逗號分隔的方法聲明多個數據庫。 一個包含數據庫名的文件可以通過對該文件前綴 @ 來聲明.該文件必需和 pg_hba.conf 在同一個目錄。


用戶名(user)

為這條記錄聲明所匹配的 PostgreSQL 用戶,值 all 表明它匹配 于所有用戶。否則,它就是特定 PostgreSQL 用戶的名字,多個用戶名可以通過用逗號分隔的方法聲明,在名字前面加上+代表匹配該用戶組的所有用戶。一個包含用戶名的文件可以 通過在文件名前面前綴 @ 來聲明,該文件必需和 pg_hba.conf 在同一個目錄。


主機地址(address)

指定匹配的客戶端的地址,它可以是一個主機名,一個IP地址范圍,或者下面提到的這些選項。

一個IP地址范圍是一個標準的點分十進制表示的 IP地址/掩碼值。注意, 在'IP地址','/'和'掩碼值'之間不要有任何的空白字符。

比如對于IPv4地址來說, 172.20.143.89/32指定單個主機的IP,172.20.143.0/24代表一個小的子網。對于IPv6地址來說,::1/128指定單個主機(這里是本機環回地址),fe80::7a31:c1ff:0000:0000/96 指定一個IPv6的子網。0.0.0.0/0代表所有IPv4地址,::0/0代表所有IPv6地址。

一個IPv4地址選項只能匹配IPv4地址,一個IPv6地址選項只能匹配IPv6地址,即使給出的地址選項在IPV4和IPv6中同時存在。

當然你可以使用 all 選項來匹配所有的IP地址,使用 samehost 匹配服務器自己所有的IP地址,samenet來匹配服務器直接接入的子網。

如果指定的是主機名(既不是IP地址也不是上面提到的選項),這個主機名將會和發起連接請求的客戶端的IP地址的反向名稱解析結果(即通過客戶端的IP解析其主機名,比如使用反向DNS查找)進行比對,如果存在匹配,再使用正向名稱解析(例如DNS查找)將主機名解析為IP地址(可能有多個IP地址),再判斷客戶端的IP地址是否在這些IP地址中。如果正向和反向解析都成功匹配,那么就真正匹配這個地址(所以在pg_nba.conf文件里的主機地址必須是客戶端IP的 address-to-name 解析返回的那個主機名。一些主機名數據庫允許將一個IP地址和多個主機名綁定,但是在解析IP地址時,操作系統只會返回一個主機名)。

有些主機名以點(.)開頭,匹配那些具有相同后綴的主機名,比如.example.com匹配foo.example.com(當然不僅僅只匹配foo.example.com)。

還有,在pg_hba.conf文件中使用主機名的時候,你最好能保證主機名的解析比較快,一個好的建議就是建立一個本地的域名解析緩存(比如nscd)。

本選項只能在連接方式是host,hostssl或者hostnossl的時候指定。


ip地址(ip-address)、子網掩碼(ip-mask)

這兩個字段包含可以看成是標準點分十進制表示的 IP地址/掩碼值的一個替代。例如。使用255.255.255.0 代表一個24位的子網掩碼。它們倆放在一起,聲明了這條記錄匹配的客戶機的 IP 地址或者一個IP地址范圍。本選項只能在連接方式是host,hostssl或者hostnossl的時候指定。


認證方法(authentication method)

trust

無條件地允許聯接,這個方法允許任何可以與PostgreSQL 數據庫聯接的用戶以他們期望的任意 PostgreSQL 數據庫用戶身份進行聯接,而不需要口令。

reject

聯接無條件拒絕,常用于從一個組中"過濾"某些主機。

md5

要求客戶端提供一個 MD5 加密的口令進行認證,這個方法是允許加密口令存儲在pg_shadow里的唯一的一個方法。

password

和"md5"一樣,但是口令是以明文形式在網絡上傳遞的,我們不應該在不安全的網絡上使用這個方式。

gss

使用GSSAPI認證用戶,這只適用于 TCP/IP 連接。

sspi

使用SSPI認證用戶,這只適用于 Windows 連接。

peer

獲取客戶端的操作系統的用戶名并判斷他是否匹配請求的數據庫名,這只適用于本地連接。

ldap

使用LDAP服務進行驗證。

radius

使用RADIUS服務進行驗證。

cert

使用SSL服務進行驗證。

pam

使用操作系統提供的可插入的認證模塊服務 (Pluggable Authentication Modules)(PAM)來認證。


認證配置(authentication-option)

這個可選的字段的含義取決與選擇的認證方法。手冊上也沒有具體的說明,但是給出了如下的例子供參考。

# Allow any user on the local system to connect to any database with # any database user name using Unix-domain sockets (the default for local # connections). # # TYPE DATABASE USER ADDRESS METHOD local all all trust# The same using local loopback TCP/IP connections. # # TYPE DATABASE USER ADDRESS METHOD host all all 127.0.0.1/32 trust# The same as the previous line, but using a separate netmask column # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust# The same over IPv6. # # TYPE DATABASE USER ADDRESS METHOD host all all ::1/128 trust# The same using a host name (would typically cover both IPv4 and IPv6). # # TYPE DATABASE USER ADDRESS METHOD host all all localhost trust# Allow any user from any host with IP address 192.168.93.x to connect # to database "postgres" as the same user name that ident reports for # the connection (typically the operating system user name). # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.93.0/24 ident# Allow any user from host 192.168.12.10 to connect to database # "postgres" if the user's password is correctly supplied. # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.12.10/32 md5# Allow any user from hosts in the example.com domain to connect to # any database if the user's password is correctly supplied. # # TYPE DATABASE USER ADDRESS METHOD host all all .example.com md5# In the absence of preceding "host" lines, these two lines will # reject all connections from 192.168.54.1 (since that entry will be # matched first), but allow GSSAPI connections from anywhere else # on the Internet. The zero mask causes no bits of the host IP # address to be considered, so it matches any host. # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.54.1/32 reject host all all 0.0.0.0/0 gss# Allow users from 192.168.x.x hosts to connect to any database, if # they pass the ident check. If, for example, ident says the user is # "bryanh" and he requests to connect as PostgreSQL user "guest1", the # connection is allowed if there is an entry in pg_ident.conf for map # "omicron" that says "bryanh" is allowed to connect as "guest1". # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.0.0/16 ident map=omicron# If these are the only three lines for local connections, they will # allow local users to connect only to their own databases (databases # with the same name as their database user name) except for administrators # and members of role "support", who can connect to all databases. The file # $PGDATA/admins contains a list of names of administrators. Passwords # are required in all cases. # # TYPE DATABASE USER ADDRESS METHOD local sameuser all md5 local all @admins md5 local all +support md5# The last two lines above can be combined into a single line: local all @admins,+support md5# The database column can also use lists and file names: local db1,db2,@demodbs all md5

2.一些tips和建議

  • pg_hba.conf文件是如此重要,我們最好在建立數據庫的時候就將它配置好,免得后來配置環境時出一些奇奇怪怪的錯誤。在修改pg_hba.conf文件后一定要記得pg_ctl reload一下。當然,還要做好備份。
  • 可能是強迫癥,我每次配置都是盡量最小配置(實際上也應該這么做),比如指定用戶名,數據庫和可訪問IP地址的時候,就只給最小權限,最小范圍就好了,避免自己誤操作是一回事,同時,把數據庫暴露在太多人面前總覺得不安全。
  • 對于訪問認證的控制,除了在pg_hba.conf里面設置外,也應該在數據庫里再進一步設置,比如給某個用戶只授予所需的最低權限,比如對查詢用戶就只給所需的某幾個數據庫數據庫的讀權限,其他的只給數據庫表的增刪改查權限等,這里不贅述。
  • 慎用trust認證方式,不要怕偷懶輸密碼,對于珍貴的數據來說多小心一點總沒錯,不然的話請閱讀《postgresql刪庫與跑路》(haha,just for fun~),當然實在怕懶可以設置下.pgpass這個文件,懂得自然懂。
  • 最后,對于系統數據庫最好還是設置下reject的吧。都不要亂動哈哈。

好啦,這次就這么多了,中午多吃點鼓勵下自己。也歡迎各位朋友對我的文章提出自己的寶貴意見,感謝~

轉載于:https://www.cnblogs.com/flying-tiger/p/5983588.html

總結

以上是生活随笔為你收集整理的从pg_hba.conf文件谈谈postgresql的连接认证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。