- 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯
- 愿碼Slogan | 連接每個(gè)程序員的故事
- 網(wǎng)站 | http://chaindesk.cn
- 愿碼愿景 | 打造全學(xué)科IT系統(tǒng)免費(fèi)課程浴鸿,助力小白用戶俏蛮、初級(jí)工程師0成本免費(fèi)系統(tǒng)學(xué)習(xí)妈拌、低成本進(jìn)階暮胧,幫助BAT一線資深工程師成長并利用自身優(yōu)勢創(chuàng)造睡后收入。
- 官方公眾號(hào) | 愿碼 | 愿碼服務(wù)號(hào) | 區(qū)塊鏈部落
- 免費(fèi)加入愿碼全思維工程師社群 | 任一公眾號(hào)回復(fù)“愿碼”兩個(gè)字獲取入群二維碼
本文閱讀時(shí)長:11min
PostgreSQL中的身份驗(yàn)證
身份驗(yàn)證回答了問題:誰是用戶?PostgreSQL支持一些 身份驗(yàn)證方法,包括以下內(nèi)容:
· Trust認(rèn)證:任何可以連接到服務(wù)器的人都有權(quán)使用訪問pg_hba.conf配置文件中指定的數(shù)據(jù)庫/數(shù)據(jù)庫趟紊。通常用于允許在單個(gè)用戶計(jì)算機(jī)上使用Unix域套接字進(jìn)行連接以訪問數(shù)據(jù)庫。此方法也可以與TCP / IP一起使用碰酝,但很少允許從本地主機(jī)以外的任何IP地址進(jìn)行連接霎匈。
· Ident認(rèn)證:這通過從ident服務(wù)器獲取客戶端的操作系統(tǒng)用戶名然后使用它來訪問數(shù)據(jù)庫服務(wù)器來工作。這個(gè)方法建議用于客戶端計(jì)算機(jī)受系統(tǒng)管理員嚴(yán)格控制的封閉網(wǎng)絡(luò)送爸。
· Peer認(rèn)證:這類似于身份铛嘱,但客戶端操作系統(tǒng)用戶名是從內(nèi)核獲得的暖释。
· GSSAPI認(rèn)證:GSSAPI是RFC2743中定義的行業(yè)標(biāo)準(zhǔn)。它提供自動(dòng)身份驗(yàn)證(單點(diǎn)登錄)墨吓。
· LDAP認(rèn)證: LDAP服務(wù)器僅用于驗(yàn)證用戶名/密碼對(duì)球匕。
· 密碼認(rèn)證:有以下三種方法
o SCRAM-SHA-256:PostgreSQL 10中引入的最強(qiáng)的身份驗(yàn)證方法。此方法可防止對(duì)不受信任的連接進(jìn)行密碼嗅探帖烘。默認(rèn)密碼驗(yàn)證方法是MD5使用此功能亮曹,配置參數(shù) password_encryption應(yīng)更改為 scram-sha-256
o MD5:MD5具有已知的限制,例如:預(yù)先計(jì)算的查找表以破解密碼哈希秘症。此外照卦,MD5只有40億個(gè)獨(dú)特的哈希值。最后乡摹,MD5計(jì)算速度非痴粒快,因此暴力密碼猜測不需要大量的CPU資源趟卸。對(duì)于新應(yīng)用程序,建議僅使用scram-sha-256氏义。此外锄列,PostgreSQL提供了從scram-sha-256遷移的方法。
o Password:建議不要使用此密碼惯悠,因?yàn)槊艽a以明文格式發(fā)送到服務(wù)器邻邮。
要了解身份驗(yàn)證,您需要具有以下信息:
· 身份驗(yàn)證通過pg_hba.conf文件控制克婶,其中hba代表基于主機(jī)的身份驗(yàn)證筒严。
· 最好了解PostgreSQL發(fā)行版附帶的默認(rèn)初始身份驗(yàn)證設(shè)置
· pg_hba.conf文件通常位于數(shù)據(jù)目錄中,但也可以在postgresql.conf配置文件中指定情萤。
更改身份驗(yàn)證時(shí)鸭蛙,您需要發(fā)送一個(gè)SIGHUP信號(hào),這是通過基于PostgreSQL平臺(tái)的幾種方法完成的筋岛。注意娶视,發(fā)送信號(hào)的用戶應(yīng)該是超級(jí)用戶、Postgres或Linux發(fā)行版上的根系統(tǒng)用戶睁宰;同樣肪获,這取決于平臺(tái)。以下是重新加載PostgreSQL配置的幾種方法的示例:
psql -U postgres -c "SELECT pg_reload_conf();"
sudo service postgresql reload
sudo /etc/init.d/postgresql reload
sudo Kill -HUP
sudo systemctl reload postgresql-11.service
· 該訂單的 pg_hba.conf記錄或條目是非常重要的柒傻。將會(huì)話連接pg_hba.conf逐個(gè)與記錄進(jìn)行比較孝赫, 直到它被拒絕或到達(dá)配置文件的末尾。
· 最后红符,檢查PostgreSQL日志文件以確定配置重新加載后是否存在錯(cuò)誤是非常重要的青柄。
PostgreSQL pg_hba.conf
與postgresql.conf一樣伐债,pg_hba.conf文件由一組記錄組成,可以使用哈希符號(hào)注釋行刹前,并且忽略空格泳赋。pg_hba.conf文件記錄的結(jié)構(gòu)如下:
host_type database user [IP-address| address] [IP-mask] auth-method [auth-options]
host_type查詢的部分可以是以下內(nèi)容:
· Local:在 Linux系統(tǒng)中使用,允許用戶使用Unix域套接字連接訪問PostgreSQL喇喉。
· Host:這是為了允許來自其他主機(jī)的連接祖今,基于地址或IP地址,使用帶有和不帶SSL加密的TCP / IP拣技。
· Hostssl:這與主機(jī)類似千诬,但應(yīng)使用SSL加密連接。
· Hostnossl:這也與主機(jī)類似膏斤,但不應(yīng)加密連接徐绑。
查詢的數(shù)據(jù)庫部分是用戶想要連接的數(shù)據(jù)庫的名稱。為了提高靈活性莫辨,您還可以使用以逗號(hào)分隔的列表來指定多個(gè)數(shù)據(jù)庫傲茄,或者可以all用來指示用戶可以訪問數(shù)據(jù)庫集群中的所有數(shù)據(jù)庫。此外沮榜,可以使用相同的用戶和相同的角色值來指示數(shù)據(jù)庫名稱與用戶名相同盘榨,或者用戶是與數(shù)據(jù)庫同名的角色的成員。
查詢的用戶部分指定數(shù)據(jù)庫用戶的名稱蟆融; 同樣草巡,all值與所有用戶匹配。IP地址型酥,地址和IP子網(wǎng)掩碼用于標(biāo)識(shí)用戶所在的主機(jī)嘗試連接山憨。可以使用無類別域間路由(CIDR)或點(diǎn)十進(jìn)制表示法指定IP地址弥喉。最后郁竟,密碼驗(yàn)證方法可以信任,MD5档桃,拒絕等枪孩。
以下是配置PostgreSQL身份驗(yàn)證的一些典型示例:
· 示例1:PostgreSQL集群上的任何用戶都可以使用Unix域套接字訪問任何數(shù)據(jù)庫,如以下數(shù)據(jù)庫表所示:
#TYPE DATABASE USER ADDRESS METHOD
Local all all trust
· 示例2:PostgreSQL集群上的任何用戶都可以使用本地環(huán)回IP地址訪問任何數(shù)據(jù)庫藻肄,如以下數(shù)據(jù)庫表所示:
#TYPE DATABASE USER ADDRESS METHOD
Host all all 127.0.0.1/32 trust
host all all ::1/128 trust
· 示例3:192.168.0.53拒絕來自IP地址的所有連接 蔑舞,來自192.168.0.1/24范圍的連接被接受,如下數(shù)據(jù)庫表所示:
#TYPE DATABASE USER ADDRESS METHOD
Host all all 192.168.0.53/32 reject
Host all all 192.168.0.1/24 trust
PostgreSQL提供了一種非常方便的方法來查看pg_hba.conf文件中定義的規(guī)則嘹屯,方法是提供一個(gè)名為pg_hba_file_rules的視圖攻询,如下所示:
postgres=# SELECT row_to_json(pg_hba_file_rules, true) FROM pg_hba_file_rules limit 1;
row_to_json
-------------------------
{"line_number":84, +
"type":"local", +
"database":["all"], +
"user_name":["all"], +
"address":null, +
"netmask":null, +
"auth_method":"trust",+
"options":null, +
"error":null}
(1 row)
偵聽地址
該listen_addresses 選項(xiàng)定義于postgresql.conf。PostgreSQL listen_addresses連接設(shè)置用于標(biāo)識(shí)服務(wù)器應(yīng)從客戶端應(yīng)用程序偵聽的IP地址列表州弟。這些listen_addresses是以逗號(hào)分隔的主機(jī)名或IP地址列表钧栖。更改這個(gè)值需要重啟服務(wù)器低零。此外,還應(yīng)注意以下幾點(diǎn):
· 默認(rèn)值為localhost拯杠,它限制從網(wǎng)絡(luò)到PostgreSQL集群的直接連接掏婶。
· 給出一個(gè)空列表意味著服務(wù)器應(yīng)該只接受Unix套接字連接
· 該值*表示全部
對(duì)于新加入PostgreSQL的開發(fā)人員來說,忘記更改偵聽地址是一個(gè)常見的錯(cuò)誤潭陪。如果開發(fā)人員忘記更改雄妥,并嘗試使用網(wǎng)絡(luò)中的TCP/IP連接到PostgreSQL,則會(huì)出現(xiàn)以下錯(cuò)誤:
Connection refused
Is the server running on host and accepting
TCP/IP connections on port 5432?
認(rèn)證最佳實(shí)踐
身份驗(yàn)證最佳實(shí)踐取決于整個(gè)基礎(chǔ)架構(gòu)設(shè)置依溯,應(yīng)用程序的性質(zhì)老厌,用戶的特征,數(shù)據(jù)敏感性等黎炉。例如枝秤,以下設(shè)置對(duì)于初創(chuàng)公司很常見:數(shù)據(jù)庫應(yīng)用程序(包括數(shù)據(jù)庫服務(wù)器)托管在同一臺(tái)計(jì)算機(jī)上,并且僅由公司內(nèi)部用戶從一個(gè)物理位置使用慷嗜。
通常淀弹,數(shù)據(jù)庫服務(wù)器使用防火墻與世界隔離;在這種情況下庆械,您可以使用SCRAM-SHA-256身份驗(yàn)證方法并限制IP地址垦页,以便數(shù)據(jù)庫服務(wù)器接受特定范圍或集合內(nèi)的連接。請注意干奢,重要的是不要使用超級(jí)用戶或數(shù)據(jù)庫所有者帳戶連接到數(shù)據(jù)庫,因?yàn)槿绻藥舯缓诳腿肭终蛋溃瑒t整個(gè)數(shù)據(jù)庫集群將被暴露忿峻。
如果是應(yīng)用服務(wù)器 - 業(yè)務(wù)邏輯 - 和數(shù)據(jù)庫服務(wù)器不在同一臺(tái)機(jī)器上,您可以使用強(qiáng)大的身份驗(yàn)證方法辕羽,例如LDAP和Kerberos逛尚。但是,對(duì)于數(shù)據(jù)庫服務(wù)器和應(yīng)用程序位于同一臺(tái)計(jì)算機(jī)上的小型應(yīng)用程序刁愿,SCRAM-SHA-256身份驗(yàn)證方法以及將偵聽地址限制為localhost可能就足夠了绰寞。
要對(duì)應(yīng)用程序進(jìn)行身份驗(yàn)證,建議僅使用一個(gè)用戶铣口,并嘗試使用連接池軟件減少允許的最大連接數(shù)滤钱,以便更好地調(diào)整PostgreSQL資源。在應(yīng)用業(yè)務(wù)邏輯時(shí)可能需要另一級(jí)別的安全性來區(qū)分不同的登錄用戶脑题。對(duì)于真實(shí)用戶件缸,更需要LDAP或Kerberos身份驗(yàn)證。
此外叔遂,如果從外部世界訪問數(shù)據(jù)庫服務(wù)器他炊,則使用SSL證書加密會(huì)話以避免數(shù)據(jù)包嗅探很有用争剿。
您還應(yīng)該記住保護(hù)信任所有l(wèi)ocalhost連接的數(shù)據(jù)庫服務(wù)器,因?yàn)樵L問localhost的任何人都可以訪問數(shù)據(jù)庫服務(wù)器痊末。
角色系統(tǒng)和代理身份驗(yàn)證
通常蚕苇,在設(shè)計(jì)應(yīng)用程序時(shí),登錄角色用于配置數(shù)據(jù)庫連接和連接工具凿叠。需要實(shí)現(xiàn)另一級(jí)安全性以確保使用該應(yīng)用程序的用戶被授權(quán)執(zhí)行某項(xiàng)任務(wù)涩笤。該邏輯通常在應(yīng)用程序業(yè)務(wù)邏輯中實(shí)現(xiàn)。
在使用事務(wù)塊中的SET SESSION AUTHORIZATION 語句或SET ROLE命令建立或重用連接后幔嫂,通過將身份驗(yàn)證委派給另一個(gè)角色辆它,數(shù)據(jù)庫的角色系統(tǒng)也可用于部分實(shí)現(xiàn)此邏輯,如下所示:
postgres=# SELECT session_user, current_user;
session_user | current_user
--------------+--------------
postgres | postgres
(1 row)
postgres=# SET SESSION AUTHORIZATION test_user;
SET
postgres=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
test_user | test_user
(1 row)
設(shè)置角色需要角色成員資格履恩,而設(shè)置會(huì)話授權(quán)需要超級(jí)用戶權(quán)限锰茉。允許應(yīng)用程序作為超級(jí)用戶進(jìn)行連接是危險(xiǎn)的,因?yàn)榭梢苑謩e使用reset role和reset session命令重置set session authorization和set role命令切心,從而允許應(yīng)用程序獲得超級(jí)用戶權(quán)限飒筑。
為了了解如何使用PostgreSQL角色系統(tǒng)來實(shí)現(xiàn)身份驗(yàn)證和授權(quán),我們將使用角色系統(tǒng)和汽車門戶應(yīng)用程序绽昏。在汽車門戶應(yīng)用程序中协屡,可以將多組用戶分類為web-app-user、public-user全谤、registered-user肤晓、seller-user和admin-user。web應(yīng)用程序用戶用于配置業(yè)務(wù)邏輯連接工具认然;公共用戶补憾、注冊用戶和賣家用戶用于區(qū)分用戶。公共用戶組只能訪問公共信息卷员,如廣告盈匾,但不能作為注冊用戶添加評(píng)級(jí),也不能創(chuàng)建廣告毕骡,因?yàn)橘u家用戶削饵。管理員用戶是管理應(yīng)用程序所有內(nèi)容的超級(jí)角色,例如過濾垃圾郵件和刪除不遵守網(wǎng)站策略的用戶未巫。當(dāng)汽車門戶網(wǎng)站應(yīng)用程序連接到數(shù)據(jù)庫時(shí)窿撬,將使用Web用戶。之后叙凡,car_portal將根據(jù)用戶類調(diào)用set role命令尤仍。這種身份驗(yàn)證方法稱為代理身份驗(yàn)證。
以下示例演示了如何使用角色系統(tǒng)來實(shí)現(xiàn)代理身份驗(yàn)證狭姨。第一步是創(chuàng)建角色并分配角色成員身份和權(quán)限宰啦,如下所示:
CREATE ROLE web_app_user LOGIN NOINHERIT;
CREATE ROLE public_user NOLOGIN;
GRANT SELECT ON car_portal_app.advertisement_picture, car_portal_app.advertisement_rating , car_portal_app.advertisement TO public_user;
GRANT public_user TO web_app_user;
GRANT USAGE ON SCHEMA car_portal_app TO web_app_user, public_user;
該NOINHERIT選項(xiàng)web_app_user 不允許用戶繼承角色成員資格的權(quán)限苏遥;但是,web_app_user可以將角色更改為公共用戶赡模,如以下示例所示:
$ psql car_portal -U web_app_user
car_portal=> SELECT * FROM car_portal_app.advertisement;
ERROR: permission denied for relation advertisement
car_portal=> SET ROLE public_user;
SET
car_portal=> SELECT * FROM car_portal_app.advertisement;
advertisement_id | advertisement_date | car_id | seller_account_id
------------------+--------------------+--------+-------------------
(0 rows)
car_portal=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
web_app_user | public_user
(1 row)