PostgreSQL支援很多認證方式,Kerberos是其中之一。本文通過一個執行個體介紹PostgreSQL的Kerberos認證環境的配置。
如果你還不清楚Kerberos是什麼,強烈建議把下面2篇文章仔細看一遍,可以完整地了解Kerberos的原理和相關概念。這樣在實際環境配置中如果遇到問題就能很快解決。
<a href="http://www.cnblogs.com/haogj/archive/2010/10/04/1841715.html">http://www.cnblogs.com/haogj/archive/2010/10/04/1841715.html</a>
<a href="http://www.kerberos.org/software/tutorial.html">http://www.kerberos.org/software/tutorial.html</a>
目标環境由3台機器組成。簡單起見不單獨配置DNS,各主機通過本地hosts檔案解析主機名。并且,由于Kerberos會使用時間戳驗證票據的有效性,是以需要確定3台主機的時間是同步的。
[node1]
作為認證伺服器(KDC)
OS:RHEL6
IP:192.168.1.101
realm:MYDM.COM
hostname:node1
domain:mydm.com
user:user1
[node2]
作為PostgreSQL伺服器和Linux用戶端
IP:192.168.1.102
hostname:node2
PostgreSQL叢集的資料目錄:/home/postgres/data
[node3]
作為Windows用戶端
OS:Windows 7
IP:192.168.1.103
hostname:node3
修改/etc/hosts,追加下面幾條記錄。
[root@localhost
~]# vi /etc/hosts
192.168.1.101
node1.mydm.com node1 kdc.mydm.com kdc
192.168.1.102
node2.mydm.com node2
192.168.1.103
node3.mydm.com node3
Kerberos認證過程中會使用反向名稱解析通過IP擷取Service(PostgreSQL)的主機名,是以需要確定192.168.1.102能夠被反向解析成node2.mydm.com。也就是說,如果192.168.1.102對應多個主機名,node2.mydm.com必須放在最前面。
確定安裝了以下軟體
krb5-libs
pam_krb5
krb5-server
krb5-workstation
編輯kerberos環境配置檔案/etc/krb5.conf。需要修改的地方見下面的紅色字型部分。
[root@localhost ~]# vi /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = MYDM.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = true
[realms]
MYDM.COM= {
kdc = kdc.mydm.com
admin_server = kdc.mydm.com
}
[domain_realm]
.mydm.com = MYDM.COM
mydm.com = MYDM.COM
kdc.conf是KDC伺服器的配置檔案。需要修改的地方見下面的紅色字型部分。
[root@localhost ~]# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
MYDM.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab =
/var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal
aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal
des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
kadm5.acl是遠端管理服務kadmin使用的用于控制KDC資料庫通路權限的ACL檔案。下面給管理帳号賦予全部權限。需要修改的地方見下面的紅色字型部分。
[root@localhost
~]# vi /var/kerberos/krb5kdc/kadm5.acl
使用者Key等重要資訊都存儲在KDC資料庫中。配置一個全新的KDC需要初始化KDC資料庫,并設定KDC資料庫的master密碼。
~]# kdb5_util create -r MYDM.COM -s
Loading
random data
Initializing
database '/var/kerberos/krb5kdc/principal' for realm 'MYDM.COM',
master
key name 'K/[email protected]'
You
will be prompted for the database Master Password.
It is
important that you NOT FORGET this password.
Enter
KDC database master key:
Re-enter
KDC database master key to verify:
追加管理使用者root/admin和普通使用者user1的Principal(注)到KDC資料庫。
~]# kadmin.local
Authenticating
as principal root/[email protected] with password.
■root/admin的principal的追加
kadmin.local: addprinc root/admin
WARNING:
no policy specified for root/[email protected]; defaulting to no policy
password for principal "root/[email protected]":
Principal
"root/[email protected]" created.
■user1的principal的追加
kadmin.local: addprinc user1
WARNING: no policy specified
for [email protected]; defaulting to no policy
Enter password for principal
Re-enter password for
principal "[email protected]":
"[email protected]" created.
注) Principal:Kerberos術語,可用于辨別使用者,服務等對象
将kadmin管理服務需要的key導出到kadm5.keytab檔案,以便kadmin使用。
kadmin.local:
ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/admin
…(輸出略)
ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/changepw
quit
[root@localhost ~]# service
krb5kdc start
Starting Kerberos 5 KDC: [ OK ]
[root@localhost ~]# service kadmin start
Starting Kerberos 5 Admin Server: [ OK ]
同node1
PostgreSQL的預設編譯是不支援Kerberos的,是以需要追加” --with-krb5”編譯選項對PostgreSQL重新編譯
./configure '--with-krb5' [其他編譯選項]
./make
./make install
mkdir /usr/local/pgsql/etc
遠端登入到kadmin服務追加PostgreSQL service的principal。在提示輸入密碼的地方輸入” 2.4.4 使用者的Principal的追加”中設定的root/admin的密碼。該步驟也可以通過kadmin.local在node1本地執行(注),但之後必須要把krb5.keytab檔案取到node2。
[root@localhost postgres]# kadmin -p root/admin
Authenticating as principal root/admin with
password.
kadmin.: addprinc -randkey postgres/node2.mydm.com
kadmin.: ktadd -k /usr/local/pgsql/etc/krb5.keytab postgres/node2.mydm.com
kadmin.: quit
然後,修改krb5.keytab的所有者,確定postgres程序對它有讀權限。
[root@localhost ~]# chown postgres:postgres /usr/local/pgsql/etc/krb5.keytab
注) kadmin.local隻能在KDC伺服器本地執行,其他和kadmin是一樣的。
[root@localhost ~]# su - postgres
[postgres@localhost ~]# export
PATH=/usr/local/pgsql/bin:$PATH
[postgres@localhost ~]# initdb
-D /home/postgres/data
[postgres@localhost ~]# pg_ctl -D /home/postgres/data start
在PostgreSQL資料庫中建立user1帳号。如果要使用和KDC不同的使用者名需要在pg_hba.conf中設定使用者名映射。
[postgres@localhost ~]# createuser user1
listen_addresses = '*'
krb_server_keyfile = '/usr/local/pgsql/etc/krb5.keytab'
krb_srvname = 'postgres'
追加以下内容到pg_hba.conf。
host all
all all krb5 krb_server_hostname=node2.mydm.com
[postgres@localhost ~]$ pg_ctl –D /home/postgres/data restart
從KDC擷取user1帳号的初始憑證。在提示輸入密碼的地方輸入” 2.4.4 使用者的Principal的追加”中設定的user1的密碼。
[postgres@localhost ~]$ kinit [email protected]
通過psql連接配接postgres伺服器。注意不要省略-h選項,否則使用pg_hba.conf中的local設定,前面的配置中并沒有為local設定krb5認證。
[postgres@localhost ~]$ psql -h 192.168.1.102 -U user1 postgres
psql (9.2.4)
Type "help" for
help.
postgres=#
下面的内容追加到%windir%\System32\drivers\etc\hosts檔案中
192.168.1.101 node1.mydm.com
192.168.1.101 kdc.mydm.com
192.168.1.102 node2.mydm.com
192.168.1.103 node3.mydm.com
安裝Windows版的MIT Kerberos(kfw)。下載下傳位址如下
<a href="http://web.mit.edu/kerberos/dist/#kfw-4.0">http://web.mit.edu/kerberos/dist/#kfw-4.0</a>
Windows 7上MIT Kerberos的配置檔案如下。
C:\ProgramData\MIT\Kerberos5\krb5.ini
需要注意的是C:\ProgramData是個隐藏目錄。将node1中krb5.conf的内容拷貝到krb5.ini再修改一下[logging]中的路徑即可。
default = FILE:D:\log\krb5libs.log
kdc = FILE:D:\log\krb5kdc.log
admin_server = FILE:D:\log\kadmind.log
default_realm = MYDM.COM
MYDM.COM= {
kdc = kdc.mydm.com
admin_server = kdc.mydm.com
略。和Linux環境一樣,編譯時必須打開對krb5的支援。
從KDC擷取user1帳号的初始憑證。在提示輸入密碼的地方輸入” 2.4.4、使用者的Principal的追加”中設定的user1的密碼。
C:\ >kinit [email protected]
通過psql連接配接postgres伺服器。
C:\ >psql -h 192.168.1.102 -U user1 postgres
postgres=>
每次通過ktadd導出service key,都會更新key的版本。如果服務加載的krb5.keytab檔案中沒有儲存舊版的key,已經擷取舊版服務票據的用戶端将由于票據版本不比對而導緻認證失敗。此時需要用戶端重新運作kinit擷取初始憑證。
除了psql還嘗試了一下其他用戶端。發現pgjdbc和npgsql都不支援Kerberos認證。psqlODBC通過libpq可以支援(編譯時需要指定USE_LIBPQ),并且在Windows上發現ODBC管理工具的Test按鈕總是不成功,報錯”Krb5_sendauth:
Server not found in kerberos database“,但自己寫的ODBC應用程式就可以連接配接成功,可能由于ODBC管理工具使用Windows自身的kerberos用戶端環境而不是MIT Kerberos。由于pgjdbc和npgsql這2個主流的驅動都不支援Kerberos認證,是以PostgreSQL的單純的krb5認證目前似乎沒有多少實際的用途,但可以使用給予Kerberos的gssapi認證。