You need to enable JavaScript to run this app.
文档中心
E-MapReduce

E-MapReduce

复制全文
下载 pdf
Spark
Serverless Spark 集成 Ranger 鉴权
复制全文
下载 pdf
Serverless Spark 集成 Ranger 鉴权

当您使用 EMR Serverless 队列计算资源运行作业时,您可能会需要对数据库、表和列等进行细粒度的权限控制访问,从而增强数据访问的安全性。本文为您提供一种实践方法:鉴权方开启 Ranger 服务,并配置权限管理,访问方提交作业,包含用户信息,由 Ranger 服务对访问方用户进行鉴权。

实践概述

鉴权方集群需开启 Ranger 服务并配置用户及访问权限策略;访问方队列提交作业时,在 Spark 参数中指定鉴权方集群的用户名,即可被鉴权方集群的 Ranger 服务识别并完成鉴权。
为确保 Ranger 鉴权服务能够对 Spark 访问方进行权限管控并留存审计日志,需要在 Spark 侧配置 Ranger 服务及相关参数。配置方法可参考安装和配置 Kyuubi Spark AuthZ 插件
本文为您提供一种更方便的确认配置参数的方法:鉴权方所在的 Hadoop 集群通常已默认启用 Ranger on Spark 服务,只需将该服务的配置参数统一加上 spark. 前缀,写入 EMR Serverless Spark 配置参数,即可利用半托管集群参数快速、准确地完成访问方 Spark 侧的 Ranger 参数配置。

使用限制

使用 EMR Serverless Spark 集成 Ranger 服务的鉴权功能时,要求:

  • EMR Serverless 队列与 Ranger 服务网络联通,支持通过 VPC 网络或公网 IP 进行访问。

    说明

    如果您希望基于公网 IP 来连接,需要在计算组创建完成后,手动绑定公网 IP,详细操作请参见EMR Serverless 访问公网最佳实践。开启公网有安全风险,请谨慎操作。

  • 鉴权方和访问方服务限制:

    身份

    支持和限制情况

    鉴权方

    支持的鉴权方:

    • EMR on ECS 集群开启的 Ranger 服务。
    • 本地 IDC 集群开启的 Ranger 服务。

    访问方

    支持的访问方:

    • 开启了外部 HMS 的 EMR Serverless 队列的通用计算组提交的 Spark 作业 。
    • 开启了外部 HMS 的 **** EMR Serverless 队列 Kyuubi Gateway 提交的 Spark 作业 (只适用于鉴权方未开启 Kerberos 服务的情况)。

    说明

    配置外部 HMS操作指导请参见配置外部 HMS

    使用 LAS Catalog 作为元数据服务的队列暂不支持。

鉴权方配置

开启 Ranger on Spark 服务

通常 Hadoop 集群已默认启用 Ranger 服务并开启 Ranger on Spark 服务,以EMR On ECS 集群为例,您可前往在集群详情>服务列表>Ranger 查看 Ranger Spark Plugin 是否已开启,Ranger 服务启停和默认服务 Ranger 鉴权开启情况的详细信息请参见权限管理
Image

添加用户并配置权限策略

在鉴权方集群上创建集群用户,作为 Ranger 权限策略的用户单位,为用户授予合适的权限。后续访问方将使用该用户名访问鉴权方集群,并由 Ranger 服务鉴权。
以鉴权方为 EMR On ECS 集群为例,需要完成以下配置:

  1. 添加用户信息,详细操作说明请参见用户管理
    Image
  2. 为用户配置权限。
    1. 集群管理界面>访问链接>点击 Ranger UI 的访问链接 > 进入 Ranger Admin UI 界面。
    2. 输入 Ranger Admin UI 的登录密码。登录密码获取方式详见:Ranger 概述
    3. 进入 Ranger admin>Access Manager>HADOOP SQL>点击 HADOOP SQL 栏的服务名,例如 default_hive,进入权限编辑界面。
      Image
    4. 配置数据访问策略 Ranger Policy。
      Image
    5. 将目标用户添加到 Ranger Policy 中。
      Image

访问方配置

