在不加入活动目录域的情况下为适用于 PostgreSQL 的亚马逊 RDS 配置 Kerberos 身份验证

作者: Sid Vantair | 202 3 年 2 月

采用集中式身份验证机制的组织可以获得以下好处:

  • 增强安全态势:集中式身份验证允许在整个网络中快速添加或删除用户访问权限,从而提高组织安全性并能够快速响应安全威胁。
  • 可扩展性:通过集中式数据库控制访问权限,组织可以扩展其网络并最大限度地减少性能问题。
  • 易于管理:集中式身份验证简化了网络资源的管理,使其更加高效。

将关系数据库身份验证与集中式身份验证服务(例如微软活动目录(Microsoft AD))集成在一起的做法是一种既定且被广泛使用的策略。Active Directory 是为用户、计算机和应用程序提供的集中式身份验证和授权管理服务。它允许管理员管理网络资源和执行安全策略。Kerberos 是一种与 Active Directory 集成的网络身份验证协议,允许从数据库实例中卸载身份验证。由于数据库实例只需要处理授权,因此账户管理负担大大降低。

适用于 PostgreSQL 的亚马逊关系数据库服务 (亚马逊 RDS) 亚马逊 Aurora PostgreSQL 兼容 版支持使用 Kerberos 和微软 AD 对数据库用户 进行 外部认证 。这种对数据库用户和身份验证的集中管理为您节省了管理多个数据库实例的时间和精力。

将客户端加入到 Active Directory 域的主要原因包括安全策略、访问控制和集中式身份管理。但是,将 Linux 客户端加入到 Active Directory 的过程技术性很强且复杂,与使用 Windows 客户端的无缝体验相比,它更加轻松。此外,不同的 Linux 发行版和 Active Directory 之间可能存在兼容性问题,这带来了额外的挑战。

但是,无需将 Linux 客户端加入活动目录域即可使用 Kerberos 身份验证。在这篇文章中,我们演示了如何配置 Active Directory 域之外的 Linux 客户端,以便使用 Kerberos 身份验证连接到适用于 PostgreSQL 的亚马逊 RDS 或兼容 Amazon Aurora PostgreSQL 的版本。

解决方案概述

该解决方案使用亚马逊 RDS for PostgreSQL,加入 亚马逊云科技 管理的微软 AD 和 Linux 客户端。你可以使用同样的方法来使用兼容亚马逊 Aurora PostgreSQL 的版本。要允许您的本地 AD 域中的用户访问 亚马逊云科技 托管域中的 Amazon RDS 资源,必须在这两个域之间建立森林信任关系。这种森林信任关系为 亚马逊云科技 托管域提供了一种基于本地 AD 域内的身份验证授予对资源的访问权限的方法。在我们的解决方案中,我们在本地域和 亚马逊云科技 管理的 Microsoft AD 之间建立了单向林信任。单向林信任仅允许来自本地 AD 的用户访问 亚马逊云科技 托管域中的资源,反之亦然。

出于演示目的,我们使用了 安装了 psql 亚马逊弹性计算云 (亚马逊 EC2)Linux 客户端。EC2 Linux 客户端用于使用 Kerberos 身份验证连接到适用于 PostgreSQL 的亚马逊 RDS。AD 域的详细信息如下:

  • 本地 AD 域 ON PREM.LOCAL
  • 亚马逊云科技 托管广告域 — 亚马逊云科技POSTGRESQL.KERBEROS . COM

在这种情况下,用户由本地域进行身份验证,而 Amazon RDS 仅与 亚马逊云科技 托管域进行交互。

Solution Architecture

先决条件

在我们开始之前,请确保您已准备好本地和 亚马逊云科技 环境,如架构图所示。您必须具备以下先决条件:

  • 本地 AD 或 Windows EC2 服务器被提升为我们的本地 AD。有关自行管理 AD 部署的示例,请参阅场景 1: 在 亚马逊云科技 上的 Act ive Directory 域服务 指南中部署自管理 AD。
  • A WS 托管的微软 AD
  • 本地域和 亚马逊云科技 托管域之间的单向或双向林信任。
  • 一个适用于 PostgreSQL 的 亚马逊 RDS 数据库实例加入了 亚马逊云科技 Managed AD
  • 在本地 AD 中创建的用户。
  • 熟悉 ps ql。

本地 AD 与 亚马逊云科技 托管的微软 AD 之间的信任

