Spark SQL 安全注意事项
Posted
技术标签:
【中文标题】Spark SQL 安全注意事项【英文标题】:Spark SQL security considerations 【发布时间】:2017-01-23 11:59:29 【问题描述】:在接受和执行任意 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加载新数据并将其注册为表? (输入到spark.sql(1)
)?
用户是否可以访问任何具有副作用(修改或访问未经授权的数据)的 sql 函数?
有没有办法纯粹通过spark.sql(1)
注册UDF/执行任意代码?
总结一下:我能否安全地接受任意 SQL,将其注册到 df = spark.sql(1)
,使用 df.explain(True)
分析数据访问,然后使用例如返回结果df.collect()
?
修改: - 1 月 23 日 15:29:编辑在
中包含“EXPLAIN”前缀【问题讨论】:
This blog post 可能会对您有所帮助。 Horton 的 Ranger(和 Cloudera 的 RecordService)将在 spark 和我的数据之间提供功能更全面的安全层,实际上,直接走这条路可能是个好主意。但就目前而言,我只是想更好地了解直接从用户那里接受 sparksql 字符串的安全隐患。 【参考方案1】:TL;DR永远不要在 Spark 集群上执行任何不受信任的代码。
有没有办法通过纯spark SQL加载新数据并将其注册为表?
是的。 CREATE TABLE
可以使用sql
方法执行,因此只要用户有权访问文件系统,他们就可以创建表。
有没有办法纯粹通过 spark.sql(1) 注册 UDF/执行任意代码?
可以,只要能控制classpath,可以用SQL修改。
spark.sql("""add jar URI""")
用户是否可以访问任何具有副作用(修改或访问未经授权的数据)的 sql 函数?
实际上是(通过上一点的扩展)。
我可以安全地接受任意 SQL,
否。
【讨论】:
您能否详细说明用户如何使用 spark sql 查询来控制类路径?用户不自己调用spark.sql
,而只是将查询作为字符串提供,然后在受控应用层中将其传递给spark.sql(1)
。
spark.sql("""add jar URI""")
是一个有效的查询字符串。它甚至返回一个表格。
@jkgeyti 有一种 SQLAlchemy Hive 方言可能对您有所帮助。以上是关于Spark SQL 安全注意事项的主要内容,如果未能解决你的问题,请参考以下文章