通用配置:Spark 配置 Ranger 参数

  1. 登录 EMR 控制台,在控制台左侧导航栏中,单击资源管理 > on ECS > 集群名称,进入具体集群详情界面,单击左侧服务列表> Spark > 服务参数页签。

  2. 查看 ranger-spark-audit.xml(Ranger Spark 审计配置文件)ranger-spark-security.xml (Ranger Spark 鉴权配置文件),参数说明见下方参数说明表。
    Image
    ranger-spark-security.xml(Ranger Spark 鉴权配置)

    参数名

    参数值

    参数说明

    xasecure.add-hadoop-authorization

    true

    是否叠加 Hadoop 原生授权,一般为 false

    ranger.plugin.spark.policy.pollIntervalMs

    30000

    策略拉取轮询间隔,单位毫秒,控制策略刷新频率

    ranger.plugin.spark.policy.rest.url

    http://<RANGER_ADMIN_HOST>:6080

    Ranger Admin 服务地址,Spark 从此地址拉取权限策略

    ranger.plugin.spark.policy.source.impl

    org.apache.ranger.admin.client.RangerAdminRESTClient

    策略源实现类,通常保持默认值

    ranger.plugin.spark.policy.cache.dir

    /etc/ranger/<service-name>/policycache

    策略缓存目录,离线时从本地缓存读取策略

    ranger.plugin.spark.service.name

    <your-hive-service-name>

    Ranger 中对应的 Hive Service 名称。Spark 提交任务时,Ranger Spark Plugin 会去该 Hive Service 下查找并执行对应的权限策略;填写的值即为 Ranger 控制台 HADOOP SQL 分类下的 Service 名称,通常为 default_hive。

    ranger-spark-audit.xml(Ranger Spark 审计配置)

    参数名

    参数值

    参数说明

    xasecure.audit.is.enabled

    true

    是否开启 Ranger 审计,true 为开启

    xasecure.audit.provider.summary.enabled

    false

    是否开启审计日志汇总,合并相同操作减少日志量

    xasecure.audit.destination.solr

    false

    是否将审计日志写入 Solr

    xasecure.audit.destination.elasticsearch

    true

    是否将审计日志写入 Elasticsearch

    xasecure.audit.destination.elasticsearch.urls

    http://<ES_HOST>:<ES_PORT>

    Elasticsearch 地址,如 http://host:9200

    xasecure.audit.destination.elasticsearch.index

    <your-index-name>

    Elasticsearch 索引名

    xasecure.audit.destination.elasticsearch.user

    <your-es-user>

    Elasticsearch 认证用户名,无认证可留空

    xasecure.audit.destination.elasticsearch.password

    <your-es-password>

    Elasticsearch 认证密码

    xasecure.audit.destination.elasticsearch.protocol

    https

    协议类型,如 http 或 https

    xasecure.audit.destination.elasticsearch.port

    <ES_PORT>

    Elasticsearch 端口,如 9200

    xasecure.audit.destination.spark

    false

    是否将审计日志写入 Spark,一般为 false

  3. ranger-spark-audit.xmlranger-spark-security.xml 的参数统一加上 spark. 前缀,配置到 EMR Serverless Spark 作业或 EMR Serverless Kyuubi Gataway 参数中,执行作业,即可完成 Spark 鉴权和审计。

    说明

    Kyuubi Gataway Spark 配置入口:队列详情页>Gateway 管理>Gataway 详情页>参数配置。详细信息请参见创建与管理 Kyuubi Gateway

    Spark 参数示例:

    -- Ranger Admin(管理端)服务地址,Spark 从这里拉取权限策略 
    set spark.ranger.plugin.spark.policy.rest.url=http://<RANGER_ADMIN_HOST>:<RANGER_PORT>; 
     
    -- Ranger 中对应的 Spark/Hive 服务名,策略按此名称匹配 
    set spark.ranger.plugin.spark.service.name=<RANGER_SERVICE_NAME>; 
     
    -- Ranger 策略拉取间隔(毫秒),5000ms = 每 5 秒刷新一次策略 
    set spark.ranger.plugin.spark.policy.pollIntervalMs=5000; 
     
    -- Ranger 策略拉取实现类,使用 REST API 方式从 Ranger Admin 获取策略 
    set spark.ranger.plugin.spark.policy.source.impl=org.apache.ranger.admin.client.RangerAdminRESTClient; 
     
    -- Ranger 策略本地缓存目录,网络中断时可从缓存读取策略 
    set spark.ranger.plugin.spark.policy.cache.dir=/etc/ranger/<RANGER_SERVICE_NAME>/policycache; 
     
    -- 开启 Ranger 审计日志功能 
    set spark.xasecure.audit.is.enable=true; 
     
    -- 开启审计日志写入 Elasticsearch(分布式搜索引擎)目的地 
    set spark.xasecure.audit.destination.elasticsearch=true; 
     
    -- Elasticsearch 服务地址(IP 或域名) 
    set spark.xasecure.audit.destination.elasticsearch.urls=<ES_HOST>; 
     
    -- 审计日志写入的 Elasticsearch 索引名 
    set spark.xasecure.audit.destination.elasticsearch.index=<ES_INDEX_NAME>; 
     
    -- 连接 Elasticsearch 的用户名 
    set spark.xasecure.audit.destination.elasticsearch.user=<ES_USERNAME>; 
     
    -- 审计日志写入 Elasticsearch 的密码 
    set spark.xasecure.audit.destination.elasticsearch.password=<YOUR_ES_PASSWORD>; 
     
    -- 审计日志与 Elasticsearch 通信协议(http 或 https) 
    set spark.xasecure.audit.destination.elasticsearch.protocol=http; 
     
    -- Elasticsearch 服务端口 
    set spark.xasecure.audit.destination.elasticsearch.port=9200;
    