要实施本文中的解决方案,您必须在本地 AD 域和 亚马逊云科技 托管域之间建立信任关系,以允许本地域用户访问 Amazon RDS 资源。这种信任使 亚马逊云科技 Managed 域能够根据本地域内的身份验证授予对其资源的访问权限。为了提高安全性,除非您有特定的业务需求,否则建议使用单向信任。首选单向信任,因为它可以更好地控制资源的访问。在此设置中,只有本地 AD 域可以访问 亚马逊云科技 托管域中的资源,而 亚马逊云科技 托管域没有访问权限。有关如何在 本地域和 亚马逊云科技 托管域之间设置林信任的指南,请参阅为适用于 Amazon RDS 的外部 Kerberos 身份验证 做准备本地和 亚马逊云科技 环境

创建适用于 PostgreSQL 的亚马逊 RDS 实例并加入 亚马逊云科技 管理的微软 AD

有关创建适用于 PostgreSQL 的亚马逊 RDS 实例和加入 亚马逊云科技 管理的微软 AD 的指南,请参阅在适用于 PostgreSQL 的亚马逊 RDS 中 使用外部 Kerberos 身份验证

在本地 AD 中创建用户

在本地 Active Directory 上创建用户 sid@ONPREM.LOCAL 。我们使用 Kerberos 身份验证使用该用户连接到亚马逊 RDS for PostgreSQL 实例。

Active Directory User

在 Linux 平台上登录适用于 PostgreSQL 的亚马逊 RDS 实例

您可以通过在 Linux 平台上登录适用于 PostgreSQL 的亚马逊 RDS 实例来管理数据库。本节详细介绍了在活动目录域之外配置 Linux 客户端,以便使用 Kerberos 身份验证连接到 Amazon RDS for PostgreSQL 的步骤。

  1. 启动 亚马逊 EC2 Linux 2 实例。
  2. 连接 到 EC2 Linux 实例。连接方法的选择将取决于本地计算机操作系统、安全要求、网络基础设施和用户偏好等因素。
  3. 编辑位于 /etc/resolv.conf 的解析器 配置文件, 将您的 AD 域以及 亚马逊云科技 区域的域名包括在 搜索 指令中。 搜索条目定义了解析名称时要搜索的域名列表。此外,将您的 AD 的 DNS IP 地址包含在 域名服务器指令 中。
[ec2-user@ip-172-31-80-54 ~]$ sudo vi /etc/resolv.conf 
generated by /usr/sbin/dhclient-script
search ec2.internal
options timeout:2 attempts:5
search awspostgresql.kerberos.com us-east-1.compute.internal
nameserver 172.31.0.74
nameserver 172.31.35.205
nameserver 172.31.0.2
  1. 要使 res olv.conf 中的更改在重新启动时 永久生效,请运行以下命令。
sudo chattr +i /etc/resolv.conf
  1. 验证连通性。如果您的 DNS 服务器配置正确,则 ping 命令会将 AD 域解析为 IP 地址并成功运行。
[ec2-user@ip-172-31-80-54 ~]$ ping onprem.local
PING onprem.local (172.31.22.117) 56(84) bytes of data. 
64 bytes from 172.31.22.117 (172.31.22.117): icmp_seq=1 ttl=128 time=1.61 ms 
64 bytes from 172.31.22.117 (172.31.22.117): icmp_seq=2 ttl=128 time=0.965 ms 
64 bytes from 172.31.22.117 (172.31.22.117): icmp_seq=3 ttl=128 time=0.734 ms
  1. 需要在客户端计算机上使用 Kerberos 客户端实用程序 kin it 才能获取或续订 Kerberos 票证。 安装 k rb5-libs 和 krb5 工作站软件包时,kini t 实用程序可用。
[ec2-user@ip-172-31-80-54 ~]$ sudo yum install -y krb5-libs krb5-workstation
  1. 为本地微 软 AD 创建包含以下内容的 krb5.conf 文件。此文件包含 Kerberos 5 库的配置参数。
