Segurança - Spark
Visão geral
O chart tdp-spark concentra a segurança principalmente na forma como o Spark acessa armazenamento S3/S3A e como valores sensíveis são fornecidos à configuração.
Os valores de S3/S3A devem ser tratados como placeholders em arquivos versionados e fornecidos por Secrets ou ferramentas externas.
A ideia prática é simples: Spark precisa de endpoint, credenciais e permissões para ler e gravar dados; a documentação deve mostrar onde esses valores entram, mas não deve versionar segredos reais.
Modos de acesso a armazenamento
| Modo | Onde configurar | Uso típico |
|---|---|---|
spark.sparkConf | Chaves spark.hadoop.fs.s3a.* | Propriedades diretamente repassadas ao Spark |
tdp-spark.hadoopConfig | Chaves fs.s3a.* | Renderização de core-site.xml pelo wrapper TDP |
tdp-spark.customSparkConfig.properties | Linhas de spark-defaults.conf | Defaults adicionais usados por clientes Spark |
Use apenas placeholders em arquivos versionados.
Forneça valores reais por arquivo privado de valores, Secret ou mecanismo externo de gestão de segredos.
Pré-requisitos
- Endpoint S3/S3A acessível a partir dos pods Spark.
- Credenciais com permissão adequada no bucket ou prefixo usado pelos jobs.
- Bucket ou warehouse criado antes da execução dos pipelines.
- Configuração de TLS/HTTP coerente com o endpoint usado.
- NetworkPolicy permitindo tráfego dos pods Spark até o serviço de armazenamento.
Credenciais S3/S3A
As credenciais podem ser informadas via spark.sparkConf quando o ambiente exigir que o Spark receba as chaves como propriedades spark.hadoop.*:
spark:
sparkConf:
"spark.hadoop.fs.s3a.endpoint": "http://<S3_ENDPOINT>:<S3_PORT>"
"spark.hadoop.fs.s3a.access.key": "<ACCESS_KEY>"
"spark.hadoop.fs.s3a.secret.key": "<SECRET_KEY>"
"spark.hadoop.fs.s3a.path.style.access": "true"
"spark.hadoop.fs.s3a.connection.ssl.enabled": "false"
Não use credenciais reais nesse exemplo.
Substitua os placeholders por valores vindos de mecanismo seguro no processo de instalação.
Configuração do core-site.xml via hadoopConfig
O bloco tdp-spark.hadoopConfig é renderizado pelo chart como core-site.xml.
Esse arquivo é lido pelo Hadoop antes de muitos defaults do Spark, por isso é útil para propriedades de filesystem e autenticação Hadoop.
Modelo:
tdp-spark:
hadoopConfig:
"fs.s3a.endpoint": "http://<S3_ENDPOINT>:<S3_PORT>"
"fs.s3a.access.key": "<ACCESS_KEY>"
"fs.s3a.secret.key": "<SECRET_KEY>"
"fs.s3a.path.style.access": "true"
O chart também usa esse bloco para configurações como autenticação Hadoop simples, fs.defaultFS e parâmetros S3A.
Valide o conjunto final com os valores aplicados no ambiente.
Configuração do spark-defaults.conf via customSparkConfig
O bloco tdp-spark.customSparkConfig.properties é renderizado como spark-defaults.conf.
Use esse caminho para defaults adicionais do Spark, como event log, Ivy local, propriedades Hadoop e ajustes de S3A.
Modelo:
tdp-spark:
customSparkConfig:
properties: |
spark.hadoop.fs.s3a.endpoint http://<S3_ENDPOINT>:<S3_PORT>
spark.hadoop.fs.s3a.access.key <ACCESS_KEY>
spark.hadoop.fs.s3a.secret.key <SECRET_KEY>
spark.hadoop.fs.s3a.path.style.access true
Mantenha senhas, access keys e secret keys fora do repositório.
Jupyter e Airflow
As integrações com Jupyter e Airflow podem carregar defaults Spark que apontam para o master e para configurações de execução.
Se esses clientes acessarem S3/S3A diretamente, eles também precisam receber as propriedades e credenciais necessárias de forma segura.
A configuração de cliente não substitui a proteção das credenciais.
Revise os valores aplicados em tdp-spark.integration.jupyter.sparkConfig e tdp-spark.integration.airflow.sparkConfig antes de expor notebooks ou DAGs a usuários finais.
Parâmetros principais
| Parâmetro | Papel | Quando alterar |
|---|---|---|
spark.sparkConf | Define propriedades Spark e spark.hadoop.* | Quando o runtime Spark precisa receber propriedades diretamente |
tdp-spark.hadoopConfig | Renderiza core-site.xml | Quando a configuração Hadoop/S3A deve ser compartilhada pelos pods |
tdp-spark.customSparkConfig.properties | Renderiza spark-defaults.conf | Quando clientes e jobs precisam de defaults adicionais |
tdp-spark.integration.jupyter.sparkConfig | Defaults Spark para Jupyter | Quando notebooks submetem jobs ao cluster Spark |
tdp-spark.integration.airflow.sparkConfig | Defaults Spark para Airflow | Quando DAGs submetem jobs ao cluster Spark |
Solução de problemas
| Situação | O que verificar |
|---|---|
| Jobs Spark falham com erro de acesso S3 | Endpoint, access key, secret key e permissões no bucket |
Connection refused ao S3 | Nome do serviço, namespace, porta e NetworkPolicy |
AccessDeniedException | Permissões da credencial no bucket ou prefixo |
| Configuração S3A não aparece no pod | Renderização de core-site.xml, spark-defaults.conf e valores aplicados no release |
| Notebook ou DAG não acessa dados | Defaults de Jupyter/Airflow e credenciais disponíveis para o cliente |
Boas práticas
- Não versionar
access.key,secret.key, tokens ou endpoints sensíveis em repositório Git. - Usar arquivos de valores privados ou mecanismos de Secret externos para credenciais reais.
- Separar valores por ambiente, como desenvolvimento, homologação e produção.
- Rotacionar credenciais periodicamente e aplicar
helm upgradequando necessário. - Dar às credenciais apenas as permissões necessárias no bucket ou prefixo usado pelos jobs.