數據對象的權限

磚的數據治理模型允許您以編程方式格蘭特,否認和撤銷從火花SQL訪問你的數據。這個模型允許您控製可獲得的訪問對象和目錄一樣,模式(數據庫)、表、視圖和函數。它還允許細粒度訪問控製表的特定子集,例如)通過設置權限視圖創建來自任意查詢。磚的SQL查詢分析器執行這些訪問控製策略在運行時在磚集群表啟用訪問控製和所有SQL倉庫。

本文描述了特權、對象和所有權規則構成磚蜂巢metastore數據治理模型。它還描述了如何格蘭特,否認和撤銷對象特權。

統一目錄使用不同的模型授予特權。看到統一目錄權限和可獲得的對象

需求

管理對象特權的要求取決於您的環境:

磚數據科學與工程和磚的機器學習

數據治理模型

本節描述磚數據治理模型。可獲得的數據對象的訪問是由特權。

可獲得的對象

可獲得的對象是:

  • 目錄:控製訪問整個數據目錄。

    • 模式:控製訪問模式。

      • :控製訪問管理或外部表。

      • 視圖:控製訪問SQL視圖。

      • 函數:控製訪問命名函數。

  • 匿名函數:控製訪問匿名的或臨時的功能

    請注意

    匿名函數對象不支持在磚SQL。

  • 任何文件:控製訪問底層文件係統。

    警告

    用戶授權訪問任何文件可以繞過這些限製的目錄、模式、表和視圖通過閱讀直接從文件係統。

特權

  • 選擇:給對象的讀訪問權。

  • 創建:給有能力創建一個對象(例如,一個表在模式)。

  • 修改:給能夠添加、刪除和修改數據或從一個對象。

  • 使用:不給任何的能力,但是是一個額外的需求模式對象上執行任何操作。

  • READ_METADATA:給視圖對象及其元數據的能力。

  • CREATE_NAMED_FUNCTION:提供能力在現有的目錄中創建一個名為UDF或模式。

  • MODIFY_CLASSPATH:給文件添加到火花類路徑的能力。

  • 所有特權:給所有特權(翻譯成所有上麵的特權)。

請注意

MODIFY_CLASSPATH特權在磚不支持SQL。

使用特權

模式對象上執行操作,用戶必須有使用特權模式上除了特權執行該動作。任何一個下麵的滿足使用要求:

  • 是一個管理

  • 使用特權模式或一組的使用的特權模式

  • 使用上的特權目錄或在一群的使用特權

  • 模式的所有者或擁有一組模式

即使是一個對象的所有者必須在一個模式使用特權來使用它。

例如,管理員可以定義一個金融組和一個會計模式使用。建立一個模式,隻有財務團隊可以使用和分享,管理員會執行以下操作:

創建模式會計;格蘭特使用模式會計金融;格蘭特創建模式會計金融;

這些權限的成員金融組織可以創建的表和視圖會計模式,但不能分享這些表或視圖與任何主要的沒有使用會計模式。

磚數據科學與工程和磚的運行時版本的行為
  • 集群運行磚運行時7.3 LTS以上執行使用特權。

  • 集群運行磚7.2運行時,不執行以下使用特權。

  • 確保現有工作負載功能不變,在工作區使用訪問控製表使用介紹了有嗎使用上的特權目錄授予的用戶組。如果你想利用的使用特權,您必須運行撤銷使用目錄用戶然後格蘭特使用根據需要。

特權等級

當啟用訪問控製表工作區和所有集群,磚的SQL對象繼承層次和特權。這意味著允許或拒絕的特權目錄自動授予或拒絕目錄中的所有模式的特權。同樣,特權授予一個schema對象繼承了所有對象的模式。這種模式適用於所有可獲得的對象。

如果你拒絕一個用戶權限表,用戶看不到試圖列出所有表的表模式。如果你拒絕一個用戶權限模式,模式存在的用戶看不到試圖列出目錄中的所有模式。

