AWS 账户 ID 12 位数字背后的结构 - 为什么是 12 位,能读取哪些信息

从趣味知识角度解析 AWS 账户 ID 为何是 12 位数字、ARN 结构中蕴含的设计意图,以及从账户 ID 可推测的信息和安全注意事项。

为什么是 12 位数字

AWS 账户 ID 是一个 12 位数字(例如:123456789012)。这个位数是为了确保 AWS 在未来能够发放足够数量的账户而设计的。12 位数字拥有 10^12 = 1 万亿种组合。截至 2024 年,AWS 的活跃账户数量虽未公开,但估计在数千万到数亿之间。拥有 1 万亿的空间,即使按照当前的增长速度,也足以使用数百年而不会耗尽。账户 ID 仅由数字组成的原因在于兼容性和可读性。纯数字可以在任何系统和编程语言中无障碍处理,在电话口头传达时也不易产生误解。但需要注意的是,存在以零开头的账户 ID(例如:012345678901),因此在程序中处理账户 ID 时必须使用字符串类型。如果使用整数类型,前导零会丢失,变成 11 位数字。这个陷阱是刚开始使用 AWS 的开发者最容易踩到的 Bug 之一。

ARN 的结构 - AWS 资源的地址体系

AWS 的所有资源都通过 ARN(Amazon Resource Name)进行唯一标识。ARN 的格式为 arn:partition:service:region:account-id:resource-type/resource-id。这个结构反映了 AWS 的架构设计。partition 在大多数情况下为 aws,但中国区域为 aws-cn,GovCloud 为 aws-us-gov,它们是分离的。这表明中国和 GovCloud 运行在与其他区域完全独立的基础设施上。service 是服务名称(s3、ec2、lambda 等),region 是区域代码(ap-northeast-1 等)。对于全球服务(IAMRoute 53CloudFront 等),region 为空。account-id 是 12 位账户 ID,用于标识资源的所有者。S3 存储桶的 ARN(arn:aws:s3:::my-bucket)不包含账户 ID。这是因为 S3 存储桶名称是全局唯一的,无需账户 ID 即可标识资源。这一设计是在 S3 早期确定的,后续推出的服务都会包含账户 ID。

账户 ID 是否属于机密信息

AWS 账户 ID 严格来说不是机密信息,但也不应不必要地公开。仅知道账户 ID 本身并不能访问该账户的资源。访问需要 IAM 认证凭证(访问密钥或角色的 AssumeRole)。然而,账户 ID 被知晓后会产生一些风险。第一,可能成为社会工程攻击的素材。由于向 AWS 支持提交工单时账户 ID 被用作身份验证的一部分,攻击者知道账户 ID 后冒充成功的概率会提高。第二,存在利用资源策略配置错误的风险。如果 S3 存储桶策略中 Principal 指定了账户 ID,攻击者知道该账户 ID 后可以从自己的账户尝试 AssumeRole。第三,存在利用 AMI 或快照共享配置错误的风险。如果 AMI 设置为共享给特定账户 ID,该账户 ID 泄露后可能导致意外共享给非预期的账户。

账户 ID 无意间泄露的途径

账户 ID 有时会在开发者不知情的情况下泄露到外部。最常见的途径是 IAM 角色或用户的 ARN 包含在日志或错误消息中。将 CloudTrail 日志发送到外部日志分析服务时,日志中的账户 ID 会原样发送。在推送到 GitHub 的 CloudFormation 模板或 Terraform 代码中硬编码账户 ID 的情况也很常见。虽然从 S3 存储桶的 URL(https://my-bucket.s3.amazonaws.com)无法直接获知账户 ID,但存储桶策略的错误消息中可能包含账户 ID。由于也可以从 EC2 的元数据服务(http://169.254.169.254/latest/meta-data/identity-credentials/ec2/info)获取账户 ID,因此存在 SSRF(Server-Side Request Forgery)漏洞时账户 ID 可能泄露。通过强制使用 IMDSv2(Instance Metadata Service Version 2),可以防止通过 SSRF 获取元数据。

多账户策略与账户 ID 管理

在现代 AWS 运维中,一个组织拥有数十到数百个账户的多账户策略已成为标准。使用 AWS Organizations 可以在组织根账户下创建 OU(Organizational Unit),对账户进行层级化管理。每个账户被分配唯一的 12 位 ID,账户间的资源共享通过 RAM(Resource Access Manager)或资源策略进行控制。在多账户策略中,账户 ID 的管理成为运维课题。当拥有数百个账户时,很难掌握哪个账户 ID 对应哪个环境(生产、预发布、开发)。建议使用 AWS Organizations 的标签功能为账户添加元数据,并维护账户 ID 与账户名称的对应表。使用 Control Tower 可以在创建账户时自动添加标签并应用护栏(SCP),提供标准化的工作流程。如需系统学习 AWS 的账户管理和安全设计,专业书籍 (Amazon) 是很好的参考。