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中:
- 任务名由
Integration、IssueType、AccountID、Region组合生成(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 控制台)分为两类,区别在于目标类型:
- RDS 实例(非 Aurora):在 AWS RDS 控制台打开目标数据库详情页,进入“连接与认证(Connectivity & security)”页签,找到IAM 数据库认证(IAM DB authentication)选项并选择“启用”,保存即可。
- 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 的
IssueType为rds-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 时,可按以下顺序处理:
- 在 Web UI 中点击任务内的
ConfigurationURL,或手动在 AWS RDS 控制台打开对应数据库/集群详情页; - 在配置中启用IAM DB authentication(实例与 Aurora 集群的操作入口相同,只是对象类型不同);
- 确认该数据库用于 Teleport 接入的数据库用户支持 IAM 认证(数据库中需存在启用 IAM 认证的用户);
- 确认 Teleport 与 AWS 集成所用的 IAM 角色具备连接该数据库并生成 IAM 数据库凭证的权限;
- 等待下一个 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),仅供参考