Teleport 处理 RDS IAM 认证未启用(rds-iam-auth-disabled)的完整指南
2026/9/21 18:41:05 网站建设 项目流程

Teleport 处理 RDS IAM 认证未启用(rds-iam-auth-disabled)的完整指南

【免费下载链接】teleportThe easiest, and most secure way to access and protect all of your infrastructure.项目地址: https://gitcode.com/gh_mirrors/tel/teleport

本文聚焦 Teleport 中一个具体的自动发现(Discovery)故障场景:Teleport Database Service 使用 AWS IAM 认证与 RDS 通信,当自动发现并纳管的 RDS 数据库未开启 IAM 认证时,Teleport 会生成一条类型为rds-iam-auth-disabled的 User Task,提示管理员修复。读完本文,你将掌握该问题的成因、Teleport 生成与维护该任务的完整链路、如何通过 AWS 控制台开启 RDS 的 IAM 认证,以及该机制在源码层面的实现细节。

问题背景:为什么 Teleport 依赖 RDS IAM 认证

Teleport Database Service 与 RDS 通信时采用 AWS IAM 认证(IAM database authentication)。其核心机制是:Teleport 使用 AWS 签名凭证(通常来自 AWS OIDC / IAM 集成)动态换取数据库访问凭证,从而避免在配置中静态存放数据库密码,同时获得按数据库用户细粒度控制访问的能力。

这一前提在关联文档 rds-iam-auth-disabled.md 中被直接点明:"The Teleport Database Service uses IAM authentication to communicate with RDS."因此,如果一个 RDS 实例或 Aurora 集群没有开启 IAM 认证,Teleport 就无法按既定的 IAM 认证流程建立连接,该数据库在自动发现流程中就会被标记为失败。

问题现象:User Task 如何产生

发现阶段的标记

在自动发现阶段,Teleport 的 Discovery Service 会调用 AWS RDS API 拉取实例与集群信息,并将 AWS 侧的IAMDatabaseAuthenticationEnabled字段映射为 Teleport 内部的RDS.IAMAuth元数据。相关实现位于 lib/srv/discovery/common/database.go:

  • 对于 RDS 实例(MetadataFromRDSInstance),读取rdsInstance.IAMDatabaseAuthenticationEnabled,写入types.AWS.RDS.IAMAuth
  • 对于 Aurora 集群(MetadataFromRDSCluster),同样读取rdsCluster.IAMDatabaseAuthenticationEnabled写入对应字段。

当该布尔值为false时,该数据库即被视为“因 IAM 认证未启用而无法接入”,成为rds-iam-auth-disabled问题的候选对象。

问题类型的定义

rds-iam-auth-disabled是 Teleport 中 RDS 自动发现问题类型的唯一取值,定义在 api/types/usertasks/object.go:

// AutoDiscoverRDSIssueIAMAuthenticationDisabled is used to identify databases that won't be // accessible because IAM Authentication is not enabled. AutoDiscoverRDSIssueIAMAuthenticationDisabled = "rds-iam-auth-disabled" // DiscoverRDSIssueTypes is a list of issue types that can occur when trying to auto enroll RDS databases. var DiscoverRDSIssueTypes = []string{ AutoDiscoverRDSIssueIAMAuthenticationDisabled, }

所有 RDS 自动发现失败都会以TaskTypeDiscoverRDS类型的 User Task 形式上报,其IssueType字段即为此值,Web UI 再根据该值加载对应的修复说明(见下文“说明文档的加载机制”)。

任务的合并与生命周期

Teleport 的 Discovery Service 会对失败数据库做去重合并,相关逻辑在 lib/srv/discovery/status.go 的mergeUpsertDiscoverRDSTask中:

  • 任务名由IntegrationIssueTypeAccountIDRegion组合生成(TaskNameForDiscoverRDS),保证同一集成、同一区域下的问题聚合为一条任务;
  • 合并时会先拉取后端已存在的任务,把旧的、仍在有效期的失败数据库并入新列表(mergeExistingInstances);
  • 任务设置了过期时间:s.clock.Now().Add(2 * s.PollInterval),即如果问题持续发生,任务会随每次轮询刷新;一旦 Discovery Service 停止或问题消失,任务到期自动清理,避免向用户展示已不再存在的问题。

说明文档的加载机制

rds-iam-auth-disabled.md是 User Task 系统里专门服务于该问题类型的 Markdown 说明文档。Teleport 通过 Go 的embed机制将这些描述文件打包进二进制,加载逻辑位于 lib/usertasks/descriptions.go:

//go:embed descriptions/*.md var descriptionsFS embed.FS func loadIssueTitleDescription(issueType string) (string, string) { filename := fmt.Sprintf("descriptions/%s.md", issueType) bs, err := descriptionsFS.ReadFile(filename) ... documentParts := strings.SplitN(string(bs), "\n", 2) title := documentParts[0] // 第一行 "# ..." 作为任务标题 description := strings.TrimSpace(documentParts[1]) // 其余部分作为问题描述与修复步骤 }

也就是说,该文档的第一行# IAM Auth disabled会成为 User Task 的标题,正文则是展示给管理员的描述与修复指引。加载后的内容通过DescriptionForDiscoverRDSIssue(issueType)对外提供,并被 lib/web/ui/usertask.go 等 Web 层代码消费,最终在 Teleport Web UI 中呈现给用户。