场景1:队列的 Kyuubi Gataway 提交作业

说明

访问方为开启了 Kyuubi Gataway 的通用计算组时,鉴权方需关闭 Kerberos 服务。

访问未开启 Kerberos 的 EMR on ECS 集群:
通过 Beeline 连接 EMR Serverless 队列的 Kyuubi Gateway ,并提交作业,关于 Kyuubi Gateway 的详细信息请参见连接 Kyuubi Gateway 并提交作业

beeline -u "jdbc:hive2://192.168.214.X:10009/;?queue_name=<YOUR_QUEUE_NAME>;kyuubi.engine.share.level=connection;kyuubi.session.spark.version=4.1;hive.server2.proxy.user=<YOUR_ECS_USERNAME>" -n <YOUR_AK> -p <YOUR_SK>

参数

参数说明

-u

需配置为 Kyuubi Gateway 服务的 Endpoint(含端口号),您可在对应 Gateway 的详情页面获取 Endpoint 信息。

192.168.214.X:10009

Kyuubi Gateway 的网络 IP 和端口,填 Serverless Spark 队列详情页里的 Kyuubi 地址。

queue_name

作业运行的队列/计算组资源名称。
格式要求为:

queue_name=${queueName}-${warehouseName}
其中:

  • warehouseName:必须是通用计算组。
  • 如果只写了queueName,没有写后面的 warehouseName,默认会用 Default 计算组。
  • 如果 queueName 也没写,默认走公共队列。

kyuubi.engine.share.level=connection

引擎共享级别(Engine Share Level),Connection 表示每个连接独占一个 Spark Engine,隔离性最强。

kyuubi.session.spark.version=4.1

指定本次会话使用的 Spark 版本,填队列/计算组支持的版本号。

hive.server2.proxy.user

代理用户(Proxy User),实际实际执行 Spark 作业的用户身份,即 Ranger Policy 中设置了权限的 ECS 集群用户,Ranger 按这个用户名做权限校验。

<YOUR_ECS_USERNAME>

Ranger Policy 中设置了权限的 ECS 集群用户,Ranger 按这个用户名做权限校验

<YOUR_AK>

Serverless 队列用户的 AK

<YOUR_AK>

Serverless 队列用户的 SK

