Hive メタストアの特権とセキュリティ保護可能なオブジェクト (レガシ)
この記事では、各 Azure Databricks ワークスペースに組み込まれているレガシ Azure Databricks Hive メタストアの特権モデルについて説明します。 また、組み込みの Hive メタストア内のオブジェクトに対して特権を付与、拒否、取り消す方法についても説明します。 Unity Catalog では、権限の付与に別のモデルが使用されます。 「Unity Catalog の権限とセキュリティ保護可能なオブジェクト」を参照してください。
注意
Hive メタストアによって管理されるデータのテーブル アクセス制御は、レガシのデータ ガバナンス モデルです。 Databricks では、Hive メタストアによって管理されるテーブルを Unity Catalog メタストアにアップグレードすることをお勧めします。 Unity Catalog は、アカウントの複数のワークスペースにまたがってデータ アクセスを管理および監査するための中心的な場所を提供することで、データのセキュリティとガバナンスを簡素化します。 レガシの特権モデルと Unity Catalog 特権モデルの違いについて詳しくは、「Unity Catalog と従来の Hive メタストアの使用」をご覧ください。
必要条件
- 管理者は、ワークスペースに対してテーブル アクセス制御を有効にして適用する必要があります。
- クラスターでは、テーブル アクセス制御を有効にする必要があります。
注意
- ワークスペースのテーブル アクセス制御が "有効になっていない" 場合でも、Databricks SQL ではデータ アクセス制御が "常に有効"になります。
- ワークスペースでテーブル アクセス制御が有効になっており、ワークスペースに ACL (特権の付与と拒否) を既に指定している場合、それらの ACL は Databricks SQL で尊重されます。
Hive メタストア内のオブジェクトに対する特権を管理する
Hive メタストアによって管理されるデータ オブジェクトに対する特権は、ワークスペース管理者またはオブジェクトの所有者によって付与できます。 Hive メタストア オブジェクトの特権を管理するには、SQL コマンドを使用します。
SQL で特権を管理するには、次の構文を使用して、ノートブックまたは Databricks SQL クエリ エディターで GRANT、REVOKE、DENY、MSCK、および SHOW GRANTS ステートメントを使用します。
GRANT privilege_type ON securable_object TO principal
各値の説明:
privilege_type
は Hive メタストア特権の種類ですsecurable_object
は、Hive メタストア内のセキュリティ保護可能なオブジェクトですprincipal
は、ユーザー、サービス プリンシパル (applicationId 値で表される)、またはグループです。 特殊文字を含むユーザー、サービス プリンシパル、およびグループ名は、バックティック (` `
) で囲む必要があります。 「プリンシパル」を参照してください。
ワークスペース内のすべてのユーザーに権限を付与するには、users
グループに権限を付与します。 次に例を示します。
GRANT SELECT ON TABLE <schema-name>.<table-name> TO users
Hive メタストア内のオブジェクトに対する SQL コマンドを使用した特権の管理の詳細については、「Hive メタストアの特権とセキュリティ保護可能なオブジェクト」を参照してください。
Databricks Terraform プロバイダーと databricks_sql_permissions を使用して、完全に自動化されたセットアップでテーブル アクセス制御を管理することもできます。
オブジェクトの所有権
クラスターまたは SQL ウェアハウスでテーブル アクセス制御が有効な場合、スキーマ、テーブル、ビュー、または関数を作成するユーザーが、その所有者になります。 所有者にはすべての特権が付与され、他のユーザーに特権を付与できます。
グループがオブジェクトを所有する場合があります。その場合、そのグループのすべてのメンバーは所有者と見なされます。
オブジェクトの所有者またはワークスペース管理者は、次のコマンドを使用してオブジェクトの所有権を譲渡できます。
ALTER <object> OWNER TO `<user-name>@<user-domain>.com`
Note
クラスターまたは SQL ウェアハウスでテーブル アクセス制御が無効になっている場合、スキーマ、テーブル、またはビューの作成時に所有者は登録されません。 ワークスペース管理者は、ALTER <object> OWNER TO
コマンドを使用して、オブジェクトに所有者を割り当てる必要があります。
Hive メタストアのセキュリティ保護可能なオブジェクト
セキュリティ保護可能なオブジェクトは次のとおりです。
CATALOG
: データ カタログ全体へのアクセスを制御します。SCHEMA
: スキーマへのアクセスを制御します。TABLE
: マネージドまたは外部のテーブルへのアクセスを制御します。VIEW
: SQL ビューへのアクセスを制御します。FUNCTION
: 名前付き関数へのアクセスを制御します。
ANONYMOUS FUNCTION
: 匿名または一時関数へのアクセスを制御します。注意
ANONYMOUS FUNCTION
オブジェクトは Databricks SQL ではサポートされません。ANY FILE
: 基になるファイルシステムへのアクセスを制御します。警告
ANY FILE
へのアクセスを許可されたユーザーは、ファイル システムから直接読み取って、カタログ、スキーマ、テーブル、ビューに適用された制限をバイパスできます。
Note
グローバルとローカルの一時ビューに対する権限はサポートされていません。 ローカル一時ビューは同じセッション内でのみ表示され、global_temp
スキーマで作成されたビューは、クラスターまたは SQL ウェアハウスを共有しているすべてのユーザーに表示されます。 ただし、すべての一時ビューで参照される基になるテーブルとビューに対する権限が適用されます。
Hive メタストア オブジェクトに付与できる特権
SELECT
: オブジェクトへの読み取りアクセス権を付与します。CREATE
: オブジェクトを作成する能力を付与します (例: スキーマ内のテーブル)。MODIFY
: オブジェクトに対して、またはオブジェクトからデータを追加、削除、変更する能力を付与します。USAGE
: 能力は付与せずに、スキーマ オブジェクトに対してアクションを実行するための追加の要件です。READ_METADATA
: オブジェクトとそのメタデータを表示する能力を付与します。CREATE_NAMED_FUNCTION
: 既存のカタログまたはスキーマに名前付き UDF を作成する能力を付与します。MODIFY_CLASSPATH
: Spark クラス パスにファイルを追加する能力を付与します。ALL PRIVILEGES
: すべての権限を付与します (上記のすべての権限に変換されます)。
注意
MODIFY_CLASSPATH
特権は、Databricks SQL ではサポートされません。
USAGE
特権
Hive メタストア内のスキーマ オブジェクトに対してアクションを実行するには、ユーザーに、そのアクションを実行する特権に加えて、そのスキーマに対する USAGE
特権が必要です。 次のいずれかによって USAGE
要件が満たされます。
- ワークスペース管理者である
- スキーマに対して
USAGE
特権を持っている、またはスキーマに対してUSAGE
特権を持つグループに所属する CATALOG
に対してUSAGE
特権を持っている、またはUSAGE
特権を持つグループに所属する- スキーマの所有者になるか、スキーマを所有するグループに所属する
スキーマ内のオブジェクトの所有者でも、それを使用するには USAGE
特権が必要です。
特権階層
ワークスペースとすべてのクラスターでテーブル アクセス制御が有効になっている場合、Azure Databricks 内の SQL オブジェクトは階層構造で、特権は下の階層に継承されます。 つまり、CATALOG
に対する特権を許可または拒否すると、カタログ内のすべてのスキーマに対する特権が自動的に許可または拒否されます。 同様に、スキーマ オブジェクトに付与された特権は、そのスキーマ内のすべてのオブジェクトによって継承されます。 このパターンは、セキュリティ保護可能なオブジェクトすべてに該当します。
テーブルに対するユーザー特権を拒否した場合、ユーザーはスキーマ内のすべてのテーブルを一覧表示しようとしてもテーブルを表示できません。 スキーマに対するユーザー特権を拒否すると、カタログ内のすべてのスキーマを一覧表示しようとして、スキーマが存在することをユーザーに確認できません。
動的ビュー関数
Azure Databricks には、Hive メタストアによって管理されるビュー定義の本文で、列レベルと行レベルのアクセス許可を動的に表現できる 2 つのユーザー関数が含まれています。
current_user()
: 現在のユーザー名を返します。is_member()
: 現在のユーザーがワークスペース レベルで特定の Azure Databricks グループのメンバーかどうかを判定します。
次の例では、ユーザーが適切なグループ メンバーシップを持つかどうかを判断するために両方の関数を組み合わせています。
-- Return: true if the user is a member and false if they are not
SELECT
current_user as user,
-- Check to see if the current user is a member of the "Managers" group.
is_member("Managers") as admin
列レベルのアクセス許可
動的ビューを使用して、特定のグループまたはユーザーが表示できる列を制限できます。 auditors
グループに属するユーザーだけが sales_raw
テーブルからメール アドレスを表示できる、次の例を考えます。 分析時に、Spark は CASE
ステートメントをリテラル 'REDACTED'
または列 email
に置き換えます。 この動作により、Spark によって提供される通常のすべてのパフォーマンスの最適化が可能になります。
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
行レベルのアクセス許可
動的ビューを使用すると、行またはフィールドのレベルまでの権限を指定できます。 次の例を考えます。ここでは、managers
グループに属しているユーザーだけが $1,000,000.00 より多いトランザクション金額 (total
列) を表示できます。
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
データ マスク
前の例で示したように、列レベルのマスクを実装すると、適切なグループに所属しない限り、ユーザーが特定の列データを表示できないようにすることができます。 これらのビューは標準の Spark SQL であるため、より複雑な SQL 式を使用してより高度なマスキングを行うことができます。 次の例では、すべてのユーザーがメール ドメインに対して分析を実行できますが、auditors
グループのメンバーはユーザーの完全なメール アドレスを参照できるようにします。
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw