Considerações de segurança do Spark SQL

Quais são as considerações de segurança ao aceitar e executar consultas SQL spark arbitrárias?

Imagine a seguinte configuração:

Dois arquivos em hdfs são registrados como tabelasa_secrets eb_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")

Eu consegui proteger essas duas visualizações usando permissões simples de arquivo hdfs. Mas digamos que tenho as seguintes visualizações lógicas dessas tabelas que gostaria de expor:

# 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")

Agora assuma que eu recebo um(user, pass, query) conjunto. Eu recebo uma lista de contas que o usuário pode acessar:

groups = get_groups(user, pass)

e extraia o plano de consulta lógica da consulta do usuário:

spark.sql(query).explain(true)

fornecendo um plano de consulta ao longo das linhas de (este plano de consulta exato é composto)

== 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 ...

Supondo que eu possa analisar um plano de consulta lógica para determinar exatamente quais tabelas e arquivos estão sendo acessados, é seguro conceder acesso aos dados produzidos pela consulta? Estou pensando em problemas em potencial como:

Existem maneiras de acessar tabelas registradas sem que elas apareçam em um plano de consulta lógica?Existem maneiras de carregar novos dados e registrá-los como tabelas através do SQL puro do spark? (entrada paraspark.sql(1))?Os usuários têm acesso a quaisquer funções sql com efeitos colaterais (que modificam ou acessam dados não autorizados)?Existem maneiras de registrar UDFs / executar código arbitrário apenas atravésspark.sql(1)?

Para resumir: Posso aceitar com segurança o SQL arbitrário, registre-o nodf = spark.sql(1), analise o acesso a dados usandodf.explain(True)e, em seguida, retorne resultados usando, por exemplo,df.collect()?

Editar% s: - 23 de janeiro 15:29: editado para incluir um prefixo "EXPLAIN" em

questionAnswers(1)

yourAnswerToTheQuestion