對象所有權

當啟用訪問控製表在集群或SQL倉庫,用戶創建一個模式,表、視圖或函數成為它的主人。所有者授予所有特權和權限授予其他用戶。

組可能的對象,在這種情況下,所有成員的組織被認為是主人。

所有權決定你是否可以派生對象上的特權授予其他用戶。例如,假設用戶擁有用戶B表T和贈款選擇特權在表T .即使用戶從表T, B可以選擇用戶B不能授予選擇特權用戶表T C,因為用戶仍然是底層表的主人T .此外,用戶B不能繞過這個限製,隻需創建一個視圖在表T和V授予特權查看用戶C C .當磚檢查權限的用戶訪問視圖V,它還檢查V和底層表T的主人都是相同的。如果業主不相同,用戶C也必須有選擇底層表T上的特權。

當表訪問控製集群是禁用的,沒有注冊所有者是當一個模式,創建表、視圖或函數。測試如果一個對象有一個所有者,運行顯示獎助金<對象名稱>。如果您沒有看到一個條目ActionType自己的,對象沒有一個所有者。

老板分配給對象

一個對象的所有者或管理員可以使用該對象的所有權轉移改變<對象>老板' <用戶名> @ <用戶域>。com”命令:

改變模式<模式- - - - - -的名字>老板' <用戶- - - - - -的名字> @ <用戶- - - - - ->com改變<- - - - - -的名字>老板group_name改變視圖<視圖- - - - - -的名字>老板' <用戶- - - - - -的名字> @ <用戶- - - - - ->com改變函數<函數- - - - - -的名字>老板' <用戶- - - - - -的名字> @ <用戶- - - - - ->com

用戶和組

管理員和用戶可以授予權限用戶和組。每個用戶唯一標識的用戶名在磚(通常映射到他們的電子郵件地址)。所有的用戶都是隱式地“所有用戶”組的一部分,表示為用戶在SQL。

請注意

你必須附上用戶規範引號(),而不是單引號()。

操作和特權

在磚,管理員用戶可以管理所有對象特權,有效地給所有可獲得的所有特權,可以改變任何對象的所有者。一個對象的所有者可以執行任何操作對象,該對象上的特權授予其他主體,並能將對象的所有權轉移到另一個校長。唯一限製對象的所有者的特權模式;與一個模式中的對象進行交互的用戶也必須有使用在這個模式。

下麵的表映射SQL操作所需的權限來執行該操作。

請注意

  • 任何一種特權的地方在一個表、視圖,或功能是必需的,使用還需要在模式的。

  • 在任何地方一個表中引用一個命令,也可以引用的道路。在這些情況下選擇修改上都需要任何文件而不是使用在模式和另一個特權在桌子上。

  • 對象所有權這裏表示自己的特權。

操作

需要的特權

克隆

能力選擇從表中被克隆,創建模式,修改如果一個表被取代。

複製到

選擇任何文件如果抄襲一個路徑,修改在桌子上被複製到。

創建BLOOMFILTER索引

自己的在桌子上被索引。

創建模式

創建目錄

創建表

要麼自己的或兩個使用創建的模式。

創建視圖

要麼自己的或兩個使用創建的模式。

創建函數(外部)

要麼自己的使用CREATE_NAMED_FUNCTION的模式。如果指定一個資源MODIFY_CLASSPATH目錄也是必需的。

創建函數(SQL)

要麼自己的使用的模式。

創建模式

創建目錄

改變模式

自己的的模式。

ALTER TABLE

通常修改在桌子上。自己的如果授予權限表,改變其所有者或地點,或重命名它。

改變觀點

自己的在視圖中。

BLOOMFILTER指數下降

自己的在桌子上。

刪除模式

自己的的模式。

刪除表

自己的在桌子上。

刪除視圖

自己的在視圖中。

刪除函數

自己的在功能上。

解釋

READ_METADATA表和視圖。

描述表

READ_METADATA在桌子上。

描述曆史