场景2:目标集群开启 Kerberos,队列的通用计算组提交作业,

  1. 配置队列的 Kerberos 认证信息。登录 EMR on ECS 集群主节点,通过vim /etc/krb5.conf 命令查看krb5.conf文件,复制文件,在 队列详情> Kerberos 认证配置 框中粘贴文件。与ECS 集群 krb5.conf 对齐,完成后点击保存。详细操作请参见登录集群Serverless Spark 访问 Kerberos 集群
    Image
  2. 提交作业,以通过 EMR Serverless 队列通用计算组访问开启了 Kerberos 的集群为例,示例作业:
    -- Kerberos 主体(Principal),格式为 用户名@REALM,用于身份认证 
    set spark.kerberos.principal=<YOUR_KERBEROS_PRINCIPAL>; 
     
    -- keytab(密钥表文件)在 TOS(对象存储)中的路径,Spark 用它自动完成 Kerberos 认证,无需手动 kinit 
    set serverless.spark.kerberos.keytab.path=tos://<your-bucket>/<path>/<your-username>.keytab; 
     
    -- 开启 Hive Metastore(元数据服务)的 SASL(安全认证层)认证,Kerberos 场景必须设为 true 
    set spark.hive.metastore.sasl.enabled=true; 
     
    -- HMS(Hive Metastore Service)服务的 Kerberos 主体,用于 Spark 与 HMS 之间的身份互信 
    set spark.hive.metastore.kerberos.principal=hive/<HMS_HOST>@<REALM>; 
     
    -- 仅 Driver(驱动节点)走跨 VPC(私有网络)通道,Executor(执行节点)不走,节省子网 IP 资源 
    set serverless.cross.vpc.driver.only.enabled = true; 
     
    -- Ranger Admin(管理端)服务地址,Spark 插件从这里拉取权限策略 
    set spark.ranger.plugin.spark.policy.rest.url=http://<RANGER_HOST>:<RANGER_PORT>; 
     
    -- 开启跨 VPC DNS 解析,确保 Serverless Spark 能访问外部集群的内网域名 
    set serverless.cross.vpc.dns.resolve.enabled = true; 
     
    -- Ranger 中对应的 Spark/Hive 服务名,策略按此名称匹配 
    set spark.ranger.plugin.spark.service.name=<RANGER_SERVICE_NAME>; 
     
    -- Ranger 策略拉取间隔(毫秒),5000ms = 每 5 秒刷新一次策略 
    set spark.ranger.plugin.spark.policy.pollIntervalMs=5000; 
     
    -- 开启 Ranger 审计日志功能 
    set spark.xasecure.audit.is.enable=true; 
     
    -- 审计日志写入 Elasticsearch(分布式搜索引擎)的密码 
    set spark.xasecure.audit.destination.elasticsearch.password=<YOUR_ES_PASSWORD>; 
     
    -- Elasticsearch 服务端口 
    set spark.xasecure.audit.destination.elasticsearch.port=9200; 
     
    -- 加载 Ranger Spark 鉴权扩展插件,SQL 执行前触发权限校验 
    set spark.sql.extensions=org.apache.kyuubi.plugin.spark.authz.ranger.RangerSparkExtension; 
     
    -- 审计日志与 Elasticsearch 通信协议(http 或 https) 
    set spark.xasecure.audit.destination.elasticsearch.protocol=http; 
     
    -- 开启审计日志写入 Elasticsearch 目的地 
    set spark.xasecure.audit.destination.elasticsearch=true; 
     
    -- Elasticsearch 服务地址(IP 或域名) 
    set spark.xasecure.audit.destination.elasticsearch.urls=<ES_HOST>; 
     
    -- 审计日志写入的 Elasticsearch 索引名 
    set spark.xasecure.audit.destination.elasticsearch.index=<ES_INDEX_NAME>; 
     
    -- Ranger 策略拉取实现类,使用 REST API(接口)方式从 Ranger Admin 获取策略 
    set spark.ranger.plugin.spark.policy.source.impl=org.apache.ranger.admin.client.RangerAdminRESTClient; 
     
    -- Ranger 策略本地缓存目录,网络中断时可从缓存读取策略 
    set spark.ranger.plugin.spark.policy.cache.dir=/etc/ranger/<RANGER_SERVICE_NAME>/policycache; 
     
    -- 连接 Elasticsearch 的用户名 
    set spark.xasecure.audit.destination.elasticsearch.user=<ES_USERNAME>; 
     
    -- 测试 SQL:查看当前可访问的所有数据库 
    show databases
    

