Unity Catalog では、行レベルと列レベルのセキュリティの 2 つの方法がサポートされています。 ABAC ポリシー と テーブル レベルの行フィルターと列マスクです。 どちらの方法でも、独自のデータへのアクセス権は付与されるわけではありません。両方とも、既存のオブジェクト レベルの特権に制限を追加します。 オブジェクト レベルのアクセス許可 (GRANT) を使用して、ベース テーブルへのアクセス権を個別に付与する必要があります。
主な違いは、制限が定義されている場所です。
テーブル レベルの行フィルターと列マスクは、ALTER TABLEを使用して個々のテーブルに直接秘密度コントロールを適用します。 テーブル所有者は、管理されたタグ システムを必要とせずに、独自のデータ保護を管理します。 これは少数のテーブルでは簡単ですが、各テーブルを個別に構成する必要があり、テーブル所有者は独自のフィルターとマスクを変更または削除できます。
ABAC ポリシーは 、カタログ、スキーマ、またはテーブル レベルでアタッチされ、管理タグに基づいてテーブルと列を動的に照合します。 カタログ レベルで定義されたポリシーは、そのカタログ内のすべてのテーブルに適用され、個々のテーブル所有者はそれを削除、変更、またはバイパスすることはできません。 ポリシーはカタログ上に存在し、クエリがランタイムに到達する前に Unity カタログによって評価されます。 これにより、上位レベルの管理者は組織全体のルールを適用し、下位レベルの管理者と所有者がそれらを回避できないようにすることができます。
詳細な比較の概要
次の表は、ABAC ポリシーとテーブル レベルの行フィルターと列マスクの違いをまとめたものです。
| 考慮事項 | ABAC ポリシー | テーブル レベルの行フィルターと列マスク |
|---|---|---|
| SQL 構文 | CREATE POLICY ... ON CATALOG/SCHEMA/TABLE |
ALTER TABLE ... SET ROW FILTER / ALTER TABLE ... ALTER COLUMN ... SET MASK |
| スコープ | ポリシー スコープ内のすべてのテーブル (カタログ、スキーマ、またはテーブル) とその子孫。 タグ付けされた新しいテーブルは自動的にカバーされます。 | フィルターまたはマスクが構成されている 1 つのテーブル。 各テーブルは個別に構成する必要があります。 |
| 動的マッチング | テーブルと列は、 has_tag() と has_tag_value()を使用して、管理タグに基づいて動的に照合されます。 |
動的マッチングなし。 フィルターとマスクは、特定のテーブルと列にバインドされます。 |
| 対象となるプリンシパル |
TO
/
EXCEPT UDF の ID 関数に加えて、ポリシー定義に含まれる句。 |
UDF 内の current_user() などの ID 関数。 |
| ポリシー ガバナンス | ポリシーは、カタログまたはスキーマ所有者によって設定できます。 より高いレベルで設定した後、テーブルの所有者はオーバーライド、変更、または削除できません。 | テーブル所有者が管理します。ユーザーは、独自のテーブルのフィルターとマスクを変更または削除できます。 |
| サポートされていない機能 | タイム トラベル、複製、デルタ共有などの操作は、 EXCEPT 句のプリンシパルによって実行できます。
「フェールクローズ設計」を参照してください。 |
EXCEPT句がないため、サポートされていない機能は保護されたテーブルでは使用できません。 |
| 有効なポリシー |
SHOW EFFECTIVE POLICIES を使用して、特定のテーブルとユーザーに適用されるポリシーを確認します。 |
テーブル定義に直接表示されます。 |
| 監査可能性 |
DESCRIBE POLICY と SHOW POLICIES はポリシー定義を検査するためのものです。 |
INFORMATION_SCHEMA.ROW_FILTERS と INFORMATION_SCHEMA.COLUMN_MASKS. |
一般に、次の場合 は ABAC ポリシーを使用します 。
- 多数のテーブル、スキーマ、またはカタログ間で一貫したアクセス規則が必要です。
- 組織は職務を分離します。 たとえば、ポリシー作成者はルールを定義し、データ スチュワードはデータをタグで分類します。
- データ資産が拡大しており、新しいテーブルがタグ付けされたときに自動的にカバーされるようにする必要があります。
- 特定のプリンシパルのタイムトラベル、デルタ共有、クエリの完全な最適化などの操作を利用するには、
EXCEPT句が必要です。
一般に、 次の場合は、テーブル レベルの行フィルターと列マスクを 使用します。
- 各テーブルには、他のテーブルに一般化しない厳密な特定のロジックがあります。
- テーブルの所有者は、一元化されたタグ システムを使用せずに、独自のフィルターとマスクを直接管理する必要があります。
- 変更頻度の低い小さな安定したテーブル セットがあります。
ABAC とテーブル レベルの行フィルターと列マスクの組み合わせ
ABAC とテーブル レベルの行フィルターと列マスクは、同じテーブルに共存できます。 クエリ時に、ポリシーは、次の規則を使用してクエリを実行するユーザーに対して個別に評価されます。
- 適用できる個別の行フィルターは 1 つだけです。
- 列ごとに解決できる個別の列マスクは 1 つだけです。
Azure Databricksは、データ出力ではなく、適用された関数を比較することで競合を評価します。 ABAC ポリシーとテーブル レベルのフィルターまたはマスクの両方が同じユーザーに対して同じ行フィルターまたは列マスク関数を適用する場合、Azure Databricksは実行を許可します。 異なる関数を適用する場合、Azure Databricksはアクセスをブロックし、それらの関数が同じデータ出力を生成した場合でもエラーを返します。
競合の解決とトラブルシューティングの詳細については、「 複数のフィルターとマスクのルール」を参照してください。
動的ビューを使用した行レベルおよび列レベルのセキュリティ
動的ビュー では、 current_user() や is_account_group_member() などの ID 関数をビュー定義に直接埋め込むことで、行レベルおよび列レベルのセキュリティを実装することもできます。 動的ビュー、行フィルター、列マスクはすべてクエリ時にフィルター処理または変換ロジックを適用しますが、ユーザーに対する管理、スコープ設定、公開方法は異なります。
| 適用対象 | 管理方法 | 最もよく使用される | |
|---|---|---|---|
| 動的ビュー | [ビュー] | ビュー定義の SQL ロジック | 複数のソース テーブルにまたがる、または共有用のデータの形状を変更するきめ細かいアクセス制御 |
| 行フィルターと列マスク | テーブルと列 | ABAC ポリシーまたはテーブルレベルのアサインメント | 新しいオブジェクトを導入せずに行レベルおよび列レベルのアクセス制御を行う |
複数のソース テーブルにまたがる、または共有用のデータの形状を変更するきめ細かいアクセス制御が必要な場合は、動的ビューを使用します。 新しいオブジェクトを導入せずに個々のテーブルへのアクセスを制御する場合は、行フィルターと列マスクを使用します。
たとえば、動的ビューでは、非監査者の電子メール列をマスクできます。
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE
WHEN is_account_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END AS email,
country,
product,
total
FROM sales_raw
動的ビューは、クエリの最適化と述語のプッシュダウンを完全にサポートしているため、行フィルターや列マスクよりも優れたクエリ パフォーマンスを提供できます。 また、ユーザーが基になるテーブルを変更することもできなくなります。
ただし、動的ビューには、データ ガバナンスの 2 つの欠点があります。
- 限定的な監査: 動的ビューには、システム テーブル内のタグやポリシー定義などのセマンティック メタデータがないため、大規模な監査が困難になります。
-
プローブの脆弱性:
SecureViewバリアがないため、ユーザーがフィルター処理された行に関する情報を推測するために副作用のある述語を作成するプローブ攻撃から保護されません。 保護されたテーブルの述語プッシュダウンについてを参照してください。