Segurança Fabric Spark

Estabeleça um ambiente de execução controlado, controle a saída de dados e imponha privilégios mínimos enquanto permite o acesso secreto seguro.

Ponto de extremidade privado gerido (MPE)

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 maior segurança.
  • Habilite a rede virtual gerenciada (VNets). Para habilitar redes virtuais gerenciadas, consulte a documentação pública. O Microsoft Fabric cria e gerencia redes virtuais gerenciadas (VNets) para cada espaço de trabalho 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 espaço de trabalho, removendo-os da rede virtual compartilhada.

  • Na produção, use redes virtuais gerenciadas para a execução segura de Spark Notebooks.

  • Quando você cria um MPE (Managed Private Point), ele é criado no nível do espaço de trabalho por padrão.

  • 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 ativar a configuração PL, o sistema cria uma rede virtual gerenciada para o espaço de trabalho quando você executa o primeiro trabalho do Spark (Definições de Trabalho do Bloco de Anotações ou do Spark). O sistema também cria a rede virtual quando você executa uma operação Lakehouse, como Load to Table ou uma operação de manutenção de mesa (Otimize ou Vacuum).

Observação

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

Proteção de acesso de saída do ambiente de trabalho (WS OAP)

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

Habilite a Proteção de Acesso de Saída do Espaço de Trabalho (WS OAP). Isso garante que a conectividade de saída com a Internet do Spark só vá para destinos aprovados por meio de terminais privados gerenciados. 

  • Bloqueio de bibliotecas públicas: Isso também bloqueia a instalação de bibliotecas públicas (de PyPi, Maven, etc.). Portanto, é necessário empacotar as suas bibliotecas como ficheiros JARs ou Wheel e carregar bibliotecas personalizadas para o ambiente ou recursos e instalar com % pip install dentro dos Notebooks. Uma coisa a ter em conta é que, se o adicionar aos recursos e instalar com o comando %pip install em linha, o tempo de publicação do ambiente será menor. Isso é útil para desenvolvimento e testes rápidos. Para reutilizar os pacotes em vários Blocos de Notas, recomenda-se a publicação no ambiente. Outro método é conectar-se ao seu repositório privado. Para obter mais detalhes, consulte a documentação sobre a proteção de acesso de saída do espaço de trabalho para cargas de trabalho de engenharia de dados
Cenário: Você deve habilitar o WS OAP em ambientes de desenvolvimento?

Considere não ativar o WS OAP em espaços de trabalho de desenvolvimento ou inferiores, pois isso afeta o processo de desenvolvimento. Depois que as definições de trabalho do Bloco de Anotações ou do Spark (SJDs) forem testadas com bibliotecas públicas, teste o mesmo Bloco de Anotações com bibliotecas personalizadas. Após as revisões de código adequadas, implante em ambientes superiores e ative o WS OAP. Se você quiser proteger até mesmo o ambiente de desenvolvimento, você pode habilitar o WS OAP, mas isso pode dificultar o processo de desenvolvimento. Os pools iniciais não estão disponíveis quando você ativa o WS OAP.

Aceder ao Azure Key Vault (AKV) a partir do Bloco de Notas

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

Armazene as credenciais com segurança no Azure Key Vault (AKV). 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.

Aceder ao Azure Key Vault (AKV) a partir do Bloco de Notas

  • Rede: Recomendamos proteger o seu AKV com regras de firewall para permitir o acesso apenas a partir de redes conhecidas. No entanto, você permite os 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 AKV. Um AKV pode suportar apenas até 64 pontos de extremidade privados (subscrição do Azure e limites de serviço, quotas e restrições). 

  • Autenticação: O sistema executa Fabric Spark Notebooks e SJDs no contexto do utilizador que submete as tarefas/Notebooks. Para aceder ao AKV, o utilizador que faz a submissão deve ter acesso suficiente para recuperar o segredo ("Key Vault Secrets Officer"). Consulte as práticas recomendadas do AKV: Conceder permissão aos aplicativos para acessar um cofre de chaves do Azure usando o Azure RBAC.

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

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

  • Na produção, não recomendamos fornecer acesso do usuário a AKVs no ambiente prod. Em vez disso, use contas de serviço para acessar seu Cofre de Chaves (KV). Envie os blocos de anotações/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 para ler segredos do AKV. Nesses casos, o construtor de credenciais é útil para acessar o AKV usando um SPN (Nome da Entidade de Serviço) diferente.

Aqui está o trecho 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 codifice segredos ou palavras-passe em texto simples no seu código. Use sempre um cofre seguro (como o Azure Key Vault) para armazenar e recuperar seus segredos.