场景3:目标集群未开启 Kerberos,队列的通用计算组提交作业

  1. 目标集群未开启 Kerberos 时,需在 Spark 参数中指定服务 User,核心参数:

    -- Driver(驱动节点)以此 Spark 用户身份运行 ,Ranger 按此用户名鉴权 
    spark.kubernetes.driverEnv.SPARK_USER=<YOUR_ECS_USERNAME>
    
    -- Executor(执行节点)以此 Spark 用户身份运行,与 Driver 保持一致 
    spark.executorEnv.SPARK_USER=<YOUR_ECS_USERNAME>
    
    -- Driver(驱动节点)以此 Hadoop 用户身份运行,Ranger 按此用户名鉴权 
    spark.kubernetes.driverEnv.HADOOP_USER_NAME=<YOUR_ECS_USERNAME>
    
    -- Executor(执行节点)以此 Hadoop 用户身份运行 ,与 Driver 保持一致 
    spark.executorEnv.HADOOP_USER_NAME=<YOUR_ECS_USERNAME>
    

    示例作业:

    -- Ranger Admin(管理端)服务地址,Spark 插件从这里拉取权限策略 
    set spark.ranger.plugin.spark.policy.rest.url=http://<RANGER_HOST>:<RANGER_PORT>; 
     
    -- 开启跨 VPC(私有网络)DNS 解析,确保 Serverless Spark 能访问外部集群域名 
    set serverless.cross.vpc.dns.resolve.enabled = true; 
     
    -- Ranger 中对应的 Spark/Hive 服务名,策略按此名称匹配 
    set spark.ranger.plugin.spark.service.name=<RANGER_SERVICE_NAME>; 
     
    -- Driver(驱动节点)以此 Hadoop 用户身份运行,Ranger 按此用户名鉴权 
    set spark.kubernetes.driverEnv.HADOOP_USER_NAME=<YOUR_ECS_USERNAME>; 
     
    -- Executor(执行节点)以此 Spark 用户身份运行,与 Driver 保持一致 
    set spark.executorEnv.SPARK_USER=<YOUR_ECS_USERNAME>; 
     
    -- Ranger 策略拉取间隔(毫秒),5000ms = 每 5 秒刷新一次策略 
    set spark.ranger.plugin.spark.policy.pollIntervalMs=5000; 
     
    -- 开启 Ranger 审计日志功能 
    set spark.xasecure.audit.is.enable=true; 
     
    -- 审计日志写入 Elasticsearch(分布式搜索引擎)的密码 
    set spark.xasecure.audit.destination.elasticsearch.password=<YOUR_ES_PASSWORD>; 
     
    -- Elasticsearch 服务端口 
    set spark.xasecure.audit.destination.elasticsearch.port=9200; 
     
    -- 加载 Ranger Spark 鉴权扩展插件,SQL 执行前触发权限校验 
    set spark.sql.extensions=org.apache.kyuubi.plugin.spark.authz.ranger.RangerSparkExtension; 
     
    -- Executor(执行节点)以此 Hadoop 用户身份运行 
    set spark.executorEnv.HADOOP_USER_NAME=<YOUR_ECS_USERNAME>; 
     
    -- 审计日志与 Elasticsearch 通信协议(http 或 https) 
    set spark.xasecure.audit.destination.elasticsearch.protocol=http; 
     
    -- 开启审计日志写入 Elasticsearch 目的地 
    set spark.xasecure.audit.destination.elasticsearch=true; 
     
    -- Elasticsearch 服务地址(IP 或域名) 
    set spark.xasecure.audit.destination.elasticsearch.urls=<ES_HOST>; 
     
    -- 审计日志写入的 Elasticsearch 索引名 
    set spark.xasecure.audit.destination.elasticsearch.index=<ES_INDEX_NAME>; 
     
    -- Ranger 策略拉取实现类,使用 REST API(接口)方式从 Ranger Admin 获取策略 
    set spark.ranger.plugin.spark.policy.source.impl=org.apache.ranger.admin.client.RangerAdminRESTClient; 
     
    -- Driver(驱动节点)以此 Spark 用户身份运行 
    set spark.kubernetes.driverEnv.SPARK_USER=<YOUR_ECS_USERNAME>; 
     
    -- Ranger 策略本地缓存目录,网络中断时可从缓存读取策略 
    set spark.ranger.plugin.spark.policy.cache.dir=/etc/ranger/<RANGER_SERVICE_NAME>/policycache; 
     
    -- 连接 Elasticsearch 的用户名. 为了审计日志记录吗 
    set spark.xasecure.audit.destination.elasticsearch.user=<ES_USERNAME>; 
     
    -- 测试 SQL:查询 test_spark_copy 库下 hivezmn 表的所有数据 
    select * from test.hivedb;
    

验证结果

Ranger Policy 中,user2被禁止访问行数据
Image
使用user2提交作业访问数据时,作业运行失败报错,查看作业日志:
Image

最近更新时间:2026.08.03 15:17:23
这个页面对您有帮助吗?
有用
有用
无用
无用