返回

云上数据安全新范式:Apache Doris IAM Assume Role 解锁无密钥访问 AWS S3 数据

SelectDB 技术团队· 2025/09/15

一、传统 AK/SK 方式访问 AWS 资源存在的问题

密钥管理困境:

  • 长期暴露风险:静态 AK/SK 需硬编码于配置文件中,一旦因代码泄露、误提交或恶意窃取导致密钥扩散,攻击者可永久获得等同于密钥所有者的完整权限,引发持续性的数据泄露、资源篡改及资金损失风险;
  • 审计盲区: 多用户/多服务共享同一组密钥时,云操作日志仅记录密钥身份而无法关联具体使用者,无法追溯真实责任人或业务模块;
  • 运维成本高:密钥轮换灾难,需手动轮换业务模块密钥,容易出错触发服务中断;
  • 权限管理失控:账户管理不清晰,授权无法满足服务/实例级的最小权限管控需求。

二、AWS IAM Assume Role 机制介绍

AWS Assume Role 是一种安全身份切换机制,允许一个可信实体(如 IAM 用户、EC2 实例或外部账号)通过 STS(安全令牌服务)临时获取目标角色的权限。其运作流程如下:

二、AWS IAM Assume Role 机制介绍.PNG

使用 AWS IAM Assume Role 方式访问的优点:

  • 动态令牌机制(15 分钟~12 小时有效期)替代永久密钥
  • 通过External ID实现跨账号安全隔离,并且可通过 AWS 后台服务进行审计
  • 基于角色的最小权限原则(Principle of Least Privilege)

AWS IAM Assume Role 访问 S3 Bucket 的鉴权过程:

二、AWS IAM Assume Role 机制介绍-1.PNG

阶段 1:源用户身份验证

  1. 权限策略检查
    1. 源用户发起 AssumeRole 请求时,源账户的 IAM 策略引擎首先验证: 该用户是否被授权调用 sts:AssumeRole 操作?
    2. 检查依据:附着在源用户身份上的 IAM Permissions Policies
  2. 信任关系校验
    1. 通过 STS 服务向目标账户发起请求: 源用户是否在目标角色的信任策略白名单中?
    2. 检查依据:目标角色绑定的 IAM Trust Relationships Policies(明确允许哪些账号/用户担任该角色)

阶段 2:目标角色权限激活

  1. 临时凭证生成
    1. 若信任关系验证通过,STS 生成三要素临时凭证
    2. {
        "AccessKeyId": "ASIA***",  
        "SecretAccessKey": "***",  
        "SessionToken": "***" // 有效期 15min-12h
      }
      
  2. 目标角色权限验证
    1. 目标角色使用临时凭证访问 AWS S3 前,目标账户的 IAM 策略引擎校验: 该角色是否被授权执行请求的S3操作? (如s3:GetObject、s3:PutObject等)
    2. 检查依据:附着在目标角色上的 IAM Permissions Policies(定义角色能做什么)

阶段 3:资源操作执行

  1. 访问存储桶
    1. 全部验证通过后,目标角色才可执行 S3 API 操作。

三、Apache Doris 如何应用 AWS IAM Assume Role 鉴权机制

  1. Doris 通过将 FE、BE 进程所部署的 AWS EC2 Instances 绑定到 Source Account 来使用 AWS IAM Assume Role 的功能,主要的流程如下图所示,具体的配置可参照官网文档和视频

三、Apache Doris 如何应用 AWS IAM Assume Role ​鉴权机制.PNG

  1. 完成配置后 Doris FE/BE 进程会自动获 EC2 Instance 的 Profile 进行执行 Assume Role 操作访问 Bucket 操作,扩容时 BE 节点会自动检测新的 EC2 Instance 是否成功绑定 IAM Role,防止出现漏配的情况;

  2. Doris 的 S3 Load、TVF、Export、Resource、Repository、Storage Vault 等功能在 3.0.6 版本之后均支持了 AWS Assume Role 的方式使用,并且在创建时会进行连通性检测,S3 Load SQL 举例如下:

  LOAD LABEL s3_load_demo_202508
  (
      DATA INFILE("s3://your_bucket_name/s3load_example.csv")
      INTO TABLE test_s3load
      COLUMNS TERMINATED BY ","
      FORMAT AS "CSV"
      (user_id, name, age)
  )
  WITH S3
  (
      "provider" = "S3",
      "s3.endpoint" = "s3.us-east-1.amazonaws.com",
      "s3.region" = "us-east-1",
      "s3.role_arn" = "arn:aws:iam::543815668950:role/test-role1",
      "s3.external_id" = "1001"      -- 可选参数
  )
  PROPERTIES
  (
      "timeout" = "3600"
  );

其中 "s3.role_arn" 对应填入 AWS IAM Account2 下的 Iam role2 的 arn 值,"s3.external_id"对应填入 Trust Relationships Policies 中配置的 externalId 的值(可选配置)。

更多功能 SQL 语句详细参考: Doris 官网文档

  1. Doris 当前仅支持了 AWS IAM Assume Role 的机制,未来会逐步实现其他云厂商的类似鉴权机制。

Reference

  • 官网文档 https://doris.apache.org/zh-CN/docs/3.0/admin-manual/auth/integrations/aws-authentication-and-authorization
  • 视频 https://www.bilibili.com/video/BV1U3uezjEPW/?vd_source=20479f0462e74fcf98f1df731639610f