自己的在桌子上。

選擇

選擇在桌子上。

插入

修改在桌子上。

恢複表

修改在桌子上。

更新

修改在桌子上。

合並成

修改在桌子上。

刪除從

修改在桌子上。

截斷表

修改在桌子上。

優化

修改在桌子上。

真空

修改在桌子上。

FSCK修理表

修改在桌子上。

MSCK

自己的在桌子上。

格蘭特

自己的在對象上。

秀獎助金

自己的對象,或用戶授權。

否認

自己的在對象上。

撤銷

自己的在對象上。

重要的

當你使用訪問控製表,下降語句是區分大小寫的。如果一個表名是小寫下降引用的表名使用混合或大寫,下降語句將失敗。

管理對象特權

您使用格蘭特,否認,撤銷,MSCK,顯示獎助金管理對象特權操作。

請注意

  • 一個對象的所有者或管理員可以執行格蘭特,否認,撤銷,顯示獎助金操作。然而,管理員不能否認或撤消特權,特權從一個所有者。

  • 主要不是一個所有者或管理員可以執行一個操作隻有在所需的特權被授予。

  • 授予、否認或撤銷的特權所有用戶指定關鍵字用戶。例如,

    格蘭特選擇任何文件用戶

例子

格蘭特選擇模式<模式- - - - - -的名字>' <用戶> @ <- - - - - -的名字> '格蘭特選擇匿名函數' <用戶> @ <- - - - - -的名字> '格蘭特選擇任何文件' <用戶> @ <- - - - - -的名字> '顯示獎助金' <用戶> @ <- - - - - -的名字> '模式<模式- - - - - -的名字>否認選擇<- - - - - -的名字>' <用戶> @ <- - - - - -的名字> '撤銷所有特權模式默認的' <用戶> @ <- - - - - -的名字> '撤銷選擇<- - - - - -的名字>' <用戶> @ <- - - - - -的名字> '格蘭特選擇任何文件用戶

動態視圖功能

磚包括兩個用戶功能,允許你表達列和行級權限動態視圖定義的體內。

  • current_user ():返回當前用戶的名稱。

  • is_member ():判斷當前用戶屬於一個特定的磚集團

請注意

在磚運行時7.3 LTS及以上。然而,在磚使用這些函數運行時7.3 LTS,你必須設置火花配置spark.databricks.userInfoFunctions.enabled真正的

考慮下麵的例子,它結合了兩個函數來確定用戶擁有適當的組成員:

——返回:如果用戶是一個成員,如果他們不是假的選擇current_user作為用戶,——檢查當前用戶是否屬於“經理”。is_member(“經理”)作為管理

允許管理員設定為多個用戶和組細粒度權限在單個視圖表達和強大,同時節省管理開銷。

列級權限

通過動態視圖很容易限製列一個特定的組或用戶可以看到的東西。考慮下麵的例子隻屬於用戶審計人員集團能夠看到的電子郵件地址sales_raw表。在分析時引發取代了情況下語句和文字“修訂”或列電子郵件。這種行為讓所有常見的性能優化提供的火花。

——別名字段“電子郵件”本身(如電子郵件)預防——允許邏輯從直接出現在列名的結果。創建視圖sales_redacted作為選擇user_id,情況下is_member(“審計師”)然後電子郵件其他的“修訂”結束作為電子郵件,國家,產品,sales_raw

行級權限

使用動態視圖可以指定權限的行或領域的水平。考慮下麵的例子,隻有屬於用戶經理組能夠看到事務量(列)大於1000000美元:

創建視圖sales_redacted作為選擇user_id,國家,產品,sales_raw在哪裏情況下is_member(“經理”)然後真正的其他的< =1000000結束;

數據屏蔽

如前麵的示例所示,您可以實現列級屏蔽,以防止用戶看到特定的列數據,除非他們在正確的組。因為這些觀點是標準的火花SQL,你能做的更高級類型的掩蔽與更複雜的SQL表達式。下麵的例子可以讓所有用戶對郵件執行分析領域,但允許的成員審計人員組看到用戶的完整的電子郵件地址。

