Поддержка Spark для безопасности OneLake (RLS и CLS)

Fabric Spark интегрируется с политикой безопасности OneLake чтобы политики безопасности на уровне строк (RLS) и политики безопасности на уровне столбцов (CLS), определенные один раз в OneLake, последовательно применяются при чтении таблиц Lakehouse Delta из записных книжек Spark и определений заданий Spark. Пользователи продолжают писать стандартные запросы Spark SQL или DataFrame; Spark прозрачно фильтрует результат, чтобы каждый пользователь видел только строки и столбцы, к которых они авторизованы для доступа.

В этой статье объясняется , как Spark работает с безопасностью OneLake, включая архитектуру принудительного применения, поток подготовки данных, взаимодействие с пользователем и поддерживаемые сценарии и ограничения.

Note

Сведения о создании политик и модели кросс-движка см. в разделе "Безопасность на уровне строк в OneLake" и разделе "Безопасность на уровне столбцов в OneLake".

Основные понятия на первый взгляд

  • Единственный источник истины. Правила RLS и списки столбцов CLS определяются в обработчике данных один раз с помощью ролей безопасности OneLake. Spark не сохраняет или дублирует политику.
  • Эффективный доступ, не зависящий от двигателя. OneLake возвращает предварительно подготовленный эффективный доступ для запрашивающего пользователя, включая разрешенные столбцы и метаданные фильтра строк RLS. Spark использует эффективный доступ к данным при выполнении запроса.
  • Фильтрация только для разностных данных. Слой платформы OneLake и Fabric применяет RLS и CLS только к таблицам Delta Parquet. Объекты, не относящиеся к Delta с примененными правилами, блокируются платформой, а не фильтруются с помощью Spark.
  • Обход привилегированных ролей. Как поведение платформы OneLake и Fabric, рабочая область Admin, Member и Contributor роли не ограничены RLS или CLS. Фильтрация применяется к средству просмотра и пользователям, которым предоставлен доступ с помощью ролей безопасности OneLake.

Как Spark применяет безопасность OneLake

Когда пользователь отправляет запрос, касающийся защищенной таблицы Lakehouse, Spark подготавливает план выполнения, который объединяет запрос пользователя с эффективным доступом к безопасности OneLake для этого пользователя. Принудительное применение происходит во время выполнения, а не как шаг после фильтрации в пользовательском коде, поэтому его нельзя обойти с помощью альтернативных API или операций чтения на основе пути.

Двух-контекстная модель выполнения

Fabric Spark использует два контекста выполнения для изоляции оценки политики от пользовательского кода:

  • Контекст пользователя. Запускает тетрадь или определение задания Spark под идентичностью пользователя. Этот контекст планирует запрос и потребляет отфильтрованные выходные данные, но он никогда не имеет прямого, нефильтрованного доступа к защищенным таблицам.
  • Контекст системы (безопасности). Привилегированный, управляемый Microsoft контекст, который определяет фактический доступ пользователя к OneLake, считывает исходные Delta файлы, применяет фильтрацию строк RLS и проекции CLS, и возвращает только те строки и столбцы, к которым пользователь имеет доступ.

Системный контекст отображается в центре мониторинга в качестве SparkSecurityControl заданий, выполняемых вместе с сеансом записной книжки пользователя. Имя задания и опыт мониторинга — поведение платформы Fabric. Эти задания ожидаются и указывают на активное обеспечение безопасности OneLake.

Поток запросов для защищенной таблицы

  1. Например, пользователь запускает запрос в записной книжке Spark SELECT * FROM lakehouse.sales.
  2. Spark через каталог Lakehouse находит таблицу и обнаруживает, что система безопасности OneLake включена.
  3. Spark запрашивает эффективный доступ для текущего пользователя из OneLake. Ответ включает в себя разрешенный список столбцов (CLS) и метаданные фильтра строк RLS.
  4. Контекст безопасности системы считывает файлы Delta, проецирует только разрешенные столбцы и применяет RLS, используя фильтрацию строк в виде растрового изображения или вектора удаления во время выполнения.
  5. Отфильтрованный результат возвращается в контекст пользователя, который завершает остальную часть запроса пользователя (присоединение, агрегирование, запись в незащищенные целевые объекты и т. д.) по уже отфильтрованным данным.

