數據對象的權限
磚的數據治理模型允許您以編程方式格蘭特,否認和撤銷從火花SQL訪問你的數據。這個模型允許您控製可獲得的訪問對象和目錄一樣,模式(數據庫)、表、視圖和函數。它還允許細粒度訪問控製表的特定子集,例如)通過設置權限視圖創建來自任意查詢。磚的SQL查詢分析器執行這些訪問控製策略在運行時在磚集群表啟用訪問控製和所有SQL倉庫。
本文描述了特權、對象和所有權規則構成磚蜂巢metastore數據治理模型。它還描述了如何格蘭特,否認和撤銷對象特權。
統一目錄使用不同的模型授予特權。看到統一目錄權限和可獲得的對象。
數據治理模型
本節描述磚數據治理模型。可獲得的數據對象的訪問是由特權。
可獲得的對象
可獲得的對象是:
目錄
:控製訪問整個數據目錄。模式
:控製訪問模式。表
:控製訪問管理或外部表。視圖
:控製訪問SQL視圖。函數
:控製訪問命名函數。
匿名函數
:控製訪問匿名的或臨時的功能。請注意
匿名函數
對象不支持在磚SQL。任何文件
:控製訪問底層文件係統。警告
用戶授權訪問
任何文件
可以繞過這些限製的目錄、模式、表和視圖通過閱讀直接從文件係統。
特權
選擇
:給對象的讀訪問權。創建
:給有能力創建一個對象(例如,一個表在模式)。修改
:給能夠添加、刪除和修改數據或從一個對象。使用
:不給任何的能力,但是是一個額外的需求模式對象上執行任何操作。READ_METADATA
:給視圖對象及其元數據的能力。CREATE_NAMED_FUNCTION
:提供能力在現有的目錄中創建一個名為UDF或模式。MODIFY_CLASSPATH
:給文件添加到火花類路徑的能力。所有特權
:給所有特權(翻譯成所有上麵的特權)。
請注意
的MODIFY_CLASSPATH
特權在磚不支持SQL。
對象所有權
當啟用訪問控製表在集群或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操作所需的權限來執行該操作。
請注意
任何一種特權的地方在一個表、視圖,或功能是必需的,
使用
還需要在模式的。在任何地方一個表中引用一個命令,也可以引用的道路。在這些情況下
選擇
或修改
上都需要任何文件
而不是使用
在模式和另一個特權在桌子上。對象所有權這裏表示
自己的
特權。
操作 |
需要的特權 |
---|---|
能力 |
|
|
|
|
|
|
|
要麼 |
|
要麼 |
|
要麼 |
|
要麼 |
|
|
|
|
|
通常 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
重要的
當你使用訪問控製表,下降表
語句是區分大小寫的。如果一個表名是小寫下降表
引用的表名使用混合或大寫,下降表
語句將失敗。
管理對象特權
您使用格蘭特
,否認
,撤銷
,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來' <用戶> @ <域- - - - - -的名字> '否認選擇在表D。T來' <用戶> @ <域- - - - - -的名字> '
校長<用戶> @ <域名>
可以選擇從所有表除了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{校長=“特殊群體”特權=["選擇"]}}