天天看點

PostgreSQL的Kerberos認證環境的配置 1. 準備 2. node1的配置 3. node2的配置 5 node3的配置 6. 注意事項 7. 其他

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

*/[email protected]     *

使用者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

"[email protected]":

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:\ &gt;kinit [email protected]

通過psql連接配接postgres伺服器。

C:\ &gt;psql -h 192.168.1.102 -U user1 postgres

postgres=&gt;

每次通過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認證。