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