全部產品
Search
文件中心

AnalyticDB:Spark RAM使用者細粒度授權

更新時間:Mar 25, 2026

本文介紹如何配置 RAM 使用者、RAM 角色及相關策略,並示範提交讀寫 OSS 資料的 Spark 作業。

概覽

AnalyticDB Spark 提供同帳號快速授權功能。但在嚴格管控許可權的企業環境中,需要自訂策略以實現細粒度授權,防止預設許可權放大。

本文將展示“提交Spark作業的許可權”與“應用運行時的資源存取權限”分離的最佳實務。RAM 使用者(子帳號)負責提交作業,而 Spark 應用使用獨立的 RAM 角色訪問 OSS 等雲資源。

配置 RAM 身份與策略

  1. 使用 RAM 管理員登入RAM控制台

  2. 建立RAM使用者。(樣本使用者名稱:adb-spark-ramuser-test

  3. 建立可信實體為阿里雲服務的RAM角色

    • 信任主體:選擇雲原生資料倉儲 AnalyticDB MySQL 版

    • 樣本角色名稱:adb-spark-ramrole-test

  4. 建立自訂權限原則

    需要建立兩個策略:一個用於管理 AnalyticDB 叢集,一個用於控制應用訪問外部資源。

    策略 A:AnalyticDB 系統管理權限

    此策略允許 RAM 使用者管理 AnalyticDB Spark 應用,並擁有 PassRole 許可權。

    1. 進入許可權管理 > 權限原則,點擊建立權限原則

    2. 選擇指令碼編輯

    3. 輸入以下內容(將 ${AliyunAccount} 替換為你的阿里雲主帳號 ID)。

    4. 策略命名樣本為adb-spark-ramuser-test-adbpolicy

    說明

    ram:PassRole的Resource對應的值請根據實際值進行替換。

    • 可通過身份管理 > 角色,單擊具體角色名稱adb-spark-ramrole-test,在基本資料中複製ARN。

    • 請記錄該 ARN,後續步驟將使用此值。

    {
      "Version": "1",
      "Statement": [
        {
          "Action": [
            "adb:Get*",
            "adb:List*",
            "adb:Kill*",
            "adb:Cancel*",
            "adb:Submit*",
            "adb:Allocate*",
            "adb:Describe*",
            "adb:Lock*",
            "adb:Copy*",
            "adb:Query*",
            "adb:Show*",
            "adb:Test*",
            "adb:Export*",
            "adb:Execute*",
            "adb:*Project",
            "adb:*Directory",
            "adb:*ProcessDefinition",
            "adb:*ProcessDefinitions",
            "adb:*ProcessDefinitionAttribute",
            "adb:*ProcessInstance",
            "adb:*ProcessInstances",
            "adb:*ProcessInstanceAttribute",
            "adb:*ProcessInstanceTasks",
            "adb:*TaskDefinition",
            "adb:*TaskDefinitions",
            "adb:*TaskDefinitionCode",
            "adb:*TaskDefinitionAttribute",
            "adb:*TaskInstance",
            "adb:*TaskInstances",
            "adb:*Notebook",
            "adb:*Notebooks",
            "adb:*NotebookKernel",
            "adb:*NotebookAttribute",
            "adb:*NotebookConfiguration",
            "adb:*NotebookParagraph",
            "adb:*NotebookParagraphs",
            "adb:*JupyterInstance",
            "adb:*JupyterInstances",
            "adb:*JupyterSpecifications",
            "adb:*JupyterInstanceAttribute",
            "adb:*Schedule",
            "adb:BindAccount",
            "adb:UnbindAccount",
            "adb:Authentication",
            "adb:Check*",
            "adb:Load*",
            "adb:Stat*",
            "adb:*SparkTemplate*",
            "adb:Download*"
          ],
          "Resource": "*",
          "Effect": "Allow"
        },
        {
          "Action": "ram:ListUserBasicInfos",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "ram:PassRole",
          "Resource": "acs:ram::${AliyunAccount}:role/adb-spark-ramrole-test",
          "Effect": "Allow"
        }
      ]
    }

    策略 B:資料存取權限

    此策略控制 Spark 應用運行時對 OSS 的訪問。

    1. 配置允許訪問的 Bucket 和 IP 網段。

    2. 策略命名樣本為adb-spark-ramuser-test-datapolicy

    下列參數替換成實際值:

    • ${bucket}:需要訪問的Bucket。

    • ${AliyunAccount} :阿里雲主賬戶ID。

    • ${IPv4 CIDR Block}IP網段。(如192.168.1.0/24)

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:*",
          "Resource": [
            "acs:oss:oss-*:${AliyunAccount}:${bucket-1}",
            "acs:oss:oss-*:${AliyunAccount}:${bucket-2}",
            "acs:oss:oss-*:${AliyunAccount}:${bucket-1}/*",
            "acs:oss:oss-*:${AliyunAccount}:${bucket-2}/*"
          ],
          "Condition": {
            "IpAddress": {
              "acs:SourceIp": [
                "${IPv4 CIDR Block1}",
                "${IPv4 CIDR Block2}"
              ]
            }
          }
        }
      ]
    }
  5. 授權RAM使用者

    1. 進入身份管理 > 使用者,選擇adb-spark-ramuser-test

    2. 點擊許可權管理 > 新增授權

    3. 添加策略adb-spark-ramuser-test-adbpolicy

  6. 授權RAM角色

    1. 進入身份管理 > 角色,選擇adb-spark-ramrole-test

    2. 點擊許可權管理 > 新增授權

    3. 添加策略adb-spark-ramuser-test-datapolicy

