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

GRANT privilege_type ON securable_object TO principal

各値の説明:

ワークスペース内のすべてのユーザーに権限を付与するには、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 グループのメンバーかどうかを判定します。

Note

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 式を使用してより高度なマスキングを行うことができます。 次の例では、すべてのユーザーがメール ドメインに対して分析を実行できますが、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