1. 程式人生 > >在DataWorks中實現指定UDF只能被指定賬戶訪問

在DataWorks中實現指定UDF只能被指定賬戶訪問

在DataWorks中實現指定資源被指定賬戶訪問

背景

之前寫過一篇文章是關於“DataWorks和MaxCompute內部許可權體系的區別”有興趣的朋友可以點選閱讀檢視詳情。但是還是有些同學會問,我如何在DataWorks中實現我的具體某個Resource,Table還是UDF只能被我指定的使用者所使用的許可權管控。這個UDF可能涉及到資料的加解密演算法,屬於資料安全管控範圍了。

常見方案

  1. package方案,通過打包授權進行許可權精細化管控。
  2. DataWorks上新建角色(管理>MaxCompute高階配置>自定義使用者角色)來進行高階管控。
  3. Role policy方案,通過role policy來自定義role的許可權集合。

可選方案

(1)package方案,通過打包授權進行許可權精細化管控。
package基本知識,通常是為了解決跨專案空間的共享資料及資源的使用者授權問題。當通過package後會發現給予其DataWorks開發者角色後用戶擁有了所有許可權。不可控。

  • 首先,普及大家熟知的DataWorks開發者角色的許可權如下:

image.png
從許可權配置上看明顯不符合我們的要求,明顯看出來其對project中的package、functions、resources和table預設有全部許可權。
A projects/sz_mc/packages/*: *
A projects/sz_mc/registration/functions/*: *


A projects/sz_mc/resources/*: *
A projects/sz_mc/tables/*: *

  • 其次,通過DataWorks添加了子賬號並賦予了開發者角色,具體如下:

image.png

上述的普及應該讓大家明白,通過打package和DataWorks預設的角色都不能夠滿足我們的需求。比如我將子賬號[email protected]:ramtest並給予開發者角色,那麼他就預設擁有這個當前專案裡所有Object的所有action許可權,具體詳見

(2)DataWorks上新建角色(管理>MaxCompute高階配置>自定義使用者角色)來進行高階管控。但是在DataWorks-MaxCompute高階配置中只能針對某個表/某個專案進行授權,不能對resource和udf進行授權。

(3)role policy方案,通過policy可以精細化的管理到具體使用者針對具體資源的具體許可權粒度,可以滿足我們的場景需求。但是policy機制的官方文件一直沒有公開,主要考慮到使用者是否熟悉policy否則使用起來會造成一定的困擾和問題,耽誤開發效率。

Role policy方案

為了安全起見,建議初學者找個測試專案來驗證policy。以下操作都是通過MaxCompute console完成,具體詳見:console配置

① 建立預設拒絕訪問UDF角色

step1:建立一個role  denyudfrole,如下:
[email protected] sz_mc>create role denyudfrole;

step2:建立policy授權檔案,如下:

{
"Version": "1", "Statement":

[{
"Effect":"Deny",
"Action":["odps:Read","odps:List"],
"Resource":"acs:odps:*:projects/sz_mc/resources/getaddr.jar"
},
{
"Effect":"Deny",
"Action":["odps:Read","odps:List"],
"Resource":"acs:odps:*:projects/sz_mc/registration/functions/getregion"
}
 ] }

step3:設定和檢視role policy。如下:
[email protected] sz_mc>put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole;
image.png

step4:新增使用者至role denyudfrole。
[email protected] sz_mc>grant denyudfrole to [email protected]:ramtest;

至此我們驗證下,以子賬號[email protected]:ramtest登入MaxCompute console。
1、登入console確認角色。
image.png

2、show grants檢視當前登入使用者許可權。
image.png

可以看出來,該RAM子賬號有兩個角色,一個是role_project_dev其實就是DataWorks預設的開發者角色,一個是我們剛自定義建立的denyudfrole。

3、驗證自建UDF以及依賴的包的許可權。
image.png

image.png

驗證成功,該子賬號在擁有了DataWorks開發者角色的前提下並沒有自建UDF:getregion的讀許可權。但是離我們期望只能指定某個使用者來訪問該UDF還差最後一步。需要結合project policy來解決此需求。

配置project policy

step1:編寫policy。

{
"Version": "1", "Statement":
[{
"Effect":"Allow",
"Principal":"[email protected]:yangyitest",
"Action":["odps:Read","odps:List","odps:Select"],
"Resource":"acs:odps:*:projects/sz_mc/resources/getaddr.jar"
},
{
"Effect":"Allow",
 "Principal":"[email protected]:yangyitest",
"Action":["odps:Read","odps:List","odps:Select"],
"Resource":"acs:odps:*:projects/sz_mc/registration/functions/getregion"
}] }

step2:設定和檢視policy。
[email protected] sz_mc>put policy /Users/yangyi/Desktop/project_policy.json;

image.png

驗證下:
image.png

跑一個SQL看看:
image.png

檢視依賴的包:
image.png

--->到此為止,我們完成了需求。指定專案下只有指定的RAM子賬號能夠訪問指定的UDF和依賴的包。

總結

有些同學到這裡可能清晰的認識了DataWorks和MaxCompute的安全體系,但是有些同學可能還比較暈。總結如下:

  1. 不想其訪問具體資源的,在DataWorks中新增資料開發者許可權後再在MaxCompute console上按照role policy配置為拒絕訪問許可權。
  2. 指定賬戶訪問資源的,在DataWorks配置資料資料開發者許可權後再再MaxCompute console上按照project policy配置為允許訪問許可權。
  3. 具體例項詳見上述,可以滿足我們的精細化管理需求。