category
1.概述
PostgreSQL支持许多安全的用户身份验证方法,其中一种典型的方法是将GSSAPI与Kerberos一起使用。然而,当我试图研究PostgreSQL中与GSSAPI相关的一个问题时,我找不到可以轻松设置环境的教程。在花了一些精力设置Kerberos环境之后,我决定写一个博客来分享我所学到的东西。
由于PostgreSQL GSSAPI用户身份验证确实涉及许多背景知识,我将此博客分为三部分:
- 第1部分将重点介绍Kerberos、服务器/客户端/服务/用户设置和环境验证中使用的基本概念;
- 第二部分将讨论PostgreSQL上使用GSSAPI用户身份验证所需的所有相关配置文件;
- 第三部分将解释如何检查不同连接选项的GSSAPI身份验证、加密和用户主体信息,以更好地了解PostgreSQL上的GSSAPI。
2.Kerberos的基本概念
Kerberos是一种网络身份验证协议,旨在允许用户以安全的方式在非安全网络上证明自己的身份。该协议是一个行业标准协议,用于安全身份验证,消息旨在防止间谍和重放攻击。它已经被构建到各种各样的软件中,如Chrome、Firefox、OpenSSH、Putty、OpenLDAP、Thunderbird和PostgreSQL等。有一些开源实现可用,如大多数类Unix操作系统使用的MIT实现的krb5和OSX使用的heimdal。在深入了解任何详细的环境设置之前,需要在这里解释Kerberos中使用的一些关键概念。
Realm:Realm相当于所有用户和服务器所属的域或组。在安装Kerberos时需要它。例如,HIGHGO。CA,将用作此博客中的Realm(根据您的需要进行更改)。
- 主体:任何用户和服务都被定义为Kerberos中的主体。例如,david、postgres、postgres/pg.highgo.ca等。
- 实例:Kerberos使用实例来管理服务主体,尤其是管理主体。例如,root/admin,其中root是主体,/admin是实例。
- SS:服务服务器提供服务。例如,pg.highgo.ca是一个服务器提供的PostgreSQL数据库访问服务。
- KDC:密钥分发中心包含一个所有主体和两个组件的数据库:
- AS:身份验证服务器负责由kinit触发的来自用户的初始身份验证请求。
- TGS:票证授予服务器将服务服务器上请求的资源分配给用户。在这个博客中,AS和TGS都部署在同一个KDC服务器上,即KDC.highgo.ca。
- AS:身份验证服务器负责由kinit触发的来自用户的初始身份验证请求。
- TGT:Ticket Granting Ticket是一条用于确认主体身份和传递会话密钥的消息,用于用户、TGS和SS之间的未来安全通信。
- Keytab:从KDC主体数据库中提取的文件,包含服务或主机的加密密钥。例如,postgres.keytab是keytab文件,将在PostgreSQL服务器上使用,即hg.highgo.ca。
- 客户端:工作站需要访问服务服务器。例如,psql运行在客户端机器上,并希望连接到PostgreSQL服务器。
3.Kerberos环境设置
当PostgreSQL使用Kerberos对用户进行身份验证时,上图中的整个过程可以按以下顺序进行解释。
- 客户端启动身份验证过程,AS向客户端发送用客户端密钥(蓝密钥)加密的临时会话密钥(灰密钥);
- 客户端使用临时会话密钥请求服务,TGS授予服务并发送两份通信会话密钥(黄色密钥):一份使用临时会话密匙加密,另一份使用服务服务器的密钥(绿色密钥)加密;
- 客户端将通信会话密钥转发给服务服务器(PG)以确认用户身份验证。如果成功,则客户端和服务服务器将在其余通信中使用通信会话密钥。
下面列出了此关系图中使用的领域、主机名和IP地址。
- Realm:HIGHGO.CA
- KDC(AS+TGS):KDC.highgo.ca(192.168.0.101)
- 服务服务器(Postgres Server):pg.highgo.ca(192.168.0.102)
- 客户端(psql):客户端(192.168.0.103)
在以下部分中,我们将详细讨论设置。这是所有步骤的列表。
- 为每台机器设置主机名和IP地址
- 在KDC服务器计算机上安装Kerberos服务器包
- 将管理主体添加到KDC服务器
- 在客户端和服务服务器计算机上安装Kerberos客户端包
- 将服务服务器主体添加到KDC服务器
- 将客户端主体添加到KDC服务器
- 在服务服务器计算机上验证主体
- 在客户端计算机上验证主体
3.1. 主机名和IP地址
因为Kerberos协议涉及时间戳,所以所有三台机器都需要始终同步时钟。这可以通过设置指向生产环境中某些NTP服务器的NTP客户端来完成,但为了简单起见,您可以将所有三台机器设置在连接了Internet的同一时区。如果您没有准备好DNS服务器,或者不想使用DNS,那么您可以通过在类似Unix的机器上执行以下命令手动设置主机名。
$ sudo vim /etc/hostname
将kdc、pg和客户端相应地设置为kdc、服务服务器和客户端计算机
$ sudo vim /etc/hosts
将以下信息设置为所有三台机器的/etc/hosts(更改主机名和IP地址以适应您的环境)。
192.168.0.101 kdc.highgo.ca kdc
192.168.0.102 pg.highgo.ca pg
192.168.0.103 client.highgo.ca client
完成所有三台机器的设置后,重新启动所有三台计算机。
3.2. KDC服务器安装
要在KDC计算机上设置Kerberos,需要安装两个包,即krb5-KDC和krb5-admin server。
$sudo apt安装krb5 kdc krb5管理服务器
在安装过程中,Kerberos将首先要求配置领域。如果您已经按照步骤进行了主机设置,那么领域将自动显示,然后只需单击“确定”。
然后它将要求配置Kerberos服务器,在我们的例子中,输入kdc.highgo.ca
然后请求管理服务器,在我们的情况下,再次请求kdc.highgo.ca
在最后一步中,它将提醒您使用krb5_newrealm来设置领域。只需单击“确定”。
现在,让我们使用sudo运行krb5_newrealm,为KDC数据库设置主密钥。
$ sudo krb5_newrealm
Enter KDC database master key:
Re-enter KDC database master key to verify:
在开始Kerberos配置之前,这里有一些基本的Kerberos工具需要了解。
kadmin.local:KDC数据库管理工具,用于管理主体和策略。
kinit:用于获取和缓存Kerberos票证授予票证。
klist:用于列出凭据缓存中的主体和票证,或keytab文件中的密钥。
ktutil:用于读取、写入或编辑keytab中的条目。
…
3.3. 管理员主体设置
安装KDC服务器后,我们需要创建一个管理用户来管理主体,建议使用不同的用户名。在我们的例子中,root/admin。以下是用于设置的命令。
$ sudo kadmin.local
Authenticating as principal root/admin@HIGHGO.CA with password.
kadmin.local: addprinc root/admin
WARNING: no policy specified for root/admin@HIGHGO.CA;
defaulting to no policy
Enter password for principal "root/admin@HIGHGO.CA":
Re-enter password for principal "root/admin@HIGHGO.CA":
Principal "root/admin@HIGHGO.CA" created.
kadmin.local: exit
您可以通过运行listprincics-root/admin来检查主体root/admin。
kadmin.local: listprincs root/admin
root/admin@HIGHGO.CA
接下来,我们需要在Kerberos配置文件/etc/krb5kdc/kadm5.acl中为管理员用户分配适当的访问控制列表,该文件用于管理对Kerberos数据库的访问权限。
$ sudo vim /etc/krb5kdc/kadm5.acl
root/admin@HIGHGO.CA *
上述配置将所有权限授予admin主体root/admin。
现在,终于到了重新启动Kerberos服务的时候了。
$ sudo systemctl restart krb5-admin-server.service
一旦Kerberos服务再次运行,我们就可以执行快速测试。首先,尝试klist查看是否存在任何凭据缓存,然后尝试查看是否可以对root/admin进行身份验证。如果没有错误,请再次尝试使用klist列出缓存的主体。
$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1000)
“找不到凭据缓存”告诉我们还没有经过身份验证的主体。让我们运行kinit root/admin,看看是否可以对其进行身份验证。
$ kinit root/admin
Password for root/admin@HIGHGO.CA:
如果在根主体初始化过程中没有错误,则再次运行klist。
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: root/admin@HIGHGO.CA
Valid starting Expires Service principal
2020-03-12 17:18:53 2020-03-13 03:18:53 krbtgt/HIGHGO.CA@HIGHGO.CA
renew until 2020-03-13 17:18:51
如果找到凭据缓存,则KDC管理主体设置完成。
3.4. 服务服务器和客户端安装
对于Service Server和Client,我们只需要安装与客户端/用户相关的软件包。在服务服务器和客户端计算机上运行以下命令。
$ sudo apt install krb5-user libpam-krb5 libpam-ccreds auth-client-config
与KDC服务器设置相同,它将要求Realm、Kerberos服务器和管理服务器。输入与KDC服务器完全相同的信息,然后单击“确定”。安装完成后,我们应该在/etc/krb5.conf中配置以下信息
[realms]
HIGHGO.CA = {
kdc = kdc.highgo.ca
admin_server = kdc.highgo.ca
}
现在,回到KDC服务器端,添加服务服务器和客户端的主体。
3.5. 添加服务服务器的主体
添加一个主体postgres,它是数据库用户和Linux登录用户。
$ sudo kadmin.local
kadmin.local: addprinc postgres
WARNING: no policy specified for postgres@HIGHGO.CA; defaulting to no policy
Enter password for principal "postgres@HIGHGO.CA":
Re-enter password for principal "postgres@HIGHGO.CA":
Principal "postgres@HIGHGO.CA" created.
添加主体postgres/pg.highggo.ca作为服务服务器的主体实例
kadmin.local: addprinc postgres/pg.highgo.ca
WARNING: no policy specified for postgres/pg.highgo.ca@HIGHGO.CA;
defaulting to no policy
Enter password for principal "postgres/pg.highgo.ca@HIGHGO.CA":
Re-enter password for principal "postgres/pg.highgo.ca@HIGHGO.CA":
Principal "postgres/pg.highgo.ca@HIGHGO.CA" created.
将KDC主体数据库中的服务主体提取到keytab文件中,该文件将用于配置PostgreSQL Server。当运行以下命令时,应将文件保存到当前文件夹中。
$ ktutil
ktutil: add_entry -password -p postgres/pg.highgo.ca@HIGHGO.CA
-k 1 -e aes256-cts-hmac-sha1-96
Password for postgres/pg.highgo.ca@HIGHGO.CA:
ktutil: wkt postgres.keytab
ktutil: exit
3.6. 为客户端添加主体
为Client添加一个主体david,这是Clinet OS的登录用户,稍后将用于登录数据库
kadmin.local: addprinc david
WARNING: no policy specified for david@HIGHGO.CA; defaulting to no policy
Enter password for principal "david@HIGHGO.CA":
Re-enter password for principal "david@HIGHGO.CA":
Principal "david@HIGHGO.CA" created.
使用listprics检查所有主体以进行确认david@HIGHGO.CA, postgres@HIGHGO.CA和postgres/pg.highgo.ca@HIGHGO.CA都已成功创建。
kadmin.local: listprincs
K/M@HIGHGO.CA
david@HIGHGO.CA
kadmin/admin@HIGHGO.CA
kadmin/changepw@HIGHGO.CA
kadmin/kdc.highgo.ca@HIGHGO.CA
kiprop/kdc.highgo.ca@HIGHGO.CA
krbtgt/HIGHGO.CA@HIGHGO.CA
postgres/pg.highgo.ca@HIGHGO.CA
postgres@HIGHGO.CA
root/admin@HIGHGO.CA
3.7. 验证服务服务器上的主体
在从KDC服务器创建了上述主体之后,让我们回到服务服务器,使用klist和kinit验证主体。
postgres@pg:~$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1001)
postgres@pg:~$ kinit postgres/pg.highgo.ca
Password for postgres/pg.highgo.ca@HIGHGO.CA:
postgres@pg:~$ klist
Ticket cache: FILE:/tmp/krb5cc_1001
Default principal: postgres/pg.highgo.ca@HIGHGO.CA
Valid starting Expires Service principal
2020-03-12 18:25:23 2020-03-13 04:25:23 krbtgt/HIGHGO.CA@HIGHGO.CA
renew until 2020-03-13 18:25:20
3.8. 在客户端验证主体
现在,返回客户端机器,使用klist和kinit验证主体。
david@client:~$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1000)
david@client:~$ kinit david
Password for david@HIGHGO.CA:
david@client:~$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: david@HIGHGO.CA
Valid starting Expires Service principal
2020-03-12 18:21:41 2020-03-13 04:21:41 krbtgt/HIGHGO.CA@HIGHGO.CA
renew until 2020-03-13 18:21:38
如果主体验证在Service Server和Client机器上都成功了,那么我们就可以配置PostgreSQL并准备使用Kerberos进行GSSAPI用户身份验证了。
4.总结
在这个博客中,我们解释了Kerberos中使用的基本概念,在Ubuntu上执行了一步一步的设置,将所有必需的主体添加到KDC,还验证了将在接下来的两个博客中使用的每个主体。
参考
- 登录 发表评论
- 30 次浏览
Tags
最新内容
- 2 days 7 hours ago
- 2 days 9 hours ago
- 2 days 9 hours ago
- 5 days 1 hour ago
- 5 days 8 hours ago
- 5 days 9 hours ago
- 5 days 9 hours ago
- 5 days 9 hours ago
- 1 week 2 days ago
- 1 week 2 days ago