Spark RAM用户细粒度授权

更新时间:

本文介绍如何配置 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:PassRoleResource对应的值请根据实际值进行替换。

    • 可通过身份管理 > 角色,单击具体角色名称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。