kyuubi-spark-authz plugin


发布于 2024-05-20 / 131 阅读 / 0 评论 /
kyuubi提供了一种ranger plugin,用于对spark任务的鉴权

kyuubi是一种大数据任务执行网关,代理各种执行引擎,处理任务的提交。

kyuubi提供了各种扩展能力,其中鉴权就是其扩展能力之一,比如其提供的kyuubi-spark-authz插件,本身就是一种ranger plugin,用于spark的鉴权。

官方文档如下:https://kyuubi.readthedocs.io/en/master/security/authorization/spark/overview.html

1.authz的用法

用法上需要关注两点:

(1)在spark任务进程的classpath中添加kyuubi-spark-authz jar包。

(2)在启动spark任务时,添加spark.sql.extensions参数,配置为org.apache.kyuubi.plugin.spark.authz.ranger.RangerSparkExtension

2.插件启动原理

根据spakr-3.4.2、ranger-2.3.0和kyuubi-1.10.0版本的源码,启动过程如下:

# 第一步:SparkSession的初始化
SparkSession在初始化过程中会调用applyExtensions方法来创建对一个的Extension对象
new SparkSession
    SparkSession.applyExtensions()
        // extensions类由参数spark.sql.extensions决定
        // 根据配置的类,通过反射依次生成SparkSessionExtension对象

# 第二步:RangerSparkExtension初始化
RangerSparkExtension初始化过程中会附带初始化org.apache.kyuubi.plugin.spark.authz.ranger.RuleAuthorization。并将RuleAuthorization注入到SparkSession中。

# 第三步:sparksql请求到来
当有sparksql请求到来时,会调用RuleAuthorization#checkPrivileges进行鉴权
RuleAuthorization#checkPrivileges(SparkSession, LogicalPlan)
    auditHandler = new SparkRangerAuditHandler // SparkRangerAuditHandler是RangerAccessResultProcessor的子类
    ugi = getAuthzUgi(spark.sparkContext)
    SparkRangerAdminPlugin.verify(accessRequests, auditHandler) // SparkRangerAdminPlugin是RangerBasePlugin的子类
         SparkRangerAdminPlugin.isAccessAllowed(accessRequests, auditHandler)

可以看到,所有的authz插件类的初试化都与SparkSession和SparkSQL相关。如果是通过SparkContext提交的Spark jar任务或者是scala任务,则不会启动对应的SparkSessionExtension,更不会有鉴权方法的调用。

SparkSession是比SparkContext更高级的API,SparkSession中引用了SparkContext对象。

3.审计日志输出

在第二节中,我们可以得到以下几点零零碎碎的信息:

(1)spark.sql.extensions配置只对spark sql有效。

(2)kyuubi-spark-authz插件只对SparkSession有效。

注意,以上只是充分条件,而非必要条件。

而审计日志是伴随着鉴权过程的,只有发生了鉴权,才有可能会发生审计日志的输出。也就是我们只能配置sparksql任务的审计日志输出,无论是spark-submit提交的sparksql任务,还是spark-sql命令提交的sparksql任务。

现在有一个场景,如果spark jar任务中有sparksession的初始化,并通过sparksession进行sparksql任务的执行,那会不会有审计日志的输出呢?答案是:会有的。