Seguridad de Fabric Spark

Establezca un entorno de ejecución controlado, controle la salida de datos y aplique privilegios mínimos al habilitar el acceso seguro a secretos.

Punto de conexión privado administrado (MPE)

Escenario: es un ingeniero de datos que trabaja con datos confidenciales en Fabric Spark. El equipo de seguridad tiene un requisito de ejecutar todo el código en un entorno aislado de la red para mejorar la seguridad.
  • Habilite la Red Virtual Administrada (VNets). Para habilitar redes virtuales administradas, consulte la documentación pública. Microsoft Fabric crea y administra redes virtuales administradas (VNet) para cada área de trabajo de Fabric. Proporcionan aislamiento de red para cargas de trabajo de Fabric Spark, lo que significa que Microsoft Fabric implementa los clústeres de proceso en una red dedicada por área de trabajo, lo que los quita de la red virtual compartida.

  • En producción, use redes virtuales administradas para la ejecución segura de cuadernos de Spark.

  • Al crear un punto de conexión privado administrado (MPE), se crea en el nivel de área de trabajo de forma predeterminada.

  • Al habilitar Private Link (PL) en el nivel de inquilino, el sistema habilita las redes virtuales administradas para todas las áreas de trabajo del inquilino. Después de habilitar la configuración de PL, el sistema crea una red virtual administrada para el área de trabajo al ejecutar el primer trabajo de Spark (Notebook o Spark Job Definitions). El sistema también crea la red virtual cuando realizas una operación de Lakehouse, como cargar en tabla o una operación de mantenimiento de tabla (optimizar o vaciar).

Nota:

Al habilitar redes virtuales administradas, los pools de inicio dejan de estar disponibles porque se ejecutan en una red compartida.

Protección de acceso saliente del área de trabajo (WS OAP)

Escenario: le preocupa que alguien pueda escribir accidentalmente datos de producción en destinos no autorizados mediante cuadernos de Spark y desea controlarlos.

Habilite la protección de acceso saliente del área de trabajo (WS OAP). Esto garantiza que la conectividad saliente a Internet desde Spark solo vaya a destinos aprobados a través de puntos de conexión privados administrados. 

  • Bloqueo de bibliotecas públicas: esto también bloquea la instalación de bibliotecas públicas (desde PyPi, Maven, etc.). Por lo tanto, debe empaquetar sus bibliotecas en archivos JAR o Wheel y subir bibliotecas personalizadas al entorno o a los recursos, e instalarlas con % pip install dentro de los cuadernos. Una cosa que debe tener en cuenta es que si lo agrega a los recursos e instala con la instalación en línea %pip, el tiempo de publicación del entorno es menor. Esto es útil para el desarrollo y las pruebas rápidas. Para reutilizar los paquetes en varios notebooks, se recomienda publicarlos en el entorno de ejecución. Otro método consiste en conectarse al repositorio privado. Para más información, consulte la documentación sobre la protección de acceso saliente del área de trabajo para cargas de trabajo de ingeniería de datos.
Escenario: ¿Se debería habilitar WS OAP en entornos de desarrollo?

Considere la posibilidad de no activar WS OAP en áreas de trabajo de desarrollo o inferiores porque afecta al proceso de desarrollo. Una vez que el cuaderno o las definiciones de trabajos de Spark (SJD) se prueban con bibliotecas públicas, pruebe el mismo cuaderno con bibliotecas personalizadas. Después de las revisiones de código adecuadas, implemente en entornos superiores y, a continuación, active WS OAP. Si desea proteger incluso el entorno de desarrollo, puede habilitar el OAP de WS, pero podría dificultar el proceso de desarrollo. Los grupos de inicio no están disponibles cuando se habilita el OAP de WS.

Acceso a Azure Key Vault (AKV) desde notebook

Escenario: Usted es ingeniero de datos y quiere conectarse a varios orígenes de datos mediante credenciales protegidas desde Spark Notebooks.

Almacene las credenciales de forma segura en Azure Key Vault (AKV). No mantenga un único almacén de claves para almacenar todos los secretos. En su lugar, si es posible, utilice varios almacenes de claves basados en proyectos o dominios.

Acceso a Azure Key Vault (AKV) desde notebook

  • Red: Recomendamos proteger su AKV con reglas de firewall para permitir el acceso solo desde redes conocidas. Sin embargo, permite las direcciones IP de Fabric Spark en las reglas de firewall. Para conectarse de forma segura a AKV protegidos desde cuadernos de Fabric Spark, se recomienda crear un punto de conexión privado administrado en AKV. Un AKV solo puede admitir hasta 64 puntos de conexión privados (límites de suscripción y servicio de Azure, cuotas y restricciones). 

  • Autenticación: El sistema ejecuta cuadernos y SJD de Fabric Spark en el contexto del usuario que envía los trabajos o cuadernos. Para acceder al AKV (Almacén de Claves), el usuario remitente debe tener permisos suficientes para acceder al secreto ("Administrador de secretos de Key Vault"). Consulte los procedimientos recomendados de AKV: Concesión de permiso a las aplicaciones para acceder a un almacén de claves de Azure mediante Azure RBAC.

    • Puede usar notebookutils (anteriormente denominados mssparkutils) para acceder a AKV mediante las credenciales del usuario que ejecuta Notebook/SJD:

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

  • En producción, no se recomienda proporcionar acceso de usuario a AKV en el entorno prod. En su lugar, use cuentas de servicio para acceder a Key Vault (KV). Envíe los cuadernos o trabajos mediante la cuenta de servicio. 

  • En algunos casos, la cuenta de servicio que envía el trabajo tiene acceso para leer secretos de Azure Key Vault (AKV). 

  • En algunos casos, esta cuenta de servicio suele ser una cuenta de DevOps que podría no tener acceso para leer secretos de AKV. En estos casos, la herramienta de generación de credenciales resulta útil para acceder a AKV mediante un nombre de entidad de seguridad de servicio (SPN) diferente.

Este es el fragmento de código de Scala de ejemplo:

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

Nota:

No codifique de forma rígida secretos ni contraseñas en texto sin formato en el código. Use siempre un almacén seguro (como Azure Key Vault) para almacenar y recuperar los secretos.