PostgreSQL GSSAPI 認(rèn)證

2021-08-31 15:12 更新

GSSAPI是用于 RFC 2743 中定義的安全認(rèn)證的一個(gè)工業(yè)標(biāo)準(zhǔn)協(xié)議。 PostgreSQL根據(jù) RFC 1964 支持帶Kerberos認(rèn)證的GSSAPI。 GSSAPI為支持它的系統(tǒng)提供自動(dòng)認(rèn)證(單點(diǎn)登錄)。 認(rèn)證本身是安全的,但通過數(shù)據(jù)庫連接發(fā)送的數(shù)據(jù)將不被加密,除非使用SSLPostgreSQL支持GSSAPI用于加密、認(rèn)證層或僅用于認(rèn)證。 GSSAPI 提供自動(dòng)認(rèn)證(single sign-on單點(diǎn)登錄) 給支持該功能的系統(tǒng)。認(rèn)證本身是安全的。 如果使用了GSSAPI 加密(參見 hostgssenc) 或SSL 加密, 數(shù)據(jù)庫連接發(fā)送的數(shù)據(jù)將被加密,否則將不加密。

當(dāng)編譯PostgreSQL時(shí),GSSAPI 支持必須被啟用,詳見第 16 章

當(dāng)GSSAPI使用Kerberos時(shí), 它會(huì)使用格式為 servicename /hostname@realm 的標(biāo)準(zhǔn) principal。 PostgreSQL服務(wù)器將接受該服務(wù)器所使用的 keytab 中包括的任何 principal,但是在從使用 krbsrvname連接參數(shù)的客戶端建立連接時(shí)要注意指定正確的 principal 細(xì)節(jié)(另見 第 33.1.2 節(jié))。安裝的默認(rèn)值 postgres可以在編譯時(shí)使用 ./configure --with-krb-srvnam=其他值修改。 在大部分的環(huán)境中,這個(gè)參數(shù)從不需要被更改。某些 Kerberos 實(shí)現(xiàn)可能要求一個(gè)不同的服務(wù)名, 例如 Microsoft Active Directory 要求服務(wù)名是大寫形式(POSTGRES)。

hostname是服務(wù)器機(jī)器的被完全限定的主機(jī)名。服務(wù) principal 的 realm 是該服務(wù)器機(jī)器的首選 realm。

客戶端 principal 可以被通過pg_ident.conf映射到不同的 PostgreSQL數(shù)據(jù)庫用戶名。例如, pgusername@realm可能會(huì)被映射到pgusername。 或者,你可以使用完整的username@realm當(dāng)事人作為 PostgreSQL中的角色而無需任何映射。

PostgreSQL也支持一個(gè)參數(shù)把 realm 從 principal 中剝離。這種方法是為了向后兼容性,并且我們強(qiáng)烈反對(duì)使用它,因?yàn)檫@樣就無法區(qū)分具有相同用戶名卻來自不同 realm 的不同用戶了。要啟用這種方法,可將include_realm設(shè)置為 0。對(duì)于簡(jiǎn)單的單 realm 安裝,這樣做并且設(shè)置krb_realm參數(shù)(這會(huì)檢查 principal 的 realm 是否正好匹配krb_realm中的參數(shù))仍然是安全的。但比起在pg_ident.conf中指定一個(gè)顯式映射來說,這種方法的能力較低。

確認(rèn)你的服務(wù)器的 keytab 文件是可以被PostgreSQL服務(wù)器帳 戶讀取的(最好是只讀的) (又見第 18.1 節(jié))。密鑰文件的位置由配置 參數(shù)krb_server_keyfile指定。默認(rèn)是 /usr/local/pgsql/etc/krb5.keytab(或者任何在編譯的時(shí)候作為sysconfdir的目錄)。 出于安全原因,推薦對(duì)PostgreSQL服務(wù)器使用一個(gè)獨(dú)立 的 keytab而不是開放系統(tǒng) keytab 文件的權(quán)限。

keytab 文件由 Kerberos 軟件生成,詳見 Kerberos 文檔。下面是 MIT 兼容的 Kerberos 5 實(shí)現(xiàn)的例子:

kadmin% ank -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org

當(dāng)連接到數(shù)據(jù)庫時(shí),確保你有一個(gè)匹配被請(qǐng)求數(shù)據(jù)庫用戶名的 principal 的票據(jù)。例如,對(duì)于數(shù)據(jù)庫用戶名fred,principal fred@EXAMPLE.COM將能夠連接。要也允許 principal fred/users.example.com@EXAMPLE.COM,可使用一個(gè)用戶名映射,如第 20.2 節(jié)中所述。

下列被支持的配置選項(xiàng)用于GSSAPI

include_realm

如果設(shè)置為 0,在通過用戶名映射之前(第 20.2 節(jié)),來自已認(rèn)證用戶 principal 的 realm 名稱會(huì)被剝離掉。我們不鼓勵(lì)這樣做,這種方法主要是為了向后兼容性而存在的,因?yàn)樗诙?realm 環(huán)境中是不安全的(除非也使用 krb_realm)。推薦用戶讓 include_realm設(shè)置為默認(rèn)值(1)并且在pg_ident.conf中提供一條顯式的映射來把 principal 名稱轉(zhuǎn)換成PostgreSQL用戶名。

map

允許在系統(tǒng)和數(shù)據(jù)庫用戶名之間的映射。詳見第 20.2 節(jié)。 對(duì)于一個(gè) GSSAPI/Kerberos 原則,例如username@EXAMPLE.COM (或者更不常見的username/hostbased@EXAMPLE.COM), 用于映射的用戶名會(huì)是username@EXAMPLE.COM(或者 username/hostbased@EXAMPLE.COM,相應(yīng)地),除非 include_realm已經(jīng)被設(shè)置為 0,在那種情況下 username(或者username/hostbased)是 映射時(shí)被視作系統(tǒng)用戶名的東西。

krb_realm

設(shè)置 realm 為對(duì)用戶 principal 名進(jìn)行匹配的范圍。 如果這個(gè)參數(shù)被設(shè)置,只有那個(gè) realm 的用戶將被接受。 如果它沒有被設(shè)置,任何 realm 的用戶都能連接,服從任何已完成的用戶名映射。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)