Hive metastore権限とセキュリティ保護対象オブジェクト(レガシー)
この記事では、各Databricksワークスペースに組み込まれている、従来のDatabricks Hive metastoreの権限モデルについて説明します。また、組み込みのHive metastore内のオブジェクトに対する権限の付与、拒否、および取り消しの方法についても説明します。Unity Catalogは、権限付与に関して異なるモデルを採用しています。Unityカタログの権限に関するリファレンスを参照してください。
Hive metastoreによって管理されるデータに対するテーブルアクセスコントロールは、従来型のデータガバナンスモデルです。Databricksは、Hive metastoreで管理されているテーブルをUnity Catalog metastoreにアップグレードすることを推奨します。Unity Catalogは、アカウント内の複数のワークスペースにわたるデータアクセスを管理および監査するための一元的な場所を提供することで、データのセキュリティとガバナンスを簡素化します。従来の権限モデルと Unity Catalog の権限モデルの違いについて詳しくは、 「Unity Catalog と併用して従来の Hive metastore を操作する」を参照してください。
要件
- 管理者は、ワークスペースのテーブルアクセスコントロールを有効にして適用する必要があります。
- クラスターは、 テーブルアクセスコントロールに対して有効にする必要があります。
- データアクセスコントロールは、ワークスペースに対してテーブルアクセスコントロールが 有効になっていない 場合でも、Databricks SQLでは 常に有効になります 。
- ワークスペースに対してテーブルアクセスコントロールが有効になっていて、ワークスペースでACL(付与された特権と拒否された特権)を既に指定している場合、それらのACLはDatabricks SQLで尊重されます。
Hive metastore内のオブジェクトに対する権限の管理
Hive metastoreによって管理されるデータオブジェクトに対する権限は、ワークスペース管理者またはオブジェクトの所有者が付与できます。Hive metastoreオブジェクトの権限は、SQLコマンドを使用して管理できます。
SQLで権限を管理するには、ノートブックまたはDatabricks SQLクエリエディタで、次の構文のGRANT、REVOKE、DENY、MSCK、およびSHOW GRANTSステートメントを使用します。
GRANT privilege_type ON securable_object TO principal
ここで:
privilege_typeHive metastore権限タイプですsecurable_objectはHive metastore内のセキュリティ保護対象オブジェクトprincipalは、ユーザー、サービスプリンシパル(applicationId値で表される)、またはグループです。特殊文字を含むユーザー名、サービスプリンシパル名、およびグループ名は、バッククォート (` `) で囲む必要があります。プリンシパルを参照してください。
ワークスペース内のすべてのユーザーに権限を付与するには、usersグループに権限を付与します。例えば:
GRANT SELECT ON TABLE <schema-name>.<table-name> TO users
SQLコマンドを使用してHive metastore内のオブジェクトの権限の管理について詳しくは、「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