Hive metastore権限とセキュリティ保護対象オブジェクト(レガシー)
この記事では、各Databricksワークスペースに組み込まれているレガシーDatabricks Hive metastoreの特権モデルについて説明します。また、組み込み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コマンドを使用して管理できます。
SQLで権限を管理するには、ノートブックまたはDatabricks SQLクエリエディタで、次の構文のGRANT、REVOKE、DENY、MSCK、およびSHOW GRANTSステートメントを使用します。
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
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