ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

跨账户访问安全指南:erlcloud 中 IAM/STS 角色扮演实战

跨账户访问安全指南:erlcloud 中 IAM/STS 角色扮演实战 跨账户访问安全指南erlcloud 中 IAM/STS 角色扮演实战【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud跨账户访问是企业上云后最常见的架构需求之一主账号统一管账业务账号各管各的资源。而erlcloud作为 Erlang 生态中最成熟的 AWS API 客户端库凭借其内置的IAM/STS 角色扮演Assume Role支持让你用纯 Erlang 代码就能安全、优雅地完成跨账户授权与访问。本文将带你从原理到实战一步步掌握 erlcloud 中 STS 角色扮演的安全配置方法。为什么需要跨账户访问与角色扮演️在 AWS 中每个账户都有独立的 IAM 身份体系。如果业务账户 A 想访问账户 B 的 S3 存储桶传统做法是复制访问密钥——但这意味着密钥的长期泄露风险。角色扮演AssumeRole的方案完全不同不共享长期密钥只临时颁发短期凭证默认 900 秒起临时凭证通过 STS 服务签发到期自动失效权限由目标账户的角色信任策略控制源账户无法越权这正是 erlcloud 的强项它把 STS 的AssumeRole流程封装成一行 Erlang 调用你不需要手写任何签名逻辑。认识 erlcloud 的 STS 角色扮演核心 API erlcloud 的 STS 支持集中在 erlcloud_sts.erl 模块中导出了 4 组核心函数函数作用说明assume_role/4,5换取角色临时凭证跨账户访问的核心入口get_caller_identity/1查询当前身份验证角色扮演是否成功get_federation_token/3,4获取联合身份令牌适用于联邦用户场景五步完成 assume_role 临时凭证换取先看最核心的assume_role它在 erlcloud_sts.erl 中的实现思路非常清晰校验参数RoleArn至少 20 字符、会话名 2~64 字符、时长 900~43200 秒组装AssumeRole请求参数含可选的ExternalId调用 STS Query API 并解析 XML 响应从响应中提取AccessKeyId、SecretAccessKey、SessionToken、Expiration返回新的#aws_config{}记录——直接用这个新配置访问目标账户资源即可下面是实际调用示例{ok, AssumedConfig} erlcloud_sts:assume_role( BaseConfig, % 源账户的配置 arn:aws:iam::111122223333:role/CrossAccountReader, app-session, % 会话名 3600, % 时长 1 小时 my-external-id % ExternalId跨账户必备 ),拿到AssumedConfig后就可以直接传给任何 erlcloud 服务模块例如访问目标账户的 S3Buckets erlcloud_s3:list_buckets(AssumedConfig).get_caller_identity验证你的角色扮演身份跨账户访问最容易踩的坑是以为切了角色其实还在原账户。用 get_caller_identity/1 可以快速确认{ok, Identity} erlcloud_sts:get_caller_identity(AssumedConfig), {account, AccountId} proplists:lookup(account, Identity), io:format(当前账号: ~s~n, [AccountId]).返回的account、arn、userId三个字段能立刻告诉你当前真正生效的身份是谁。erlcloud 一键配置assume_role 自动角色扮演 ⚙️手动调用assume_role适合一次性场景。而生产环境更推荐 erlcloud 提供的自动角色扮演机制——你只需在配置中声明要扮演的角色之后的所有请求都会自动走角色凭证无需感知切换过程。#aws_assume_role 记录字段详解这个机制的核心是 erlcloud_aws.hrl 中定义的#aws_assume_role{}记录字段默认值含义role_arnundefined要扮演的 IAM 角色 ARNsession_nameerlcloud会话名duration_secs900凭证有效期秒external_idundefined第三方 ExternalId配置方式非常直观Config (erlcloud_aws:default_config())#aws_config{ assume_role #aws_assume_role{ role_arn arn:aws:iam::111122223333:role/CrossAccountReader, session_name my-app, duration_secs 3600, external_id my-external-id } }, {ok, FinalConfig} erlcloud_aws:update_config(Config),调用update_config/1时erlcloud_aws.erl 检测到assume_role已配置会自动调用get_role_credentials换取角色凭证并写回配置。凭据缓存与自动刷新机制 长期运行的服务最怕凭证过期导致请求中断。erlcloud 贴心地内置了两层保护进程字典缓存换取到的凭证会按role_arn external_id缓存到期前 5 分钟自动刷新在 get_role_credentials/1 中当缓存凭证剩余有效期不足 300 秒时自动重新调用assume_role换取新凭证也就是说你完全不用自己管刷新逻辑erlcloud 会在后台静默完成凭证轮换业务代码零改动。使用共享配置文件快速实现跨账户角色扮演 如果你已经熟悉 AWS CLI 的~/.aws/credentials文件erlcloud 还能直接复用这套配置。在 erlcloud_aws.erl 中profile/2函数支持三种配置形态① 直接凭证经典配置[default] aws_access_key_id XXXXXXXXX aws_secret_access_key YYYYYYYYY② 角色扮演通过role_arnsource_profile声明跨账户角色[foo] role_arn arn:aws:iam::892406118791:role/centralized-users source_profile default③ 高级选项配合role_session_name、role_duration_secs、external_id三个选项精细化控制扮演行为见 erlcloud_aws.erl。调用时只需{ok, Config} erlcloud_aws:profile(foo, [{external_id, my-external-id}]).一套配置CLI 与 Erlang 应用通用管理成本大幅降低。跨账户安全最佳实践 角色扮演机制本身安全但用得不好同样会出问题。以下是长期维护跨账户访问的实战经验1. 跨账户必须使用 ExternalId当角色被第三方或外部账户扮演时AWS 强烈建议在信任策略中要求sts:ExternalId。erlcloud 的assume_role/5和#aws_assume_role{}都原生支持该字段务必传入一个只有你和对方知道的机密字符串防止混淆代理攻击Confused Deputy。2. 角色权限遵循最小化原则在目标账户创建角色时只授予业务真正需要的权限。例如只读角色就不要附加写权限策略。erlcloud 的 IAM 模块 erlcloud_iam.erl 提供了完整的角色管理函数如get_role/1、list_roles/0可以随时审计角色配置。3. 限制信任方账号角色的信任策略中明确指定允许扮演的源账户 ARN不要写成Principal: *。配合 ExternalId 双重校验才是完整的跨账户防线。4. 定期轮换与审计临时凭证有效期尽量短如 900~3600 秒开启 CloudTrail 记录AssumeRole事件用 erlcloud 的 CloudTrail 模块erlcloud_cloudtrail.erl自动化审计定期用get_caller_identity检查各服务的实际身份常见问题排查与避坑指南 现象原因解决方法AccessDenied报错角色信任策略不允许该账户扮演检查目标账户角色信任策略的Principal与ExternalId凭证很快过期duration_secs过短调大时长或依赖 erlcloud 自动刷新机制请求无限循环手动配置了assume_role又调用assume_role/5参考 erlcloud_aws.erl 的防循环处理内部会重置assume_role字段profile 解析失败credentials 文件格式错误确认$HOME/.aws/credentials权限为 600格式符合 INI 规范总结让跨账户访问既安全又省心 ✨跨账户访问不必再靠复制密钥这种高风险方式。通过 erlcloud 内置的 IAM/STS 角色扮演能力你可以✅ 用assume_role/4,5手动掌控每一次凭证换取✅ 用#aws_assume_role{}配置实现全自动角色扮演与凭证刷新✅ 用profile/2复用现有 AWS 配置文件✅ 用 ExternalId 最小权限 信任策略守住安全底线从今天起把跨账户访问交给 erlcloud把安全留给设计良好的角色体系。你的 Erlang 应用也能像 AWS 原生 SDK 一样在账户之间来去自如、安全可控。【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进