——regexp_extract函數接受一個電子郵件地址等——user.x.lastname@example.com和提取“例子”,允許——分析師查詢域名創建視圖sales_redacted作為選擇user_id,地區,情況下is_member(“審計師”)然後電子郵件其他的regexp_extract(電子郵件,“^ * @ (. *)$。”,1)結束sales_raw

常見問題(FAQ)

我怎麼格蘭特、否認或撤銷所有用戶特權嗎?

指定關鍵字用戶。例如:

格蘭特選擇<模式- - - - - -的名字><- - - - - -的名字>用戶

我創建了一個對象,但現在我不能查詢,刪除,或者修改它。

這個錯誤可能發生,因為你創建了對象在集群或SQL倉庫沒有表啟用訪問控製。當表訪問控製是禁用的集群上或SQL倉庫,業主不注冊模式,創建表或視圖。管理員必須分配一個所有者對象使用以下命令:

改變(模式||視圖]<對象- - - - - -的名字>老板' <用戶- - - - - -的名字> @ <用戶- - - - - ->com;

我如何給予全球和本地臨時視圖上的特權?

全球和本地臨時視圖上的特權不受支持。當地臨時視圖是可見的隻有在同一個會話,和視圖中創建的global_temp模式是可見的所有用戶共享一個集群或SQL倉庫。然而,特權在底層表和視圖引用的任何臨時視圖執行。

如何授予用戶或組多個表上的特權呢?

資助、否認或revoke語句隻能應用到一個對象。推薦的方式組織給予主要是通過多個表上的特權模式。授予一個主要選擇特權模式暗中資助,校長選擇特權模式中的所有表和視圖。例如,如果一個模式D表t1和t2,和下麵的管理問題格蘭特命令:

格蘭特使用,選擇模式D' <用戶> @ <- - - - - -的名字> '

校長<用戶> @ <域名>可以選擇從表t1和t2,以及所有表和視圖中創建的模式在未來D。

如何授予用戶權限對所有表除了一個嗎?

你批準選擇特權模式,然後否認選擇特權為特定的表你想限製。

格蘭特使用,選擇模式D' <用戶> @ <- - - - - -的名字> '否認選擇DT' <用戶> @ <- - - - - -的名字> '

校長<用戶> @ <域名>可以選擇從所有表除了D.T.嗎

一個用戶選擇表T的一個視圖上的特權,但當用戶試圖選擇從這一觀點,他們得到的錯誤用戶特權選擇

這種常見的錯誤可能發生以下原因之一:

  • 表T沒有注冊車主,因為它是使用一個集群或SQL創建倉庫的表訪問控製是禁用的。

  • 的委托人選擇特權的觀點表T不是表的所有者或用戶不也有選擇選擇表T特權。

假設有一個表T a旗下擁有視圖V1 T和B擁有查看V2。

  • 用戶可以選擇在V1當理所當然選擇視圖上的特權V1。

  • 用戶可以選擇在V2當理所當然選擇表T和B上的特權選擇V2上的特權。

中描述的那樣對象所有權節中,這些條件確保隻有一個對象的所有者可以授予其他用戶訪問該對象。

我試著運行sc.parallelize集群上啟用了表的訪問控製,它就會失敗。

在集群表啟用訪問控製可以隻使用SQL和Python DataFrame api的火花。抽樣API無效出於安全原因,因為磚沒有在一個抽樣檢查和授權代碼的能力。

我想從infrastructure-as-code管理權限

你可以在一個完全自動化的管理表訪問控製設置使用磚起程拓殖的提供者databricks_sql_permissions:

資源”databricks_sql_permissions”“foo_table”{表=“foo”privilege_assignments{校長=“serge@example.com”特權=(“選擇”,“修改”)}privilege_assignments{校長=“特殊群體”特權=["選擇"]}}