Что происходит для каждого типа политики

Политика Что возвращает Spark Notes
Только RLS Все столбцы, но только строки, разрешенные правилом RLS. Фильтрация строк обеспечивается в контексте безопасности с помощью растровой или векторной фильтрации удаления; пользователи не могут наблюдать за логикой фильтрации.
Только CLS Только допустимые столбцы; все строки. SELECT * завершается успешно и возвращает допустимые столбцы, если разрешён хотя бы один столбец. Если столбцы не разрешены, Spark завершает запрос сбоем.
RLS + CLS в той же роли Разрешенные строки, проецируемые в допустимые столбцы. Поддерживается до тех пор, пока оба правила относятся к одной роли.
RLS в роли A, CLS в роли B (один и тот же пользователь) Запрос завершается ошибкой. Уровень платформы OneLake и Fabric не поддерживает пользователя, являющегося членом двух ролей, где один определяет RLS и другой определяет CLS. См. сведения о безопасности на уровне строк и безопасности на уровне столбцов.
Объект Non-Delta Доступ заблокирован. Уровень платформы OneLake и Fabric применяет RLS и CLS только к таблицам Delta Parquet. Другие объекты в защищенной роли блокируются.

Канонические правила разработки и синтаксис выражений RLS см. в статьях безопасности на уровне строк и уровня столбцов .

Подготовка данных для пользователей с помощью Spark

Безопасность OneLake обеспечивает прозрачность для потребителя данных. Пользователи продолжают использовать API, которые они уже знают, и Spark обрабатывает разрешение политик и фильтрацию от их имени.

Spark SQL

-- Returns only rows and columns the current user is authorized to see.
SELECT product_category, SUM(amount) AS total
FROM sales.transactions
GROUP BY product_category;

DataFrame PySpark

df = spark.read.table("sales.transactions")
df.filter("region = 'EMEA'").groupBy("product_category").sum("amount").show()

В обоих примерах данные таблицы transactions, загруженные в кадр данных, уже фильтруются с учетом безопасности OneLake. Последующие преобразования работают только над отфильтрованными данными.

Прямой доступ к файлам заблокирован

Прямой доступ к пути обходит разрешение политики каталога Lakehouse. Если в таблице включена безопасность OneLake, уровень платформы OneLake и Fabric блокирует следующие шаблоны для пользователей, не являющихся привилегированными:

  • spark.read.format("delta").load("abfss://...")
  • DeltaTable.forPath(spark, "abfss://...")
  • OneLake REST/SDK получает доступ к Tables/<table> папке защищенной таблицы.

Пользователи должны получить доступ к защищённым таблицам через имя таблицы lakehouse (например, spark.read.table("lakehouse.table") или Spark SQL), чтобы Spark мог управлять и применять эффективный доступ.

Взаимодействие с пользователем

  • Прозрачная фильтрация. Не требуется перезапись запросов или специальный синтаксис. Одна и та же записная книжка работает для пользователей с разными ролями и возвращает данные, относящиеся к роли.
  • Согласованные результаты в движках. То же правило RLS и проекция CLS, применяемые в Spark, также применяются в SQL-аналитической конечной точке, семантических моделях, построенных на Direct Lake, и авторизованных сторонних движках. Обзор интеграции безопасности OneLake.
  • Привилегированные роли видят все. В соответствии с поведением платформы OneLake и Fabric пользователи рабочей области Admin, Member и Contributor продолжают иметь доступ к нефильтрованным данным, которые полезны для разработки конвейеров данных, обслуживания таблиц (OPTIMIZE, VACUUM) и устранения неполадок.
  • Контроль. Задания SparkSecurityControl , отображаемые в центре мониторинга, соответствуют системному контексту, который выполняет принудительное применение политик. Имя задания и запись концентратора мониторинга являются частью операционной платформы Fabric.

