Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2951404
  • 博文数量: 199
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 4126
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-06 19:06
个人简介

半个PostgreSQL DBA,热衷于数据库相关的技术。我的ppt分享https://pan.baidu.com/s/1eRQsdAa https://github.com/chenhuajun https://chenhuajun.github.io

文章分类

全部博文(199)

文章存档

2020年(5)

2019年(1)

2018年(12)

2017年(23)

2016年(43)

2015年(51)

2014年(27)

2013年(21)

2011年(1)

2010年(4)

2009年(5)

2008年(6)

分类: Mysql/postgreSQL

2013-10-24 21:08:12

PostgreSQL支持很多认证方式,Kerberos是其中之一。本文通过一个实例介绍PostgreSQL的Kerberos认证环境的配置。


 

1. 准备


1.1 Kerberos原理


如果你还不清楚Kerberos是什么,强烈建议把下面2篇文章仔细看一遍,可以完整地了解Kerberos的原理和相关概念。这样在实际环境配置中如果遇到问题就能很快解决。

http://www.cnblogs.com/haogj/archive/2010/10/04/1841715.html

 

1.2 目标环境


目标环境由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

 

2. node1的配置


2.1 主机名的配置

修改/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必须放在最前面。

 

2.2 软件的安装


确保安装了以下软件

krb5-libs

pam_krb5

krb5-server

krb5-workstation

 

2.3 kerberos环境的配置


编辑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

 

2.4 KDC服务器的配置


2.4.1 kdc.conf的编辑

kdc.confKDC服务器的配置文件。需要修改的地方见下面的红色字体部分。

 

[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

 }

 

2.4.2 kadm5.acl的编辑

kadm5.acl是远程管理服务kadmin使用的用于控制KDC数据库访问权限的ACL文件。下面给管理帐号赋予全部权限。需要修改的地方见下面的红色字体部分。

 [root@localhost ~]# vi /var/kerberos/krb5kdc/kadm5.acl

*/admin@MYDM.COM     *

 

2.4.3 KDC数据库的初始化


用户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:

 

2.4.4 用户Principal的追加


追加管理用户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术语,可用于标识用户,服务等对象

 

2.4.5 导出管理服务kadmin需要的key

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

 

2.5 KDC服务和kadmin服务的启动

[root@localhost ~]# service krb5kdc start

Starting Kerberos 5 KDC:                              [  OK  ]
[root@localhost ~]# service kadmin start
Starting Kerberos 5 Admin Server:                     [  OK  ]

 

 

3 node2的配置

3.1 主机名的配置

node1

 

3.2 软件的安装

确保安装了以下软件

krb5-libs

pam_krb5

krb5-workstation

 

3.3 kerberos环境的配置

node1

 

3.4 PostgreSQL的编译安装

PostgreSQL的默认编译是不支持Kerberos的,所以需要追加” --with-krb5”编译选项对PostgreSQL重新编译

./configure '--with-krb5' [其他编译选项]

./make

./make install

mkdir /usr/local/pgsql/etc

 

3.5 PostgreSQL service的principal的追加


远程登录到kadmin服务追加PostgreSQL service的principal。在提示输入密码的地方输入” 2.4.4 用户的Principal的追加”中设置的root/admin的密码。该步骤也可以通过kadmin.localnode1本地执行(),但之后必须要把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是一样的。

 

3.6 PostgreSQL数据库的设置

3.6.1 创建PostgreSQL数据库

[root@localhost ~]# su - postgres

[postgres@localhost ~]# export PATH=/usr/local/pgsql/bin:$PATH

[postgres@localhost ~]# initdb -D /home/postgres/data

 

3.6.2 启动PostgreSQL数据库

[postgres@localhost ~]# pg_ctl -D /home/postgres/data start

 

3.6.3 用户user1的追加

PostgreSQL数据库中创建user1帐号。如果要使用和KDC不同的用户名需要在pg_hba.conf中设置用户名映射。

[postgres@localhost ~]# createuser user1

 

3.6.4 postgres.conf的编辑

listen_addresses = '*'

krb_server_keyfile = '/usr/local/pgsql/etc/krb5.keytab'

krb_srvname = 'postgres'

 

3.6.5 pg_hba.conf`的编辑

追加以下内容到pg_hba.conf

host   all   all   all           krb5 krb_server_hostname=node2.mydm.com

 

4.6.6 PostgreSQL的再启动

[postgres@localhost ~]$ pg_ctl –D /home/postgres/data restart

 

4.7 动作验证

4.7.1 获取初始用户凭证

KDC获取user1帐号的初始凭证。在提示输入密码的地方输入” 2.4.4 用户的Principal的追加”中设置的user1的密码。

[postgres@localhost ~]$ kinit user1@MYDM.COM

Password for :

 

4.7.2 连接postgres服务器

通过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=#

 

5 node3的配置

5.1 主机名的配置

下面的内容追加到%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

 

5.2 kerberos软件的安装

安装Windows版的MIT Kerberos(kfw)。下载地址如下

 

5.3 kerberos环境的配置

Windows 7MIT Kerberos的配置文件如下。

C:\ProgramData\MIT\Kerberos5\krb5.ini

需要注意的是C:\ProgramData是个隐藏目录。node1krb5.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

 


5.4 PostgreSQL的编译安装

略。和Linux环境一样,编译时必须打开对krb5的支持。

 

5.5 动作验证

5.5.1 获取初始凭证

KDC获取user1帐号的初始凭证。在提示输入密码的地方输入” 2.4.4、用户的Principal的追加”中设置的user1的密码。

C:\ >kinit user1@MYDM.COM

Password for :

 

5.5.2 连接postgres服务器

通过psql连接postgres服务器。

C:\ >psql -h 192.168.1.102 -U user1 postgres

psql (9.2.4)

Type "help" for help.

 

postgres=>

 

6. 注意事项

每次通过ktadd导出service key,都会升级key的版本。如果服务加载的krb5.keytab文件中没有保存旧版的key,已经获取旧版服务票据的客户端将由于票据版本不匹配而导致认证失败。此时需要客户端重新运行kinit获取初始凭证。

 

7. 其他

除了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认证。

 

阅读(16605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~