PostgreSQL GSSAPI 認證

2021-08-31 15:12 更新

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

當編譯PostgreSQL時,GSSAPI 支持必須被啟用,詳見第 16 章。

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

hostname是服務器機器的被完全限定的主機名。服務 principal 的 realm 是該服務器機器的首選 realm。

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

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

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

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

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

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

下列被支持的配置選項用于GSSAPI

include_realm

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

map

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

krb_realm

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號