Apache spark Spark SQL安全注意事项

Apache spark Spark SQL安全注意事项,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,在接受和执行任意spark SQL查询时,有哪些安全注意事项 设想以下设置: hdfs上的两个文件注册为表a_secrets和b_secrets: # must only be accessed by clients with access to all of customer a' data spark.read.csv("/customer_a/secrets.csv").createTempView("a_secrets") # must only be accessed by clie

在接受和执行任意spark SQL查询时,有哪些安全注意事项

设想以下设置:

hdfs上的两个文件注册为表
a_secrets
b_secrets

# must only be accessed by clients with access to all of customer a' data
spark.read.csv("/customer_a/secrets.csv").createTempView("a_secrets")

# must only be accessed by clients with access to all of customer b's data
spark.read.csv("/customer_b/secrets.csv").createTempView("b_secrets")
对于这两个视图,我可以使用简单的hdfs文件权限来保护它们。但是假设我有以下这些表的逻辑视图,我想公开:

# only access for clients with access to customer a's account no 1
spark.sql("SELECT * FROM a_secrets WHERE account = 1").createTempView("a1_secrets")

# only access for clients with access to customer a's account no 2
spark.sql("SELECT * FROM a_secrets WHERE account = 2").createTempView("a2_secrets")


# only access for clients with access to customer b's account no 1
spark.sql("SELECT * FROM b_secrets WHERE account = 1").createTempView("b1_secrets")

# only access for clients with access to customer b's account no 2
spark.sql("SELECT * FROM b_secrets WHERE account = 2").createTempView("b2_secrets")
现在假设我收到一个任意的
(用户、通行证、查询)
集。我获得用户可以访问的帐户列表:

groups = get_groups(user, pass)
并提取用户查询的逻辑查询计划:

spark.sql(query).explain(true)
给我一个大致如下的查询计划(这个精确的查询计划是由

假设我可以解析一个逻辑查询计划来准确地确定正在访问哪些表和文件,那么授予对查询生成的数据的访问权限是否安全?我在考虑潜在的问题,比如:

  • 有没有办法在逻辑查询计划中不显示已注册表的情况下访问这些表
  • 是通过纯spark SQL加载新数据并将其注册为表的方法吗?(输入到
    spark.sql(1)
  • 用户是否可以访问任何具有副作用的sql函数(修改或访问未经筛选的数据)
  • 是否有方法纯粹通过
    spark.sql(1)
    注册UDF/执行任意代码
总结:我是否可以安全地接受任意SQL,将其注册到
df=spark.SQL(1)
,使用
df.explain(True)
分析数据访问,然后使用例如
df.collect()
返回结果

编辑:
-1月23日15:29:编辑为在TL中包含“EXPLAIN”前缀;DR您不应在Spark群集上执行任何不受信任的代码

是通过纯spark SQL加载新数据并将其注册为表的方法吗

<可以使用
sql
方法执行code>createtable,所以只要用户有权访问文件系统,他们就可以创建表

是否有方法纯粹通过spark.sql(1)注册UDF/执行任意代码

,只要它们可以控制类路径,就可以用SQL修改

spark.sql("""add jar URI""")
用户是否可以访问任何具有副作用的sql函数(修改或访问未经筛选的数据)

有效地(通过扩展上一点)

我可以安全地接受任意SQL吗


可能会对您有所帮助。霍顿的Ranger(和Cloudera的RecordService)将在spark和我的数据之间提供一个功能更全面的安全层,实际上,直接走这条路可能是个好主意。但就目前而言,我只是想更好地理解直接从用户处接受sparksql字符串的安全含义。您能否详细介绍用户如何使用spark sql查询控制类路径?用户自己不调用
spark.sql
,而只是将查询作为字符串提供,并将其传递给受控应用程序层中的
spark.sql(1)
spark.sql(““add jar URI”“”)
是有效的查询字符串。它甚至返回一个表。@jkgeyti有一个SQLAlchemy Hive方言可能对您有帮助。
spark.sql("""add jar URI""")