接受和执行任意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")
现在假设我收到任意(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(1)
)?spark.sql(1)
注册UDF /执行任意代码?总结:我可以安全地接受任意SQL,将其注册到df = spark.sql(1)
,使用df.explain(True)
分析数据访问,然后使用例如df.collect()
?
编辑: - 23 Jan 15:29:编辑为在
中包含“EXPLAIN”前缀答案 0 :(得分:2)
TL; DR 您永远不应在Spark群集上执行任何不受信任的代码。
是否可以通过纯Spark SQL加载新数据并将其注册为表格?
是即可。 CREATE TABLE
可以使用sql
方法执行,因此,只要用户有权访问文件系统,他们就可以创建表。
有没有办法只通过spark.sql(1)注册UDF /执行任意代码?
是,只要他们可以控制类路径,可以用SQL修改。
spark.sql("""add jar URI""")
用户是否可以访问任何带副作用的sql函数(修改或访问非协作数据)?
有效是(通过前一点的扩展)。
我可以安全地接受任意SQL,
否强>