Снимок экрана: концентратор мониторинга, показывающий задание SparkSecurityControl вместе с сеансом записной книжки пользователя.

Вопросы производительности

  • Фильтрация строк RLS. RLS применяется близко к сканированию Delta с помощью фильтрации в стиле битмап или фильтрации в стиле векторного удаления и, где поддерживается, собственного исполнительного механизма. Этот дизайн уменьшает количество строк, созданных в контексте пользователя.
  • Обрезка столбцов. Списки столбцов CLS объединяются с проекцией пользователя. Только данные пересечения считываются из хранилища Delta.
  • Эффективное кэширование доступа. Spark кэширует политику и метаданные эффективного доступа для каждого запроса и очищает его при остановке выполнения запроса.
  • Использование разделов и статистики. Стандартная отрезка секций и пропуск данных продолжают применяться с фильтрацией строк RLS, поэтому запросы к секционированным таблицам остаются эффективными.

Поддерживаемые сценарии

  • Чтение таблиц Lakehouse Delta в записных книжках Spark и определениях заданий Spark в каталоге lakehouse (<lakehouse>.<table>).
  • API Spark SQL и PySpark/Scala DataFrame для защищенных таблиц.
  • Соединения, агрегации и последующие трансформации в защищенных таблицах.
  • Записывает данные из защищенных источников в незащищенные выходные данные. Выходные таблицы, написанные за пределами защищенного озерохранилища, содержат только уже отфильтрованные данные, к которым пользователь записи допущен к чтению.
  • Доступ к lakehouse между рабочими областями через ссылки, где в исходном lakehouse включена безопасность OneLake.

Включение каталога OneLake Spark

Для принудительного применения RLS и CLS с помощью Spark каталог OneLake Spark должен быть включен для сеанса Spark. Это выполняется службой заданий на основе lakehouse, заданного по умолчанию для сеанса Spark. Каталог OneLake Spark будет включен, если:

  • Lakehouse по умолчанию для сеанса Spark имеет включённую схему или
  • Для сеанса Spark не задан lakehouse по умолчанию.

В таких случаях, когда lakehouse по умолчанию должен быть без поддержки схем, каталог OneLake Spark можно включить с помощью свойства Spark в среде Environment. Задайте для свойства Spark значение spark.sql.fabric.catalog.enable-schemaless-lakehousestrue и выберите эту среду при выполнении задания Spark или записной книжки.

Ограничения

OneLake security RLS и CLS в Spark наследуют общие ограничения безопасности OneLake. К заметным поведению и ограничениям относятся:

  • Реализация Spark RLS/CLS не поддерживает служебные принципы; для политик безопасности уровня строк и столбцов оцениваются только идентификации пользователей. Выполнение записных книжек с удостоверением рабочей области не будет применять RLS/CLS для самого удостоверения рабочей области, а только для отдельных пользователей, выполняющих запросы в контексте записной книжки.
  • Уровень платформы OneLake и Fabric применяет RLS и CLS только к таблицам Delta parquet. Объекты, не относящиеся к типу Delta, в защищенной роли блокируются.
  • Слой платформы OneLake и Fabric блокирует чтение прямого доступа (abfss://, DeltaTable.forPath) для защищенных таблиц для непривилегированных пользователей.
  • Уровень платформы OneLake и Fabric не поддерживает пользователя, являющегося членом двух ролей, где один определяет RLS, а другой определяет CLS для затронутых таблиц.
  • Как платформа OneLake и Fabric, роли Admin, Member и Contributor игнорируют RLS и CLS.
  • Записи в незащищенные выходные данные из защищенных источников поддерживаются и работают с уже отфильтрованными данными. Запись (INSERT/UPDATE/DELETE/MERGE) в защищенный целевой объект может быть неподдерживаемой для пользователей, подверженных RLS или CLS; используйте привилегированное удостоверение для записи ETL в защищенные таблицы.