Политика безопасности на уровне строк
Область применения: ✅Microsoft Fabric✅Azure Data Explorer
Используйте контекст членства в группах или выполнения для управления доступом к строкам в таблице базы данных.
Безопасность на уровне строк (RLS) упрощает проектирование и кодирование безопасности. Это позволяет применять ограничения доступа к строкам данных в приложении. Например, ограничить доступ пользователей к строкам, относящимся к отделу, или ограничить доступ клиентов только к данным, соответствующим их компании.
Логика ограничения находится на уровне базы данных, а не на отдалении от данных на другом уровне приложения. Система базы данных применяет ограничения доступа при каждом попытке доступа к данным с любого уровня. Эта логика делает систему безопасности более надежной и надежной, уменьшая область поверхности системы безопасности.
RLS позволяет предоставлять доступ к другим приложениям и пользователям только в определенной части таблицы. Например, может понадобиться:
- Предоставление доступа только к строкам, удовлетворяющим некоторым критериям
- Анонимизация данных в некоторых столбцах
- Все вышеперечисленное
Примечание.
Если политика RLS включена в таблице, доступ полностью заменяется запросом RLS, определенным в таблице. Ограничение доступа применяется ко всем пользователям, включая администраторов баз данных и создателя RLS. Запрос RLS должен явно включать определения для всех типов пользователей, которым требуется предоставить доступ.
Дополнительные сведения см . в командах управления для управления политикой безопасности на уровне строк.
Совет
Эти функции часто полезны для row_level_security запросов:
Ограничения
- Нет ограничений на количество таблиц, в которых можно настроить политику безопасности на уровне строк.
- Политика безопасности на уровне строк не может быть настроена в внешних таблицах.
- Политика RLS не может быть включена в таблице в следующих случаях:
- Если он ссылается на запрос политики обновления, в то время как политика обновления не настроена с управляемым удостоверением.
- При использовании непрерывного экспорта , использующего метод проверки подлинности, отличный от олицетворения.
- Если политика доступа к ограниченному представлению настроена для таблицы.
Примеры
Ограничение доступа к таблице Sales
В таблице с именем Sales
каждая строка содержит сведения о продаже. Один из столбцов содержит имя продавца. Вместо предоставления продавцу доступа ко всем записям в Sales
этой таблице включите политику безопасности на уровне строк в этой таблице, чтобы возвращать только записи, в которых продавец является текущим пользователем:
Sales | where SalesPersonAadUser == current_principal()
Вы также можете маскировку адреса электронной почты:
Sales | where SalesPersonAadUser == current_principal() | extend EmailAddress = "****"
Если вы хотите, чтобы каждый продавец видел все продажи определенной страны или региона, можно определить запрос, аналогичный следующему:
let UserToCountryMapping = datatable(User:string, Country:string)
[
"john@domain.com", "USA",
"anna@domain.com", "France"
];
Sales
| where Country in ((UserToCountryMapping | where User == current_principal_details()["UserPrincipalName"] | project Country))
Если у вас есть группа, содержащая менеджеров, может потребоваться предоставить им доступ ко всем строкам. Ниже приведен запрос политики безопасности на уровне строк.
let IsManager = current_principal_is_member_of('aadgroup=sales_managers@domain.com');
let AllData = Sales | where IsManager;
let PartialData = Sales | where not(IsManager) and (SalesPersonAadUser == current_principal()) | extend EmailAddress = "****";
union AllData, PartialData
Предоставление различных данных членам различных групп Microsoft Entra
Если у вас несколько групп Microsoft Entra, и вы хотите, чтобы члены каждой группы видели разные подмножества данных, используйте эту структуру для запроса RLS.
Customers
| where (current_principal_is_member_of('aadgroup=group1@domain.com') and <filtering specific for group1>) or
(current_principal_is_member_of('aadgroup=group2@domain.com') and <filtering specific for group2>) or
(current_principal_is_member_of('aadgroup=group3@domain.com') and <filtering specific for group3>)
Применение одной функции RLS в нескольких таблицах
Сначала определите функцию, которая получает имя таблицы в виде строкового параметра и ссылается на таблицу с помощью table()
оператора.
Например:
.create-or-alter function RLSForCustomersTables(TableName: string) {
table(TableName)
| ...
}
Затем настройте RLS в нескольких таблицах следующим образом:
.alter table Customers1 policy row_level_security enable "RLSForCustomersTables('Customers1')"
.alter table Customers2 policy row_level_security enable "RLSForCustomersTables('Customers2')"
.alter table Customers3 policy row_level_security enable "RLSForCustomersTables('Customers3')"
Создание ошибки при несанкционированном доступе
Если вы хотите, чтобы пользователи неавторизованных таблиц получали ошибку вместо возврата пустой таблицы, используйте функцию assert()
. В следующем примере показано, как создать эту ошибку в функции RLS:
.create-or-alter function RLSForCustomersTables() {
MyTable
| where assert(current_principal_is_member_of('aadgroup=mygroup@mycompany.com') == true, "You don't have access")
}
Этот подход можно объединить с другими примерами. Например, можно отобразить различные результаты для пользователей в разных группах Microsoft Entra и создать ошибку для всех остальных пользователей.
Управление разрешениями для баз данных подписчиков
Политика RLS, настроенная в рабочей базе данных, также вступают в силу в базах данных подписчиков. Вы не можете настроить разные политики RLS в рабочих и последовательских базах данных. Однако вы можете использовать current_cluster_endpoint()
функцию в запросе RLS для достижения того же эффекта, что и разные запросы RLS в таблицах подписчиков.
Рассмотрим пример.
.create-or-alter function RLSForCustomersTables() {
let IsProductionCluster = current_cluster_endpoint() == "mycluster.eastus.kusto.windows.net";
let DataForProductionCluster = TempTable | where IsProductionCluster;
let DataForFollowerClusters = TempTable | where not(IsProductionCluster) | extend EmailAddress = "****";
union DataForProductionCluster, DataForFollowerClusters
}
Примечание.
Указанная выше функция RLS не влияет на производительность запросов в кластере лидеров. Влияние производительности на запросы на кластеры подписчиков будет влиять только на сложность DataForFollowerClusters
.
Управление разрешениями для баз данных ярлыков
Политика RLS, настроенная в рабочей базе данных, также вступит в силу в контекстных базах данных. Вы не можете настроить разные политики RLS в рабочих и ярлыках баз данных. Однако вы можете использовать функцию current_cluster_endpoint()
в запросе RLS для достижения того же эффекта, что и разные запросы RLS в сочетаниях таблиц.
Рассмотрим пример.
.create-or-alter function RLSForCustomersTables() {
let IsProductionCluster = current_cluster_endpoint() == "mycluster.eastus.kusto.windows.net";
let DataForProductionCluster = TempTable | where IsProductionCluster;
let DataForFollowerClusters = TempTable | where not(IsProductionCluster) | extend EmailAddress = "****";
union DataForProductionCluster, DataForFollowerClusters
}
Примечание.
Указанная выше функция RLS не влияет на производительность запросов к исходной базе данных. Влияние производительности на запросы к ярлыкам баз данных будет влиять только на сложность DataForFollowerClusters
.
Дополнительные варианты использования
- Сотрудник службы поддержки центра звонков может определить абонентов по нескольким цифрам своего номера социального страхования. Это число не должно быть полностью предоставлено пользователю поддержки. Политику RLS можно применить к таблице, чтобы маскировать все, кроме последних четырех цифр номера социального страхования в результирующем наборе любого запроса.
- Задайте политику RLS, которая маскирует личную информацию (PII) и позволяет разработчикам запрашивать рабочие среды для устранения неполадок без нарушения нормативных требований.
- Больница может установить политику RLS, которая позволяет медсестрам просматривать строки данных только для своих пациентов.
- Банк может задать политику RLS, чтобы ограничить доступ к строкам финансовых данных на основе подразделения или роли сотрудника.
- Мультитенантное приложение может хранить данные из многих клиентов в одном наборе таблиц (что эффективно). Они будут использовать политику RLS для принудительного разделения логических строк данных каждого клиента от строк каждого другого клиента, поэтому каждый клиент может видеть только свои строки данных.
Влияние производительности на запросы
Если политика RLS включена в таблице, это может повлиять на производительность запросов, обращаюющихся к этой таблице. Доступ к таблице будет заменен запросом RLS, определенным в этой таблице. Влияние производительности запроса RLS обычно состоит из двух частей:
- Проверки членства в идентификаторе Microsoft Entra: проверки эффективны. Вы можете проверить членство в десятках или даже сотнях групп без серьезного влияния на производительность запроса.
- Фильтры, соединения и другие операции, применяемые к данным: влияние зависит от сложности запроса.
Например:
let IsRestrictedUser = current_principal_is_member_of('aadgroup=some_group@domain.com');
let AllData = MyTable | where not(IsRestrictedUser);
let PartialData = MyTable | where IsRestrictedUser and (...);
union AllData, PartialData
Если пользователь не является частью some_group@domain.com, IsRestrictedUser
то оценивается как false
. Запрос, который вычисляется, аналогичен следующему:
let AllData = MyTable; // the condition evaluates to `true`, so the filter is dropped
let PartialData = <empty table>; // the condition evaluates to `false`, so the whole expression is replaced with an empty table
union AllData, PartialData // this will just return AllData, as PartialData is empty
Аналогичным образом, если IsRestrictedUser
true
оценивается, будет оцениваться только запрос PartialData
.
Повышение производительности запросов при использовании RLS
- Если фильтр применяется к столбцу с высоким кратностью, например DeviceID, рассмотрите возможность использования политики секционирования или политики порядка строк.
- Если фильтр применяется к столбцу с низким средним кратностью, рассмотрите возможность использования политики порядка строк.
Влияние на производительность приема
Влияние на прием не оказывает никакого влияния на производительность.