PostgreSQL的Kerberos认证环境的配置

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PostgreSQL支持很多认证方式,Kerberos是其中之一。本文通过一个实例介绍PostgreSQL的Kerberos认证环境的配置。   1. 准备 1.1 Kerberos原理 如果你还不清楚Kerberos是什么,强烈建议把下面2篇文章仔细看一遍,可以完整地了解Kerberos的原理和相关概念。
PostgreSQL支持很多认证方式,Kerberos是其中之一。本文通过一个实例介绍PostgreSQL的Kerberos认证环境的配置。


 

1. 准备


1.1 Kerberos原理


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

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

http://www.kerberos.org/software/tutorial.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 root/admin@MYDM.COM:

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 user1@MYDM.COM:

 

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)。下载地址如下

http://web.mit.edu/kerberos/dist/#kfw-4.0

 

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 user1@MYDM.COM:

 

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

 

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
17天前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
17天前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
8月前
|
存储 关系型数据库 数据库
用Patroni配置PostgreSQL高可用集群
Patroni是Zalando开发的数据库高可用管理软件,用于编排和自动化PostgreSQL集群的管理过程。Patroni 需要一系列其他组件的支持,通过利用第三方分布式一致性软件,组建并实现数据库高可用方案。
699 4
用Patroni配置PostgreSQL高可用集群
|
8月前
|
关系型数据库 MySQL Nacos
nacos数据库使用PostgreSQL及集群配置
从Nacos2.2版本开始,Nacos提供了数据源扩展插件,以便让需要进行其他数据库适配的用户自己编写插件来保存数据。
1214 2
|
5天前
|
SQL 关系型数据库 分布式数据库
【PolarDB开源】PolarDB Proxy配置与优化:提升数据库访问效率
【5月更文挑战第27天】PolarDB Proxy是阿里云PolarDB的高性能数据库代理,负责SQL请求转发和负载均衡。其关键配置包括:连接池管理(如最大连接数、空闲超时时间),负载均衡策略(轮询、权重轮询、一致性哈希),以及SQL过滤规则。优化方面,关注监控与调优、缓存策略、网络优化。通过这些措施,可提升数据库访问效率和系统稳定性。
104 1
|
17天前
|
Cloud Native 关系型数据库 分布式数据库
数据库性能诊断工具DBdoctor通过阿里云PolarDB产品生态集成认证
DBdoctor(V3.1.0)成功通过阿里云PolarDB分布式版(V2.3)集成认证,展现优秀兼容性和稳定性。此工具是聚好看科技的内核级数据库性能诊断产品,运用eBPF技术诊断SQL执行,提供智能巡检、根因分析和优化建议。最新版V3.1.1增加了对PolarDB-X和OceanBase的支持,以及基于cost的索引诊断功能。PolarDB-X是阿里巴巴的高性能云原生分布式数据库,兼容MySQL生态。用户可通过提供的下载地址、在线试用链接和部署指南体验DBdoctor。
171 0
|
8月前
|
安全 关系型数据库 Go
远程连接PostgreSQL:配置指南与安全建议
远程连接PostgreSQL:配置指南与安全建议
369 0
|
17天前
|
关系型数据库 网络安全 数据安全/隐私保护
你会开启Postgresql 的SSL单向认证 配置?
你会开启Postgresql 的SSL单向认证 配置?
你会开启Postgresql 的SSL单向认证 配置?
|
17天前
|
关系型数据库 Linux 数据安全/隐私保护
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
44 0
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
|
17天前
|
监控 关系型数据库 Java
SpringBoot【集成 01】Druid+Dynamic+Greenplum(实际上用的是PostgreSQL的驱动)及 dbType not support 问题处理(附hikari相关配置)
SpringBoot【集成 01】Druid+Dynamic+Greenplum(实际上用的是PostgreSQL的驱动)及 dbType not support 问题处理(附hikari相关配置)
140 0