安全地使用 AWS 会话管理器和 IAM 认证连接到 Amazon RDS for PostgreS
使用 AWS Session Manager 和 IAM 认证安全连接 Amazon RDS for PostgreSQL
关键要点
本篇文章介绍如何通过 AWS Session Manager 和 IAM 数据库认证安全地连接到 Amazon RDS for PostgreSQL 实例。通过利用 Session Manager,可以简化网络管理并增强安全性,避免暴露公共网络。我们将逐步指导如何设置连接。
在许多公司中,出于安全考虑,数据库实例通常不允许具有公共端点,除非有特定的商业需求。这虽然保护了这些资源不被公共网络访问,但也限制了用户从其计算机连接的方式。
数据库管理员和开发团队常通过使用堡垒主机来克服这一限制。这种主机可以接收互联网请求并安全转发到托管在私有子网中的数据库。然而,这一方法也有两个主要缺点:
增加了服务器暴露于公共互联网的潜在攻击面。需存储和维护 SSH 密钥。此外,数据库用户也必须管理用于数据库认证的用户名和密码,这同样增加了安全风险的暴露。
在本篇文章中,我们将为您提供一种比传统数据库连接方法具有多种优势的解决方案,同时提高安全性并简化网络和访问管理。我们将概述从本地计算机连接到您的 Amazon Relational Database ServiceAmazon RDS实例所需的步骤,使用 Session Manager 的远程主机端口转发功能,以及 AWS 身份与访问管理IAM认证。
前提条件
在本篇文章中,我们将在终端窗口中启动远程会话。您必须具备以下工具和服务:
AWS 命令行界面AWS CLI访问 AWS 管理控制台本地安装的 Session Manager 插件根据所选择的数据库引擎,需要以下客户端中的一个: MySQL适用于 MySQL 和 MariaDB或者 psqlPostgreSQL具备程序化访问 AWS 账户的 IAM 用户通过 Amazon 虚拟私有云Amazon VPC创建的现有私有子网已存在的 RDS 实例和数据库安全组本篇文章中使用 Amazon RDS for PostgreSQL,但该解决方案同样适用于其他 RDS 引擎可访问 Systems Manager为 Systems Manager API 调用配置 VPC 终端节点更多信息,请参考 创建 VPC 终端节点使用 IAM 数据库认证和 Session Manager 的好处
通过利用 IAM 数据库认证,最终用户可以使用 IAM 实体连接到数据库,而不是独立的数据库凭证。这意味着您可以使用 IAM 策略管理对 Amazon RDS 资源的访问,并根据需要授予或撤销特定用户或组的权限,而无需修改数据库级用户账户或密码。在动态环境中,这种灵活性尤为重要,因为访问需求经常发生变化。
Session Manager 是一项完全管理的 AWS 服务,帮助提供实例管理而无需打开任何入站端口,您可以在不直接暴露公共互联网的情况下,与 RDS 实例建立安全连接。Session Manager 的端口转发功能允许您创建一个安全连接,加密本地计算机与 RDS 实例之间的流量。这将减少数据库的攻击面,帮助防止未经授权的访问。
使用 IAM 认证和 Session Manager 的另一个优点是它提供的集中管理和审计能力。IAM 认证允许您拥有一个集中管理系统,以轻松管理和审计对 RDS 数据库的用户访问,追踪谁在何时访问了数据库以及进行了哪些操作。
Session Manager 还提供了在 AWS 账户中审计会话活动的能力。这种集中式方法增强了安全性并简化合规性要求。
如何通过 Session Manager 连接到您的 RDS 实例
出于网络安全的最佳实践,我们建议您在私有子网中启动 RDS 实例,仅允许来自同一 VPC 或不同 VPC 内部应用程序的访问。
为了允许用户访问这些受限资源,必须有一个堡垒主机,用户通过该主机连接以访问数据库。然而,有时授予这些堡垒主机的访问权限需要直接暴露于互联网,或者需要复杂的网络拓扑,以便流量能够通过 AWS Direct Connect 或 VPN 从本地网络路由。
使用 Session Manager 进行远程端口转发,消除了直接连接到堡垒主机或数据库的需求,同时保持安全性完好。以下图表解释了构架中涉及的组件以及建立连接所需的步骤。
工作流程的不同阶段如下:
启动一个 Session Manager 会话,通过 AWSStartPortForwardingSessionToRemoteHost Systems Manager 文档连接到其中一个 Amazon Elastic Compute CloudAmazon EC2管理的实例,并使用用户拥有的 AWS 凭证。运行在 SSM 管理实例上的 SSM 代理处理用户的请求,通过为此目的配置的 SSM VPC 终端节点进行通信。建立端口转发后,用户可以打开新的终端并通过已建立的隧道发送任何命令到远程主机。用户调用 Amazon RDS 使用其 IAM 凭证生成数据库认证令牌。用户通过使用之前生成的数据库认证令牌连接到数据库。初始设置
在本节中,我们将逐步指导您完成初始设置步骤。
创建 EC2 实例的安全组
创建安全组时,请完成以下步骤:
在 Amazon EC2 控制台中,选择导航面板上的 安全组。选择 创建安全组。输入安全组的名称和描述。对于 VPC,选择您的 VPC。
在 出站规则 部分,允许访问 PostgreSQL 端口5432。
为了使 EC2 实例能够与 SSM VPC 终端节点接口进行通信,还需启用端口 443HTTPS的出站流量。 在两个规则中,都将 VPC CIDR 范围作为目标添加。
选择 创建安全组。
创建 EC2 实例的 IAM 角色
现在我们为 EC2 实例创建一个 IAM 角色:
在 IAM 控制台中,选择导航面板中的 角色。选择 创建角色。选择 AWS 服务 作为 受信方实体类型。选择 EC2 作为 常用应用场景。
选择 下一步。
在 添加权限 部分,选择策略 AmazonSSMManagedInstanceCore。选择 下一步。输入角色名称、简短描述,并在必要时添加任何所需标签。在本篇文章中,我们将使用 EC2RDSAccessRole 作为角色名称。
选择 创建角色。
创建 EC2 实例堡垒主机
要为您的 EC2 实例进行配置,请完成以下步骤:
在 Amazon EC2 控制台中,选择导航面板中的 启动实例。输入实例的名称及任何必需标签。选择最新的 Amazon Linux AMI。选择实例类型例如,t3micro 实例类。选择 跳过密钥对。 由于我们使用 Session Manager 处理连接,因此不需要创建或使用现有密钥对。
对于 网络设置,选择在您的 Amazon 虚拟私有云VPC中配置的其中一个私有子网。
对于 自动分配公共 IP,选择 禁用。对于 安全组,选择您创建的安全组。在 高级详情 部分,选择之前创建的 IAM 角色 EC2RDSAccessRole。
选择 启动实例 开始实例创建。
如果一切成功且满足所有要求,新启动的实例将显示在 受管实例Fleet Manager 下,并准备与 Systems Manager 一起使用。
IAM 数据库认证
要在 RDS for PostgreSQL 数据库中使用 IAM 角色设置 IAM 数据库认证,请遵循以下步骤:
启用 IAM DB 认证 在 RDS for PostgreSQL 实例上。创建一个将用于通过 IAM 数据库认证连接到 DB 实例的数据库用户账号。确保该数据库用户在示例中为 dbuser获得了 rdsiam 角色,如下所示:
sqlCREATE USER dbuserGRANT rdsiam TO dbuser
请注意,出于审计目的,每个人工用户或机器身份仍需拥有自己的数据库用户/角色。
有关更多信息,请参阅 使用 IAM 认证创建数据库账户。
现在,您创建一个 IAM 策略,将创建的数据库用户映射到 IAM 用户或角色。
在 IAM 控制台的左侧导航面板中,选择 策略。选择 创建策略。在 策略编辑器 中,选择 JSON 选项卡,输入以下 JSON 文档:
json{ Version20121017 Statement[ { EffectAllow Action[ rdsdbconnect ] Resource[ arnawsrdsdbltregiongtltaccountidgtdbuserltDBInstanceResourceIDgt/ltDatabaseUsergt ] } ]}
确保相应替换以下元素:
region DB 实例所属的 AWS 区域。accountid DB 实例所属的 AWS 账户。DBInstanceResourceID DB 实例的标识符。要在 Amazon RDS 控制台中找到 DB 实例资源 ID,请选择 DB 实例查看其细节,然后选择 配置 选项卡,资源 ID 将显示在 配置 部分。DatabaseUser 用于通过 IAM 数据库认证连接到 DB 实例的数据库用户账户。在我们的示例中,使用的用户为 dbuser。
选择 审核策略 并输入策略名称,例如,rdsdbiam。
可选地输入描述。选择 创建策略。选择要附加策略的 IAM 用户或角色名称。选择 添加权限,然后选择 直接附加现有策略。搜索刚刚创建的 IAM 策略并选择它。选择 下一步:审核。确保策略正确并选择 添加权限。使用 AWS CLI 生成 IAM 认证令牌:
bashaws rds generatedbauthtoken hostname ltrdshostnamegt port 5432 region ltregiongt username dbuser
生成 DB 认证令牌的参数如下:
rdshostname 您要访问的 DB 实例的主机名例如,rdspostgres123456789012eucentral1rdsamazonawscom。port 用于连接到您的 DB 实例的端口号在我们的示例中,5432 是 PostgreSQL 的默认端口。region DB 实例所在的 AWS 区域。databaseuser 用于通过 IAM 数据库认证连接到 DB 实例的数据库用户账户。在我们的示例中,使用的用户为 dbuser。由于认证令牌包含几百个字符,使用命令行会很麻烦,推荐将其保存到环境变量中,稍后连接数据库时使用该变量。
以下示例显示如何为数据库用户 dbuser 生成 DB 认证令牌并将其存储在 PGPASSWORD 环境变量中。PGPASSWORD 变量的行为与密码连接参数相同。
bashexport RDSHOST=rdspostgres123456789012eucentral1rdsamazonawscomexport PGPASSWORD=(aws rds generatedbauthtoken hostname RDSHOST port 5432 region eucentral1 username dbuser)
在生成认证令牌后,其有效期为15分钟,过期后尝试连接数据库将被拒绝。请注意,DB 认证令牌仅在建立数据库连接时需要,并不影响现有连接的持续时间。
创建远程端口转发会话
在本节中,我们使用 Systems Manager 和与 RDS for PostgreSQL 实例的远程主机创建端口转发会话。
在您的计算机上打开一个终端,并确保您的 AWS 凭证有效,能够访问 AWS 账户。更新您的 /etc/hosts 文件,将您的 RDSHOST 解析为 127001:
bashecho 127001 RDSHOST gtgt /etc/hosts
请注意,通过更改 /etc/hosts 文件和所描述的解决方案,您将仅能从本地计算机连接到数据库实例。
创建远程端口转发的 System Manager 会话,以通过之前部署的 EC2 实例堡垒主机连接 RDS 数据库。在以下示例中,我们重用在早期部分创建的 RDSHOST 环境变量。localPortNumber 表示客户端上应重定向的本地端口,例如 1053:
bashaws ssm startsession region ltyour regiongt target ltyour EC2 instancegt documentname AWSStartPortForwardingSessionToRemoteHost parameters {host[RDSHOST]portNumber[5432]localPortNumber[1053]}
您应该看到类似以下输出:
Starting session with SessionId mySessionID1234abcdefghi5678Port 1053 opened for sessionId mySessionID1234abcdefghi5678Waiting for connections
飞机加速官网请保持此终端窗口打开。
使用 IAM 认证连接到 RDS for PostgreSQL 数据库实例
要通过之前创建的端口转发会话连接到您的 RDS for PostgreSQL 数据库实例,您必须在计算机上安装 psql 命令行工具。
此外,在通过 SSL 连接到 PostgreSQL DB 实例时,需下载 SSL 证书。有关更多详细信息,请参见 使用 SSL/TLS 加密连接到 DB 实例。

下载证书后,可以通过 psql 命令行工具使用 sslrootcert 参数引用它。
现在,您可以通过以下步骤使用 psql 通过 TLS 连接到您的 PostgreSQL DB 实例:
在计算机上打开一个新的终端,并确保您的 AWS 凭证有效,能够访问 AWS 账户。现在通过运行以下命令通过 SSL 连接到您的 PostgreSQL DB 实例:
bashpsql host RDS
在知识图谱中使用 Amazon Neptune 查找并链接相似实体,第一部分:全文本搜索 数据库博客
使用 Amazon Neptune 在知识图谱中查找和关联相似实体:全文搜索关键要点知识图谱汇集了多个来源的数据并关联相关实体,通过相似性搜索,我们可以识别和链接这些实体。本篇文章展示了如何使用Lex...
微软通过 Entra 推出 Azure 身份管理功能 媒体
微软推出新Azure功能以降低身份验证中的安全风险关键要点微软推出了联邦身份凭证系统,旨在减少用户在多项服务中交付安全凭证信息的次数。用户只需在一个服务登录一次,就能无缝访问其他服务。此流程包括对来自...