Segurança do Fabric Spark

Estabeleça um ambiente de execução controlado, governe a saída de dados e imponha menos privilégios ao habilitar o acesso secreto seguro.

MPE (Ponto de Extremidade Privado Gerenciado)

Cenário: você é um engenheiro de dados que trabalha com dados confidenciais no Fabric Spark. Sua equipe de segurança tem um requisito para executar todos os códigos em um ambiente isolado de rede para segurança aprimorada.
  • Habilitar VNets (Rede Virtual Gerenciada). Para habilitar VNets gerenciadas, consulte a documentação pública. O Microsoft Fabric cria e gerencia redes virtuais gerenciadas (VNets) para cada workspace do Fabric. Eles fornecem isolamento de rede para cargas de trabalho do Fabric Spark, o que significa que o Microsoft Fabric implanta os clusters de computação em uma rede dedicada por workspace, removendo-os da rede virtual compartilhada.

  • Em produção, use VNets gerenciadas para a execução segura do Spark Notebooks.

  • Quando você cria um Ponto de Extremidade Privado Gerenciado (MPE), ele é criado por padrão no nível do espaço de trabalho.

  • Quando você habilita o Private Link (PL) no nível do locatário, o sistema habilita VNets gerenciadas para todos os espaços de trabalho no locatário. Depois de habilitar a configuração de PL, o sistema cria uma rede virtual gerenciada para o workspace quando você executa o primeiro trabalho no Spark (Notebooks ou Definições de Trabalho do Spark). O sistema também cria a rede virtual quando você executa uma operação de Lakehouse, como Carregar para Tabela ou uma operação de manutenção de tabela (Otimizar ou Limpeza).

Observação

Quando você ativa as VNets gerenciadas, os pools iniciais ficam indisponíveis porque são executados em uma rede compartilhada.

Proteção de Acesso para Fora do Workspace (WS OAP)

Cenário: você está preocupado que alguém possa gravar dados de produção acidentalmente em destinos não autorizados usando notebooks Spark e você deseja controlar isso.

Habilitar a Proteção de Acesso de Saída do Workspace (WS OAP). Isso garante que a conectividade de internet de saída do Spark vá apenas para destinos aprovados por meio de endpoints privados gerenciados. 

  • Bloqueio de bibliotecas públicas: isso também bloqueia a instalação de bibliotecas públicas (de PyPi, Maven etc.). Portanto, você precisa empacotar suas bibliotecas como arquivos JAR ou Wheel e enviar bibliotecas personalizadas para o ambiente ou recursos e instalar com % pip install dentro dos Notebooks. Uma coisa a observar é que, se você adicioná-lo aos recursos e instalar com o comando embutido %pip install, o tempo de publicação do ambiente será reduzido. Isso é útil para desenvolvimento e teste rápidos. Para reutilizar os pacotes em vários Notebooks, é recomendável publicá-los no ambiente de execução. Outro método é conectar-se ao repositório privado. Para obter mais detalhes, consulte a documentação sobre a proteção de acesso de saída do Workspace para cargas de trabalho de engenharia de dados.
Cenário: você deve habilitar o OAP do WS em ambientes de desenvolvimento?

Considere não ativar o OAP do WS em ambientes de desenvolvimento ou em ambientes de trabalho de teste, pois isso afeta o processo de desenvolvimento. Depois que as Definições de Trabalho do Notebook ou Spark (SJDs) forem testadas com bibliotecas públicas, teste o mesmo Notebook com bibliotecas personalizadas. Após revisões de código adequadas, implante em ambientes mais altos e ative o OAP do WS. Se você quiser proteger até mesmo o ambiente de desenvolvimento, poderá habilitar o WS OAP, mas isso pode dificultar o processo de desenvolvimento. Os pools de início não estão disponíveis quando você habilita o WS OAP.

Acessando o AKV (Azure Key Vault) do Notebook

Cenário: você é um engenheiro de dados e deseja se conectar a várias fontes de dados usando credenciais protegidas do Spark Notebooks.

Armazene as credenciais com segurança no AKV (Azure Key Vault). Não mantenha um único cofre de chaves para armazenar todos os segredos. Em vez disso, use vários cofres de chaves com base em projetos/domínios, se possível.

Acessando o AKV (Azure Key Vault) do Notebook

  • Rede: Recomendamos proteger seu AKV com regras de firewall para permitir o acesso somente de redes conhecidas. No entanto, você permite endereços IP do Fabric Spark em suas regras de firewall. Para se conectar com segurança a AKVs protegidos do Fabric Spark Notebooks, recomendamos a criação de um ponto de extremidade privado gerenciado para o AKV. Um AKV só pode dar suporte a até 64 pontos de extremidade privados (limites, cotas e restrições de serviço e assinatura do Azure). 

  • Autenticação: O sistema executa Notebooks do Fabric Spark e SJDs no contexto do usuário que envia os jobs/Notebooks. Para acessar o AKV, o usuário solicitante deve ter acesso suficiente para recuperar o segredo ("Oficial de Segredos do Key Vault"). Consulte as práticas recomendadas do AKV: conceda permissão aos aplicativos para acessar um cofre de chaves do Azure usando o RBAC do Azure.

    • Você pode usar notebookutils (anteriormente chamado de mssparkutils) para acessar o AKV usando as credenciais do usuário que executa o Notebook/SJD:

    notebookutils.credentials.getSecret('<AKV URL>', 'Secret Name')

  • Em produção, não recomendamos fornecer acesso do usuário a AKVs no ambiente de prod. Em vez disso, use contas de serviço para acessar seu Key Vault (KV). Envie os notebooks/trabalhos usando a conta de serviço. 

  • Em alguns casos, a conta de serviço que envia o trabalho tem acesso para ler segredos do AKV. 

  • Em alguns casos, essa conta de serviço geralmente é uma conta de DevOps que pode não ter acesso à leitura de segredos do AKV. Nesses casos, o construtor de credenciais é útil para acessar o AKV usando um SPN (Nome da Entidade de Serviço) diferente.

Este é o snippet de código Scala de exemplo:

val clientSecretCredential: ClientSecretCredential = new ClientSecretCredentialBuilder()
  .clientId("<client id here>")
  .clientSecret("<client secret here>")
  .tenantId("<tenant id here>")
  .build()

val secretClient: SecretClient = new SecretClientBuilder()
  .vaultUrl("<vault url here>")
  .credential(clientSecretCredential)
  .buildClient()

val secretName = "<your value>"
val retrievedSecret = secretClient.getSecret(secretName)
println(s"Retrieved secret: ${retrievedSecret.getValue}")

Observação

Não codifique segredos ou senhas em texto sem formatação em seu código. Sempre use um cofre seguro (como o Azure Key Vault) para armazenar e recuperar seus segredos.