为Spark Thrift Server配置并启用Ranger鉴权

Apache Ranger提供了集中式的权限管理框架。通过与Spark结合使用的Ranger Plugin,可以对Spark SQL访问数据库、表和列等进行细粒度的权限控制,从而增强数据访问的安全性。Spark Thrift Server会话支持配置Ranger Plugin来启用数据访问的权限控制。

使用限制

目前仅支持esr-2.4.1(Spark 3.3.1,Scala 2.12)及以上引擎版本、esr-3.0.1 (Spark 3.4.3, Scala 2.12)及以上引擎版本的Spark Thrift Server会话配置Ranger鉴权。

注意事项

Ranger主要负责鉴权服务,而用户身份验证则需借助如LDAP等认证服务来完成,详情请参见为Spark Thrift Server配置并启用LDAP认证

前提条件

已创建Spark Thrift Server会话,具体请参见管理Spark Thrift Server会话

操作流程

一、网络准备

在开始配置之前,必须先设置好网络,确保Serverless Spark可以与您的虚拟私有云(VPC)之间网络互通,使得Ranger Plugin能够顺利连接到您的Ranger Admin服务并获取权限信息。具体操作,请参见EMR Serverless Spark与其他VPC间网络互通

二、配置Ranger Plugin

对于希望开启Ranger鉴权功能的Spark Thrift Server会话,需首先停止该会话。在Spark配置中添加以下配置项。编辑完成后,请务必重新启动会话,以确保配置更改生效。

方式一:使用内置的Ranger Plugin

spark.emr.serverless.network.service.name  <connection_name>
spark.ranger.plugin.enabled                true
spark.jars                                 /opt/ranger/ranger-spark.jar
ranger.plugin.spark.policy.rest.url        http://<ranger_admin_ip>:<ranger_admin_port>

请根据您的实际情况替换以下信息:

  • <connection_name>网络连接中创建的连接名称。

  • <ranger_admin_ip><ranger_admin_port>:填写为Ranger Admin服务的内网IP地址和端口。如果您连接的是阿里云EMR on ECS集群的Ranger服务,<ranger_admin_ip>可填写为Master节点的内网IP地址,<ranger_admin_port>为6080。

方式二:使用自定义的Ranger Plugin

若您需要自定义Ranger Plugin,可以将自定义的Ranger Plugin上传至OSS,并使用以下参数指定自定义JAR和Class名称。

spark.jars                      oss://<bucket>/path/to/user-ranger-spark.jar
spark.ranger.plugin.class       <class_name>

参数说明如下:

  • spark.jars:填写自定义JAR的OSS路径。

  • spark.ranger.plugin.class:填写自定义Ranger Plugin的Spark扩展类名。

三、(可选)配置Ranger Audit

Ranger支持配置Audit的存储方式,例如Solr、HDFS等。Serverless Spark默认未开启Ranger Audit功能,若您有对应需求可以自行在Spark配置中增加Ranger Audit相关参数。

例如,配置连接EMR的Solr可以在Spark配置中增加以下配置信息。

xasecure.audit.is.enabled                  true
xasecure.audit.destination.solr            true
xasecure.audit.destination.solr.urls       http://<solr_ip>:<solr_port>/solr/ranger_audits
xasecure.audit.destination.solr.user       <user>
xasecure.audit.destination.solr.password   <password>

参数说明如下:

  • xasecure.audit.is.enabled:是否开启Ranger Audit。

  • xasecure.audit.destination.solr:是否将Audit存储到Solr服务当中。

  • xasecure.audit.destination.solr.urls:Solr服务的URL信息。其中<solr_ip><solr_port>需要配置Solr服务的IP地址和端口信息,其他URL信息应根据实际需求填写。

  • xasecure.audit.destination.solr.userxasecure.audit.destination.solr.password:若Solr服务开启了Basic认证,需要填写对应用户名和密码信息。

    若连接的是EMR on ECS中的Ranger,则可以在Ranger-plugin服务的ranger-spark-audit.xml配置文件中查找xasecure.audit.destination.solr.urlsxasecure.audit.destination.solr.userxasecure.audit.destination.solr.password的配置。

    image

配置成功后,若您在EMR Serverless Spark上提交了任务,则可以访问Ranger UI,并在Ranger Audit的Access标签页查看用户访问的审计信息。访问Ranger UI详情,请参见访问链接与端口

说明

仅当审计存储方式为Solr时,您才能在Ranger UI中查看审计信息。如果审计存储方式是HDFS或其他不支持直接通过Ranger UI查看的方式,则无法在Ranger UI中访问这些审计信息。

image

四、连接测试

使用Spark Beeline进行连接时,如果访问没有权限的数据库、表等资源,将会出现权限失败的错误提示。

0: jdbc:hive2://pre-emr-spark-gateway-cn-hang> create table test(id int);
Error: org.apache.hive.service.cli.HiveSQLException: Error running query: org.apache.kyuubi.plugin.spark.authz.AccessControlException: Permission denied: user [test] does not have [create] privilege on [database=testdb/table=test]
	at org.apache.spark.sql.hive.thriftserver.HiveThriftServerErrors$.runningQueryError(HiveThriftServerErrors.scala:44)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation.org$apache$spark$sql$hive$thriftserver$SparkExecuteStatementOperation$$execute(SparkExecuteStatementOperation.scala:325)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.$anonfun$run$2(SparkExecuteStatementOperation.scala:230)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at org.apache.spark.sql.hive.thriftserver.SparkOperation.withLocalProperties(SparkOperation.scala:79)
	at org.apache.spark.sql.hive.thriftserver.SparkOperation.withLocalProperties$(SparkOperation.scala:63)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation.withLocalProperties(SparkExecuteStatementOperation.scala:43)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.run(SparkExecuteStatementOperation.scala:230)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.run(SparkExecuteStatementOperation.scala:225)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2.run(SparkExecuteStatementOperation.scala:239)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)
说明
  • 在进行权限测试时,请特别注意Ranger默认添加的一些权限策略,例如,所有用户均可切换数据库、创建数据库,以及数据库和表的拥有者对其资源享有所有权限等。建议由用户A创建相关资源(如数据库、表),随后使用用户B进行权限验证。如果仅使用同一用户进行测试,可能会由于拥有者权限策略的影响,而错误地认为某些权限设置未生效。

  • 如果Ranger Admin服务的配置存在错误,可能会导致SQL虽执行成功且不报权限错误,但实际上并未生效。