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クエリエディタで、次の構文のGRANTREVOKEDENYMSCK、およびSHOW GRANTSステートメントを使用します。

GRANT privilege_type ON securable_object TO principal

ここで:

ワークスペース内のすべてのユーザーに権限を付与するには、 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権限を持つグループに属している

  • CATALOGUSAGE権限を持っているか、USAGE権限を持つグループに属している

  • スキーマの所有者であるか、スキーマを所有するグループに属している

スキーマ内のオブジェクトの所有者であっても、それを使用するにはUSAGE権限が必要です。

権限の階層

ワークスペースとすべてのクラスターでテーブルのアクセス制御が有効になっている場合、DatabricksのSQLオブジェクトは階層構造になり、権限は下位に継承されます。つまり、CATALOGの権限を付与または拒否すると、カタログ内のすべてのスキーマに対する権限が自動的に付与または拒否されます。同様に、スキーマオブジェクトに付与された権限は、そのスキーマ内のすべてのオブジェクトに継承されます。このパターンは、セキュリティ保護対象のすべてのオブジェクトに当てはまります。

テーブルのユーザー権限を拒否すると、ユーザーはスキーマ内のすべてのテーブルを一覧表示しようとしてもテーブルを表示できません。スキーマのユーザー権限を拒否すると、ユーザーはカタログ内のすべてのスキーマを一覧表示しようとしても、スキーマが存在することを確認できません。

ダイナミックビュー関数

Databricksには、Hive metastoreによって管理されるビュー定義の本文で列レベルと行レベルの権限を動的に表すことができる2つのユーザー関数があります。

  • current_user():現在のユーザー名を返します。

  • is_member(): 現在のユーザーがワークスペース レベルの特定の Databricks グループのメンバー であるかどうかを判断します。

Databricks Runtime 7.3 LTSでこれらの関数を使用するには、Spark構成spark.databricks.userInfoFunctions.enabled trueを設定する必要があります。これらは、7.3より前のサポートされているすべてのDatabricks Runtimeバージョンでデフォルトで有効になっています。

次の例では、両方の関数を組み合わせて、ユーザーが適切なグループメンバーシップを持っているかどうかを判断します。

-- 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