PostgreSQL的Kerberos认证环境的配置

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
存储 关系型数据库 数据库
用Patroni配置PostgreSQL高可用集群
Patroni是Zalando开发的数据库高可用管理软件,用于编排和自动化PostgreSQL集群的管理过程。Patroni 需要一系列其他组件的支持,通过利用第三方分布式一致性软件,组建并实现数据库高可用方案。
用Patroni配置PostgreSQL高可用集群
|
关系型数据库 MySQL Nacos
nacos数据库使用PostgreSQL及集群配置
从Nacos2.2版本开始,Nacos提供了数据源扩展插件,以便让需要进行其他数据库适配的用户自己编写插件来保存数据。
|
关系型数据库 数据安全/隐私保护 PostgreSQL
Windows环境下安装PostgreSQL
Windows环境下安装PostgreSQL
331 0
|
4月前
|
关系型数据库 MySQL Linux
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
|
4月前
|
关系型数据库 数据库 PostgreSQL
Linux 环境手动备份postgresql数据库
【8月更文挑战第12天】在Docker环境中使用命令行工具对PostgreSQL数据库进行备份和恢复。首先,通过dockerexec进入容器,使用pg_dump进行数据库模式的备份,然后使用dockercp将备份文件导出。接着,若需导入数据到另一数据库,先将备份文件复制到目标容器,再利用psql命令进行数据恢复。整个过程需确保目标数据库无同名模式,以防止导入失败
59 3
|
3月前
|
关系型数据库 数据库 网络虚拟化
Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
77 0
|
5月前
|
SQL 分布式计算 关系型数据库
实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
|
5月前
|
安全 关系型数据库 Linux
|
6月前
|
缓存 关系型数据库 数据库
postgresql.conf配置详解
postgresql.conf配置详解
|
安全 关系型数据库 Go
远程连接PostgreSQL:配置指南与安全建议
远程连接PostgreSQL:配置指南与安全建议
739 0