Spark RAM用户细粒度授权
本文介绍如何配置 RAM 用户、RAM 角色及相关策略,并演示提交读写 OSS 数据的 Spark 作业。
概览
AnalyticDB Spark 提供同账号快速授权功能。但在严格管控权限的企业环境中,需要自定义策略以实现细粒度授权,防止默认权限放大。
本文将展示“提交Spark作业的权限”与“应用运行时的资源访问权限”分离的最佳实践。RAM 用户(子账号)负责提交作业,而 Spark 应用使用独立的 RAM 角色访问 OSS 等云资源。
配置 RAM 身份与策略
使用 RAM 管理员登录RAM控制台。
创建RAM用户。(示例用户名:
adb-spark-ramuser-test)信任主体:选择云原生数据仓库 AnalyticDB MySQL 版。
示例角色名:
adb-spark-ramrole-test。
创建自定义权限策略
需要创建两个策略:一个用于管理 AnalyticDB 集群,一个用于控制应用访问外部资源。
策略 A:AnalyticDB 管理权限
此策略允许 RAM 用户管理 AnalyticDB Spark 应用,并拥有 PassRole 权限。
进入,点击创建权限策略。
选择脚本编辑。
输入以下内容(将 ${AliyunAccount} 替换为你的阿里云主账号 ID)。
策略命名示例为
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 的访问。
配置允许访问的 Bucket 和 IP 网段。
策略命名示例为
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}" ] } } } ] }授权RAM用户
进入,选择
adb-spark-ramuser-test。点击。
添加策略
adb-spark-ramuser-test-adbpolicy。
授权RAM角色
进入,选择
adb-spark-ramrole-test。点击。
添加策略
adb-spark-ramuser-test-datapolicy。
配置AnalyticDB MySQL账户
使用管理员登录AnalyticDB MySQL控制台。
单击集群列表,进入目标集群。
单击,账户类型选择普通账号。
创建完成后,单击RAM绑定管理,绑定 RAM 用户
adb-spark-ramuser-test。点击,根据需求授予权限(例如:全局创建、查询、变更权限)。
RAM用户提交作业
完成以上所有步骤后,RAM 用户adb-spark-ramuser-test已具备策略 A定义的集群管理权限。接下来的操作演示如何使用该 RAM 用户提交作业,并通过指定 RAM 角色(具备策略 B)来安全地读写 OSS 数据。
使用RAM用户
adb-spark-ramuser-test登录AnalyticDB MySQL控制台。单击集群列表,进入目标集群,然后单击。
在编辑器上方,选择Spark引擎和对应的资源组。
编写并提交作业。
必须在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 应用配置参数说明。验证结果
单击执行SQL。作业成功运行即证明细粒度授权配置生效:RAM用户成功提交了作业,且 Spark 应用成功通过扮演角色访问了 OSS。