Spark SQL安全注意事项

时间:2017-01-23 11:59:29

标签: apache-spark pyspark apache-spark-sql pyspark-sql

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

想象一下以下设置:

hdfs上的两个文件被注册为表a_secretsb_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")

现在假设我收到任意(user, pass, query)集。我得到了一个用户可以访问的帐户列表:

groups = get_groups(user, pass)

并提取用户查询的逻辑查询计划:

spark.sql(query).explain(true)

给我一​​个查询计划(这个确切的查询计划已经完成)

== Analyzed Logical Plan ==
account: int, ... more fields
Project [account#0 ... more fields]
+- SubqueryAlias a1_secrets
   +- Relation [... more fields]
      +- Join Inner, (some_col#0 = another_col#67)
         :- SubqueryAlias a2_secrets
         :  +- Relation[... more fields] csv
== Physical Plan ==
... InputPaths: hdfs:/customer_a/secrets.csv ...

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

  • 是否有方法可以访问已注册的表,而不会显示在逻辑查询计划中?
  • 是否可以通过纯Spark SQL加载新数据并将其注册为表格? (输入spark.sql(1))?
  • 用户是否可以访问任何带副作用的sql函数(修改或访问非协作数据)?
  • 有没有办法只通过spark.sql(1)注册UDF /执行任意代码?

总结:我可以安全地接受任意SQL,将其注册到df = spark.sql(1),使用df.explain(True)分析数据访问,然后使用例如df.collect()

编辑: - 23 Jan 15:29:编辑为在

中包含“EXPLAIN”前缀

1 个答案:

答案 0 :(得分:2)

TL; DR 您永远不应在Spark群集上执行任何不受信任的代码。

  

是否可以通过纯Spark SQL加载新数据并将其注册为表格?

即可。 CREATE TABLE可以使用sql方法执行,因此,只要用户有权访问文件系统,他们就可以创建表。

  

有没有办法只通过spark.sql(1)注册UDF /执行任意代码?

,只要他们可以控制类路径,可以用SQL修改。

spark.sql("""add jar URI""")
  

用户是否可以访问任何带副作用的sql函数(修改或访问非协作数据)?

有效(通过前一点的扩展)。

  

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