[ec2-user@ip-172-31-80-54 ~]$ sudo vi /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
default_realm = ONPREM.LOCAL
default_ccache_name = /tmp/kerbcache
[realms]
ONPREM.LOCAL = {
kdc = onprem.local
admin_server = onprem.local
}
AWSPOSTGRESQL.KERBEROS.COM = {
kdc = awspostgresql.kerberos.com
admin_server = awspostgresql.kerberos.com
}
[domain_realm]
.onprem.local = ONPREM.LOCAL
onprem.local = ONPREM.LOCAL
.awspostgresql.kerberos.com = AWSPOSTGRESQL.KERBEROS.COM
awspostgresql.kerberos.com = AWSPOSTGRESQL.KERBEROS.COM
.rds.amazonaws.com = ONPREM.LOCAL
.amazonaws.com.cn = ONPREM.LOCAL
.amazon.com = ONPREM.LOCAL
  1. 安装 psql 客户端工具以连接到适用于 PostgreSQL 的亚马逊 RDS。为了兼容性,建议保持 psql 客户端版本与 PostgreSQL 服务器版本相同或更高。对于这个用例,我们安装了 psql 客户端版本 14。
[ec2-user@ip-172-31-80-54 ~]$ sudo amazon-linux-extras install -y postgresql14
  1. 使用主用户账户登录亚马逊 RDS for PostgreSQL 实例。
[ec2-user@ip-172-31-80-54 ~]$ psql -h postgres.cy3kacpocygw.us-east-1.rds.amazonaws.com -U postgres
Password for user postgres:
psql (14.3)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
  1. 创建数据库用户 sid@ONPREM.LOCAL 并向该用户授予 rds_ad 角色。 rds_ad 角色允许数据库用户使用 Kerberos 身份验证。
postgres=> create user "sid@ONPREM.LOCAL" with login;
CREATE ROLE
postgres=> grant rds_ad to "sid@ONPREM.LOCAL";
GRANT ROLE
  1. 使用命令 k init 创建 Kerberos 票证, 并为 AD 用户提供密码。
[ec2-user@ip-172-31-80-54 ~]$ kinit sid@ONPREM.LOCAL
Password for sid@ONPREM.LOCAL:
  1. 你可以使用命令 列表在缓存中列出 Kerberos 票证。 Kerberos 票证的默认有效期为 10 小时,您可以将票证续订 7 天。票证有效期到期后,你需要申请一张新的 Kerberos 票证。
[ec2-user@ip-172-31-80-54 ~]$ klist
Ticket cache: FILE:/tmp/kerbcache
Default principal: sid@ONPREM.LOCAL
Valid starting Expires Service principal
11/17/2022 00:43:00 11/17/2022 10:43:00 krbtgt/ONPREM.LOCAL@ONPREM.LOCAL
renew until 11/24/2022 00:42:56
  1. 使用 Kerberos 票证连接到亚马逊 RDS for PostgreSQL 实例,无需指定密码。我们在连接到本地 AD 时使用 特殊终端节点 。与其在终端节点中使用亚马逊域名 rds.amazonaws.com ,不如使用 亚马逊云科技 管理的微软 AD 的域名。在连接到兼容 Amazon Aurora PostgreSQL 的集群终端节点时,你可以应用同样的方法。
[ec2-user@ip-172-31-80-54 ~]$ psql -h postgres.cy3kacpocygw.us-east-1.awspostgresql.kerberos.com -U sid@ONPREM.LOCAL postgres
psql (14.3)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=> select current_user;
current_user
------------------
sid@ONPREM.LOCAL
(1 row)

清理

如果您正在测试此解决方案,请完成以下步骤以删除资源并避免收费

  1. Amazon EC2 控制台 上 ,选择 Linux EC2 实例,然后在实例状态菜单上选择终止实例。
  2. 亚马逊 RDS 控制台 上 ,选择 RDS Postgres 实例,然后在 “操作” 菜单上选择 “删除”。
  3. 亚马逊云科技 Directory Service 控制台 上,选择该目录,然后在操作菜单上选择删除目录。

摘要

在这篇文章中,我们指导您完成了使用活动目录域外的 Linux 客户端使用 Kerberos 身份验证对 Amazon RDS for PostgreSQL 中的数据库用户进行身份验证的过程。你可以将同样的方法应用于兼容亚马逊 Aurora PostgreSQL 的版本。对于采用 Kerberos 进行数据库身份验证的用户,此配置增加了灵活性并降低了复杂性。

如果您有任何意见或问题,请在评论部分分享。


作者简介

Sid Vantair 是 亚马逊云科技 的一名解决方案架构师,负责战略账户。他在关系数据库方面拥有十多年的经验,擅长解决复杂的技术问题以克服客户障碍。工作之余,他珍惜与家人共度时光,培养孩子的好奇心。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。