配置AnalyticDB MySQL帳號

  1. 使用管理員登入AnalyticDB MySQL控制台

  2. 單擊集群清單,進入目的地組群。

  3. 單擊帳號管理 > 創建賬號,賬戶類型選擇普通賬號

  4. 建立完成後,單擊RAM綁定管理,綁定 RAM 使用者adb-spark-ramuser-test

  5. 點擊權限 > 編輯權限,根據需求授予許可權(例如:全域建立、查詢、變更許可權)。

RAM使用者提交作業

完成以上所有步驟後,RAM 使用者adb-spark-ramuser-test已具備策略 A定義的叢集系統管理權限。接下來的操作示範如何使用該 RAM 使用者提交作業,並通過指定 RAM 角色(具備策略 B)來安全地讀寫 OSS 資料。

  1. 使用RAM使用者adb-spark-ramuser-test登入AnalyticDB MySQL控制台

  2. 單擊集群清單,進入目的地組群,然後單擊作業開發 > SQL開發

  3. 在編輯器上方,選擇Spark引擎和對應的資源群組

  4. 編寫並提交作業。

    必須在SQL中配置spark.adb.roleArn參數,即上面配置策略中記錄的ARN值。

    說明

    雖然當前登入的 RAM 使用者擁有提交作業的許可權,但該使用者無權直接讀取 OSS。Spark 引擎將扮演參數中指定的 RAM 角色(adb-spark-ramrole-test),利用該角色的許可權去訪問 OSS 資料。

    -- 配置 Spark 應用運行時使用的 RAM 角色 ARN
    -- 該角色已在“自訂權限原則 B”中獲得了 OSS 讀寫權限
    set spark.adb.roleArn=acs:ram::${AliyunAccount}:role/adb-spark-ramrole-test;
    
    -- 建立指向 OSS 路徑的資料庫
    -- 確保 bucket-1 在策略允許的資源清單中
    create database if not exists test_db_01 location 'oss://bucket-1/path/to/test_db_01/';
    
    -- 建立表
    create table if not exists test_db_01.test_tbl_01(id int, name string);
    
    -- 寫入資料 (Spark 引擎將使用指定的 Role 寫入 OSS)
    insert into test_db_01.test_tbl_01 values(1, 'a');
    
    -- 查詢資料 (Spark 引擎將使用指定的 Role 讀取 OSS)
    select * from test_db_01.test_tbl_01;
    SET配置中如需指定日誌路徑,請配置spark.app.log.rootPath。更多參數請參考 Spark 應用配置參數說明
  5. 驗證結果
    單擊執行SQL。作業成功運行即證明細粒度授權配置生效:RAM使用者成功提交了作業,且 Spark 應用成功通過扮演角色訪問了 OSS。