Hive metastore 特権とセキュリティ保護可能なオブジェクト (レガシ)
この記事では、各DatabricksHive metastore Databricksワークスペースに組み込まれているレガシ の特権モデルについて説明します。また、組み込み Hive metastore内のオブジェクトに対する特権を付与、拒否、および取り消す方法についても説明します。 Unity Catalog では、特権の付与に異なるモデルが使用されます。 「Unity Catalog の特権とセキュリティ保護可能なオブジェクト」を参照してください。
Hive metastoreによって管理されるデータのテーブルアクセスコントロールは、従来のデータガバナンスモデルです。Databricks では、Hive metastoreによって管理されているテーブルを Unity Catalog メタストアにアップグレードすることをお勧めします。Unity Catalog は、アカウント内の複数のワークスペースにわたるデータアクセスを一元的に管理および監査するための場所を提供することで、データのセキュリティとガバナンスを簡素化します。 従来の権限モデルとUnity Catalog権限モデルの違いについて詳しくは、「Unity Catalogと従来のHive metastoreの操作」を参照してください。
必要条件
- 管理者は、ワークスペースの テーブルアクセスコントロールを有効にして適用 する必要があります。
- クラスターは、 テーブルアクセスコントロールに対して有効にする必要があります。
- データアクセスコントロールは、ワークスペースに対してテーブルアクセスコントロールが 有効になっていない 場合でも、Databricks SQLでは 常に有効になります 。
- ワークスペースに対してテーブルアクセスコントロールが有効になっていて、ワークスペースでACL(付与された特権と拒否された特権)を既に指定している場合、それらのACLはDatabricks SQLで尊重されます。
Hive metastore内のオブジェクトに対する権限の管理
Hive metastoreによって管理されるデータオブジェクトに対する権限は、ワークスペース管理者またはオブジェクトの所有者が付与できます。Hive metastoreオブジェクトの権限は、SQLコマンドを使用して管理できます。
SQLGRANTREVOKEDENYMsckSHOW GRANTSで権限を管理するには、ノートブックまたはDatabricks SQL クエリエディタで 、 、 、 、および ステートメントを次の構文で使用します。
GRANT privilege_type ON securable_object TO principal
ここで:
privilege_type
Hive metastore権限タイプであるsecurable_object
は、Hive metastore内のセキュリティ保護可能なオブジェクトですprincipal
はユーザー、サービスプリンシパル (applicationId 値で表される)、またはグループです。 ユーザー、サービスプリンシパル、およびグループの名前は、バッククォート (
ワークスペース内のすべてのユーザーに権限を付与するには、 users
グループに権限を付与します。 例えば:
GRANT SELECT ON TABLE <schema-name>.<table-name> TO users
Hive metastoreSQLコマンドを使用した 内のオブジェクトの特権の管理の詳細については、「内の特権とセキュリティ保護可能なオブジェクトHive metastore 」を参照してください。
また、 Databricks Terraform プロバイダーと databricks_sql_permissionsを使用して、完全に自動化されたセットアップでテーブルアクセスコントロールを管理することもできます。
オブジェクトの所有権
クラスターまたはSQLウェアハウスでテーブルアクセスコントロールが有効になっている場合、スキーマ、テーブル、ビュー、または関数を作成したユーザーがその所有者になります。所有者にはすべての権限が付与されるほか、他のユーザーに権限を付与できます。
グループはオブジェクトを所有できます。その場合、そのグループのすべてのメンバーが所有者と見なされます。
オブジェクトの所有者またはワークスペース管理者は、次のコマンドを使用してオブジェクトの所有権を譲渡できます。
ALTER <object> OWNER TO `<user-name>@<user-domain>.com`
テーブルアクセスコントロール がクラスター ウェアハウスまたは SQLウェアハウスで無効になっている場合、スキーマ、テーブル、またはビューの作成時に所有者は登録されません。 ワークスペース管理者は、 ALTER <object> OWNER TO
コマンドを使用してオブジェクトに所有者を割り当てる必要があります。
Hive metastore内のセキュリティ保護可能なオブジェクト
セキュリティ保護対象オブジェクトには次のものがあります。
-
CATALOG
:データカタログ全体へのアクセスを制御します。SCHEMA
:スキーマへのアクセスを制御します。TABLE
:マネージドテーブルまたは外部テーブルへのアクセスを制御します。VIEW
:SQLビューへのアクセスを制御します。FUNCTION
:名前付き関数へのアクセスを制御します。
-
ANONYMOUS FUNCTION
: 匿名または一時機能へのアクセスを制御します。
ANONYMOUS FUNCTION
オブジェクトはDatabricks SQLではサポートされていません。
ANY FILE
:基盤となるファイルシステムへのアクセスを制御します。
ANY FILE
へのアクセスを許可されたユーザーは、ファイルシステムから直接読み取ることで、カタログ、スキーマ、テーブル、およびビューに課せられた制限を回避できます。
グローバルおよびローカルの一時ビューに対する権限はサポートされていません。 ローカルの一時ビューは同じセッション内でのみ表示され、global_temp
スキーマで作成されたビューは、クラスターまたは SQLウェアハウスを共有するすべてのユーザーに表示されます。 ただし、一時ビューによって参照される基になるテーブルとビューに対する権限は適用されます。
Hive metastoreオブジェクトに付与できる権限
SELECT
:オブジェクトに読み取り権限を付与します。CREATE
:オブジェクト(スキーマのテーブル等)を作成できるようになります。MODIFY
:オブジェクトからデータを追加、削除、修正できるようになります。USAGE
:特に効果はありませんが、スキーマオブジェクトでアクションを実行するための追加要件です。READ_METADATA
:オブジェクトとそのメタデータが表示可能になります。CREATE_NAMED_FUNCTION
:既存のカタログまたはスキーマに名前付きUDFを作成できるようになります。MODIFY_CLASSPATH
:Sparkクラスパスにファイルを追加できるようになります。ALL PRIVILEGES
:すべての権限を付与します(他のすべての権限に変換されます)。
MODIFY_CLASSPATH
権限はDatabricks SQLではサポートされていません。
USAGE
特典
Hive metastore内のスキーマオブジェクトに対してアクションを実行するには、ユーザーは、そのアクションを実行する権限に加えて、そのスキーマに対するUSAGE
権限を持っている必要があります。USAGE
要件を満たすのは、次のいずれかの場合です。
- ワークスペース管理者である
- スキーマの
USAGE
権限を持っているか、スキーマのUSAGE
権限を持つグループに属している CATALOG
のUSAGE
権限を持っているか、USAGE
権限を持つグループに属している- スキーマの所有者であるか、スキーマを所有するグループに属している
スキーマ内のオブジェクトの所有者であっても、それを使用するにはUSAGE
権限が必要です。
特権階層
ワークスペースとすべてのクラスターでテーブルのアクセス制御が有効になっている場合、DatabricksのSQLオブジェクトは階層構造になり、権限は下位に継承されます。つまり、CATALOG
の権限を付与または拒否すると、カタログ内のすべてのスキーマに対する権限が自動的に付与または拒否されます。同様に、スキーマオブジェクトに付与された権限は、そのスキーマ内のすべてのオブジェクトに継承されます。このパターンは、セキュリティ保護対象のすべてのオブジェクトに当てはまります。
テーブルのユーザー権限を拒否すると、ユーザーはスキーマ内のすべてのテーブルを一覧表示しようとしてもテーブルを表示できません。スキーマのユーザー権限を拒否すると、ユーザーはカタログ内のすべてのスキーマを一覧表示しようとしても、スキーマが存在することを確認できません。
ダイナミック・ビュー機能
Databricksには、Hive metastoreによって管理されるビュー定義の本文で列レベルと行レベルの権限を動的に表すことができる2つのユーザー関数があります。
current_user()
:現在のユーザー名を返します。is_member()
: 現在のユーザーがワークスペース レベルの特定の 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式を使用して、より高度な種類のマスキングを実行できます。次の例では、すべてのユーザーがEメールドメインで分析を実行できるようにしますが、auditors
グループのメンバーのみがユーザーの完全なEメールアドレスを表示できるようにします。
-- 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