半个PostgreSQL DBA,热衷于数据库相关的技术。我的ppt分享https://pan.baidu.com/s/1eRQsdAa https://github.com/chenhuajun https://chenhuajun.github.io
分类: Mysql/postgreSQL
2013-10-24 21:08:12
如果你还不清楚Kerberos是什么,强烈建议把下面2篇文章仔细看一遍,可以完整地了解Kerberos的原理和相关概念。这样在实际环境配置中如果遇到问题就能很快解决。
http://www.cnblogs.com/haogj/archive/2010/10/04/1841715.html
目标环境由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客户端
OS:RHEL6
IP:192.168.1.102
realm:MYDM.COM
hostname:node2
domain:mydm.com
PostgreSQL集群的数据目录:/home/postgres/data
[node3]
作为Windows客户端
OS:Windows 7
IP:192.168.1.103
realm:MYDM.COM
hostname:node3
domain:mydm.com
修改/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
[realms]
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
*/admin@MYDM.COM *
用户Key等重要信息都存储在KDC数据库中。配置一个全新的KDC需要初始化KDC数据库,并设置KDC数据库的master密码。
[root@localhost ~]# kdb5_util create -r MYDM.COM -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'MYDM.COM',
master key name 'K/M@MYDM.COM'
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数据库。
[root@localhost ~]# kadmin.local
Authenticating as principal root/admin@MYDM.COM with password.
■root/admin的principal的追加
kadmin.local: addprinc root/admin
WARNING: no policy specified for root/admin@MYDM.COM; defaulting to no policy
Enter password for principal "root/admin@MYDM.COM":
Re-enter password for principal "root/admin@MYDM.COM":
Principal "root/admin@MYDM.COM" created.
■user1的principal的追加
kadmin.local: addprinc user1
WARNING: no policy specified for user1@MYDM.COM; defaulting to no policy
Enter password for principal "user1@MYDM.COM":
Re-enter password for principal "user1@MYDM.COM":
Principal "user1@MYDM.COM" created.
注) Principal:Kerberos术语,可用于标识用户,服务等对象
将kadmin管理服务需要的key导出到kadm5.keytab文件,以便kadmin使用。
kadmin.local: ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/admin
…(输出略)
kadmin.local: ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/changepw
…(输出略)
kadmin.local: quit
[root@localhost ~]# service krb5kdc start
Starting Kerberos 5 KDC: [ OK ]
[root@localhost ~]# service kadmin start
Starting Kerberos 5 Admin Server: [ OK ]
同node1
确保安装了以下软件
krb5-libs
pam_krb5
krb5-workstation
同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.
Password for :
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 user1@MYDM.COM
Password for :
通过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)。下载地址如下
Windows 7上MIT Kerberos的配置文件如下。
C:\ProgramData\MIT\Kerberos5\krb5.ini
需要注意的是C:\ProgramData是个隐藏目录。将node1中krb5.conf的内容拷贝到krb5.ini再修改一下[logging]中的路径即可。
[logging]
default = FILE:D:\log\krb5libs.log
kdc = FILE:D:\log\krb5kdc.log
admin_server = FILE:D:\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
略。和Linux环境一样,编译时必须打开对krb5的支持。
从KDC获取user1帐号的初始凭证。在提示输入密码的地方输入” 2.4.4、用户的Principal的追加”中设置的user1的密码。
C:\ >kinit user1@MYDM.COM
Password for :
通过psql连接postgres服务器。
C:\ >psql -h 192.168.1.102 -U user1 postgres
psql (9.2.4)
Type "help" for help.
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认证。