Spark SQL 安全注意事项

Posted

技术标签:

【中文标题】Spark SQL 安全注意事项【英文标题】:Spark SQL security considerations 【发布时间】:2017-01-23 11:59:29 【问题描述】:

在接受和执行任意 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()?

修改: - 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 安全注意事项的主要内容,如果未能解决你的问题,请参考以下文章

hive 使用同一个session执行不同的sql注意事项

Spark SQL的官网解释

Spark SQL优化之路——Hive篇

spark sql 连续登录最大天数

Web安全开发注意事项

Spark SQL 滑动窗口差分计算