仓库中的测试 lib/usertasks/descriptions_test.go(TestAllDescriptions)会对DiscoverRDSIssueTypes中的每个问题类型逐一校验:对应的描述文件必须同时包含非空的标题与描述,否则测试失败。这保证了rds-iam-auth-disabled.md这类文档不会因缺失而让用户看到空白提示。

问题文档的核心内容:识别与修复

关联文档 rds-iam-auth-disabled.md 给出的核心信息如下:

  • 问题描述:Teleport Database Service 依赖 IAM 认证与 RDS 通信,而任务中列出的这些 RDS 数据库没有开启 IAM 认证(IAM authentication disabled)。
  • 修复方法:通过修改数据库的IAM DB Authentication属性来启用 IAM 认证。

具体操作(面向 AWS 控制台)分为两类,区别在于目标类型:

  1. RDS 实例(非 Aurora):在 AWS RDS 控制台打开目标数据库详情页,进入“连接与认证(Connectivity & security)”页签,找到IAM 数据库认证(IAM DB authentication)选项并选择“启用”,保存即可。
  2. Aurora 集群:在 AWS RDS 控制台打开目标 Aurora 集群详情页,同样在连接与安全配置中修改IAM 数据库认证属性,修改会应用到集群的写入与读取端点。

需要说明的是,开启 IAM 认证后,还需确保用于连接 RDS 的数据库用户支持 IAM 认证(例如在数据库中创建使用 IAM 认证的用户并授予相应权限),并且 Teleport 集成所使用的 IAM 角色拥有调用 RDS API 与生成数据库凭证的权限;这些是 IAM 认证生效的必要前提,请结合你的数据库与集成配置一并检查。

一键直达修复页面

为了让管理员能直接定位到问题数据库,Teleport 在 lib/usertasks/urls.go 中为 RDS 问题任务构造了两类 AWS 控制台 URL:

  • ResourceURL:数据库详情页,格式为https://console.aws.amazon.com/rds/home?region=<region>#database:id=<name>;is-cluster=<is-cluster>
  • ConfigurationURL:当问题类型为rds-iam-auth-disabled(即AutoDiscoverRDSIssueIAMAuthenticationDisabled)时额外附加tab=configuration页签,直接打开数据库的配置页:https://console.aws.amazon.com/rds/home?region=<region>#database:id=<name>;is-cluster=<is-cluster>;tab=configuration

实现要点(见withRDSDatabaseIssueURL):

  • 数据库中每个失败的 RDS 资源按数据库资源 ID作为键记录;对 Aurora 集群使用DBClusterIdentifier,对其他 RDS 数据库使用DBInstanceIdentifier
  • is-cluster参数根据该资源是否为 Aurora 集群(database.GetIsCluster())动态生成;
  • 仅当IssueType为 IAM 认证未启用时才会附加ConfigurationURL,正对应本问题“去配置页开启 IAM 认证”的修复路径。

这些 URL 通过RDSDatabasesWithURLs注入到 User Task 的 Web 呈现中,管理员在 Web UI 中点击即可直达需要修改的数据库配置页。

验证与测试保障

Teleport 对rds-iam-auth-disabled问题的处理有完整的测试覆盖:

  • lib/srv/discovery/discovery_test.go 中的集成测试会构造 IAM 认证未启用的 RDS 资源,断言生成的 User Task 的IssueTyperds-iam-auth-disabled(参见测试中对gotUserTask.GetSpec().GetIssueType()的校验);
  • lib/usertasks/urls_test.go 验证了 RDS 数据库任务 URL(包括is-cluster标志与ConfigurationURL页签)的构造结果;
  • api/types/usertasks/object_test.go 覆盖了IssueType = "rds-iam-auth-disabled"的 User Task 对象创建、校验与状态机检查。

这些测试共同保证了:问题能被正确标记、描述文档能被正确加载、修复链接能正确生成、任务状态能按预期流转。

排查与修复建议(操作清单)

当你看到标题为 “IAM Auth disabled” 的 User Task 时,可按以下顺序处理:

  1. 在 Web UI 中点击任务内的ConfigurationURL,或手动在 AWS RDS 控制台打开对应数据库/集群详情页;
  2. 在配置中启用IAM DB authentication(实例与 Aurora 集群的操作入口相同,只是对象类型不同);
  3. 确认该数据库用于 Teleport 接入的数据库用户支持 IAM 认证(数据库中需存在启用 IAM 认证的用户);
  4. 确认 Teleport 与 AWS 集成所用的 IAM 角色具备连接该数据库并生成 IAM 数据库凭证的权限;
  5. 等待下一个 Discovery 轮询周期(任务过期时间与轮询间隔相关,为2 * PollInterval)。若问题已解决,该任务会自动过期清理;若仍有失败,任务会保留并持续提示。

小结

rds-iam-auth-disabled是 Teleport 自动发现 RDS 数据库时一个常见且修复路径清晰的故障类型:其成因是目标 RDS 未开启 IAM 数据库认证,而 Teleport Database Service 恰好依赖该认证方式建立连接。Teleport 通过 User Task 机制,将此类失败聚合为可操作的任务,并借助 rds-iam-auth-disabled.md 提供修复指引、借助 urls.go 提供直达配置页的链接。理解这条从“发现标记 → 问题类型定义 → 描述加载 → URL 构造 → 任务合并与过期”的完整链路,能帮助你在遇到该问题时快速定位根因并完成修复。

【免费下载链接】teleportThe easiest, and most secure way to access and protect all of your infrastructure.项目地址: https://gitcode.com/gh_mirrors/tel/teleport

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询