在DataWorks中实现指定UDF只能被指定帐户访问

背景

以前写过一篇文章是关于“DataWorks和MaxCompute内部权限体系的区别”有兴趣的朋友能够点击阅读查看详情。可是仍是有些同窗会问,我如何在DataWorks中实现个人具体某个Resource,Table仍是UDF只能被我指定的用户所使用的权限管控。这个UDF可能涉及到数据的加解密算法,属于数据安全管控范围了。html

常见方案

  1. package方案,经过打包受权进行权限精细化管控。
  2. DataWorks上新建角色(管理>MaxCompute高级配置>自定义用户角色)来进行高级管控。
  3. Role policy方案,经过role policy来自定义role的权限集合。

可选方案

(1)package方案,经过打包受权进行权限精细化管控。
package基本知识,一般是为了解决跨项目空间的共享数据及资源的用户受权问题。当经过package后会发现给予其DataWorks开发者角色后用户拥有了全部权限。不可控。算法

  • 首先,普及你们熟知的DataWorks开发者角色的权限以下:

image

从权限配置上看明显不符合咱们的要求,明显看出来其对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/*: *json

  • 其次,经过DataWorks添加了子帐号并赋予了开发者角色,具体以下:

image

上述的普及应该让你们明白,经过打package和DataWorks默认的角色都不可以知足咱们的需求。好比我将子帐号RAM$yangyi.pt@aliyun-test.com:ramtest并给予开发者角色,那么他就默认拥有这个当前项目里全部Object的全部action权限,具体详见安全

(2)DataWorks上新建角色(管理>MaxCompute高级配置>自定义用户角色)来进行高级管控。可是在DataWorks-MaxCompute高级配置中只能针对某个表/某个项目进行受权,不能对resource和udf进行受权。测试

(3)role policy方案,经过policy能够精细化的管理到具体用户针对具体资源的具体权限粒度,能够知足咱们的场景需求。可是policy机制的官方文档一直没有公开,主要考虑到用户是否熟悉policy不然使用起来会形成必定的困扰和问题,耽误开发效率。spa

Role policy方案

为了安全起见,建议初学者找个测试项目来验证policy。如下操做都是经过MaxCompute console完成,具体详见:console配置3d

① 建立默认拒绝访问UDF角色

step1:建立一个role  denyudfrole,以下:
odps@ sz_mc>create role denyudfrole;code

step2:建立policy受权文件,以下:htm

{
"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。以下:
odps@ sz_mc>put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole;

imageblog

step4:添加用户至role denyudfrole。
odps@ sz_mc>grant denyudfrole to RAM$yangyi.pt@aliyun-test.com:ramtest;

至此咱们验证下,以子帐号RAM$yangyi.pt@aliyun-test.com:ramtest登陆MaxCompute console。
一、登陆console确认角色。

image

二、show grants查看当前登陆用户权限。

image

能够看出来,该RAM子帐号有两个角色,一个是role_project_dev其实就是DataWorks默认的开发者角色,一个是咱们刚自定义建立的denyudfrole。

三、验证自建UDF以及依赖的包的权限。

image

image

验证成功,该子帐号在拥有了DataWorks开发者角色的前提下并无自建UDF:getregion的读权限。可是离咱们指望只能指定某个用户来访问该UDF还差最后一步。须要结合project policy来解决此需求。

配置project policy

step1:编写policy。

{
"Version": "1", "Statement":
[{
"Effect":"Allow",
"Principal":"RAM$yangyi.pt@aliyun-test.com:yangyitest",
"Action":["odps:Read","odps:List","odps:Select"],
"Resource":"acs:odps:*:projects/sz_mc/resources/getaddr.jar"
},
{
"Effect":"Allow",
 "Principal":"RAM$yangyi.pt@aliyun-test.com:yangyitest",
"Action":["odps:Read","odps:List","odps:Select"],
"Resource":"acs:odps:*:projects/sz_mc/registration/functions/getregion"
}] }

step2:设置和查看policy。
odps@ sz_mc>put policy /Users/yangyi/Desktop/project_policy.json;

image

验证下:

image

跑一个SQL看看:

image

查看依赖的包:

image

--->到此为止,咱们完成了需求。指定项目下只有指定的RAM子帐号可以访问指定的UDF和依赖的包。

总结

有些同窗到这里可能清晰的认识了DataWorks和MaxCompute的安全体系,可是有些同窗可能还比较晕。总结以下:

  1. 不想其访问具体资源的,在DataWorks中添加数据开发者权限后再在MaxCompute console上按照role policy配置为拒绝访问权限。
  2. 指定帐户访问资源的,在DataWorks配置数据数据开发者权限后再再MaxCompute console上按照project policy配置为容许访问权限。
  3. 具体实例详见上述,能够知足咱们的精细化管理需求。
相关文章
相关标签/搜索