当您使用 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 访问公网最佳实践。开启公网有安全风险,请谨慎操作。
鉴权方和访问方服务限制:
身份 | 支持和限制情况 |
|---|---|
鉴权方 | 支持的鉴权方:
|
访问方 | 支持的访问方:
说明 配置外部 HMS操作指导请参见配置外部 HMS。 使用 LAS Catalog 作为元数据服务的队列暂不支持。 |
通常 Hadoop 集群已默认启用 Ranger 服务并开启 Ranger on Spark 服务,以EMR On ECS 集群为例,您可前往在集群详情>服务列表>Ranger 查看 Ranger Spark Plugin 是否已开启,Ranger 服务启停和默认服务 Ranger 鉴权开启情况的详细信息请参见权限管理。
在鉴权方集群上创建集群用户,作为 Ranger 权限策略的用户单位,为用户授予合适的权限。后续访问方将使用该用户名访问鉴权方集群,并由 Ranger 服务鉴权。
以鉴权方为 EMR On ECS 集群为例,需要完成以下配置:

登录 EMR 控制台,在控制台左侧导航栏中,单击资源管理 > on ECS > 集群名称,进入具体集群详情界面,单击左侧服务列表> Spark > 服务参数页签。
查看 ranger-spark-audit.xml(Ranger Spark 审计配置文件)和 ranger-spark-security.xml (Ranger Spark 鉴权配置文件),参数说明见下方参数说明表。
ranger-spark-security.xml(Ranger Spark 鉴权配置)
参数名 | 参数值 | 参数说明 |
|---|---|---|
| true | 是否叠加 Hadoop 原生授权,一般为 false |
| 30000 | 策略拉取轮询间隔,单位毫秒,控制策略刷新频率 |
|
| Ranger Admin 服务地址,Spark 从此地址拉取权限策略 |
|
| 策略源实现类,通常保持默认值 |
|
| 策略缓存目录,离线时从本地缓存读取策略 |
|
| Ranger 中对应的 Hive Service 名称。Spark 提交任务时,Ranger Spark Plugin 会去该 Hive Service 下查找并执行对应的权限策略;填写的值即为 Ranger 控制台 HADOOP SQL 分类下的 Service 名称,通常为 default_hive。 |
ranger-spark-audit.xml(Ranger Spark 审计配置)
参数名 | 参数值 | 参数说明 |
|---|---|---|
| true | 是否开启 Ranger 审计,true 为开启 |
| false | 是否开启审计日志汇总,合并相同操作减少日志量 |
| false | 是否将审计日志写入 Solr |
| true | 是否将审计日志写入 Elasticsearch |
|
| Elasticsearch 地址,如 http://host:9200 |
|
| Elasticsearch 索引名 |
|
| Elasticsearch 认证用户名,无认证可留空 |
|
| Elasticsearch 认证密码 |
| https | 协议类型,如 http 或 https |
|
| Elasticsearch 端口,如 9200 |
| false | 是否将审计日志写入 Spark,一般为 false |
将ranger-spark-audit.xml和 ranger-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;
说明
访问方为开启了 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>
参数 | 参数说明 |
|---|---|
| 需配置为 Kyuubi Gateway 服务的 Endpoint(含端口号),您可在对应 Gateway 的详情页面获取 Endpoint 信息。 |
| Kyuubi Gateway 的网络 IP 和端口,填 Serverless Spark 队列详情页里的 Kyuubi 地址。 |
| 作业运行的队列/计算组资源名称。
|
| 引擎共享级别(Engine Share Level),Connection 表示每个连接独占一个 Spark Engine,隔离性最强。 |
| 指定本次会话使用的 Spark 版本,填队列/计算组支持的版本号。 |
| 代理用户(Proxy User),实际实际执行 Spark 作业的用户身份,即 Ranger Policy 中设置了权限的 ECS 集群用户,Ranger 按这个用户名做权限校验。 |
| Ranger Policy 中设置了权限的 ECS 集群用户,Ranger 按这个用户名做权限校验 |
| Serverless 队列用户的 AK |
| Serverless 队列用户的 SK |
vim /etc/krb5.conf 命令查看krb5.conf文件,复制文件,在 队列详情> Kerberos 认证配置 框中粘贴文件。与ECS 集群 krb5.conf 对齐,完成后点击保存。详细操作请参见登录集群和Serverless Spark 访问 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
目标集群未开启 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被禁止访问行数据
使用user2提交作业访问数据时,作业运行失败报错,查看作业日志: