跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

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。
       
  • 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地址。

  • RealmHIGHGO.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,还验证了将在接下来的两个博客中使用的每个主体。

参考

  1. Kerberos on ubuntu
  2. Kerberos wiki
  3. PostgreSQL GSSAPI Authentication
本文地址
最后修改
星期五, 五月 17, 2024 - 22:04
Article