一、傳統 AK/SK 方式訪問 AWS 資源存在的問題
密鑰管理困境:
- 長期暴露風險:靜態 AK/SK 需硬編碼於配置文件中,一旦因代碼泄露、誤提交或惡意竊取導致密鑰擴散,攻擊者可永久獲得等同於密鑰所有者的完整權限,引發持續性的數據泄露、資源篡改及資金損失風險;
- 審計盲區: 多用户/多服務共享同一組密鑰時,雲操作日誌僅記錄密鑰身份而無法關聯具體使用者,無法追溯真實責任人或業務模塊;
- 運維成本高:密鑰輪換災難,需手動輪換業務模塊密鑰,容易出錯觸發服務中斷;
- 權限管理失控:賬户管理不清晰,授權無法滿足服務/實例級的最小權限管控需求。
二、AWS IAM Assume Role 機制介紹
AWS Assume Role 是一種安全身份切換機制,允許一個可信實體(如 IAM 用户、EC2 實例或外部賬號)通過 STS(安全令牌服務)臨時獲取目標角色的權限。其運作流程如下:
使用 AWS IAM Assume Role 方式訪問的優點:
- 動態令牌機制(15 分鐘~12 小時有效期)替代永久密鑰
- 通過
External ID實現跨賬號安全隔離,並且可通過 AWS 後台服務進行審計 - 基於角色的最小權限原則(Principle of Least Privilege)
AWS IAM Assume Role 訪問 S3 Bucket 的鑑權過程:
階段 1:源用户身份驗證
-
權限策略檢查
- 源用户發起
AssumeRole請求時,源賬户的 IAM 策略引擎首先驗證:該用户是否被授權調用 sts:AssumeRole 操作? - 檢查依據:附着在源用户身份上的 IAM Permissions Policies
- 源用户發起
-
信任關係校驗
- 通過 STS 服務向目標賬户發起請求:
源用户是否在目標角色的信任策略白名單中? - 檢查依據:目標角色綁定的 IAM Trust Relationships Policies(明確允許哪些賬號/用户擔任該角色)
- 通過 STS 服務向目標賬户發起請求:
階段 2:目標角色權限激活
-
臨時憑證生成
- 若信任關係驗證通過,STS 生成三要素臨時憑證
-
{ "AccessKeyId": "ASIA***", "SecretAccessKey": "***", "SessionToken": "***" // 有效期 15min-12h
-
目標角色權限驗證
- 目標角色使用臨時憑證訪問 AWS S3 前,目標賬户的 IAM 策略引擎校驗:
該角色是否被授權執行請求的S3操作? (如s3:GetObject、s3:PutObject等) - 檢查依據:附着在目標角色上的 IAM Permissions Policies(定義角色能做什麼)
階段 3:資源操作執行
- 目標角色使用臨時憑證訪問 AWS S3 前,目標賬户的 IAM 策略引擎校驗:
-
訪問存儲桶
- 全部驗證通過後,目標角色才可執行 S3 API 操作。
三、Apache Doris 如何應用 AWS IAM Assume Role 鑑權機制
-
Doris 通過將 FE、BE 進程所部署的 AWS EC2 Instances 綁定到 Source Account 來使用 AWS IAM Assume Role 的功能,主要的流程如下圖所示,具體的配置可參照官網文檔和視頻 :
- 完成配置後 Doris FE/BE 進程會自動獲 EC2 Instance 的 Profile 進行執行 Assume Role 操作訪問 Bucket 操作,擴容時 BE 節點會自動檢測新的 EC2 Instance 是否成功綁定 IAM Role,防止出現漏配的情況;
-
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 官網文檔](https://doris.apache.org/zh-CN/docs/3.0/admin-manual/auth/integrations/aws-authentication-and-authorization);
1. Doris 當前僅支持了 AWS IAM Assume Role 的機制,未來會逐步實現其他雲廠商的類似鑑權機制。
## Reference
- 官網文檔 https://doris.apache.org/zh-CN/docs/3.0/admin-manual/auth/integrations/aws-authentication-and-authorization