本文为您介绍如何实现将资源(表、UDF等)设置为仅能被指定的用户访问。此方法涉及数据的加密解密算法,属于数据安全管控范畴。
前提条件
您需要提前安装MaxCompute客户端,以实现指定UDF被指定用户访问的操作。详情请参见安装并配置MaxCompute客户端。
背景信息
设置用户访问权限的常见方法有如下几种:
Package方案,通过打包授权进行权限精细化管控。
Package用于解决跨项目空间的数据共享及资源授权问题。通过Package授予用户开发者角色后,用户拥有所有权限,风险不可控。详情请参见基于Package跨项目访问资源。
以下为DataWorks开发者角色的权限。
odps@ xxx desc role role_project_dev; Authorization Type: Policy A projects/sz_mc: * A projects/sz_mc/instances/*: * A projects/sz_mc/jobs/*: * A projects/sz_mc/offlinemodels/*: * A projects/sz_mc/packages/*: * A projects/sz_mc/registration/functions/*: * A projects/sz_mc/resources/*: * A projects/sz_mc/tables/*: * A projects/sz_mc/volumes/*:开发者角色对工作空间中的Package、Functions、Resources和Table默认有全部权限,不符合权限配置的要求。
以下为通过DataWorks添加子账号并赋予开发者角色的权限。
odps@ xxx> show grants for RAM$yxxx.pt@aliyun-test.com:ramtest; [roles] role_project_dev Authorization Type: Policy [role/role_project_dev] A projects/sz_mc: * A projects/sz_mc/instances/*: * A projects/sz_mc/jobs/*: * A projects/sz_mc/offlinemodels/*: * A projects/sz_mc/packages/*: * A projects/sz_mc/registration/functions/*: * A projects/sz_mc/resources/*: * A projects/sz_mc/tables/*: * A projects/sz_mc/volumes/*: *
由此可见,通过打包授权和DataWorks默认的角色都不能满足特定用户访问指定UDF的需求。例如,授予子账号
RAM$xxxxx.pt@aliyun-test.com:ramtest开发者角色,则默认该子账号拥有当前工作空间中全部对象的所有操作权限,详情请参见用户授权。在DataWorks中新建角色进行权限管控。
在DataWorks工作配置页面的MaxCompute高级配置页面,可以对自定义用户角色进行权限管控。在该页面只能针对某个表或项目进行授权,不能对资源和UDF进行授权。
说明更多有关DataWorks工作空间的MaxCompute属性介绍,请参见配置MaxCompute引擎权限。
Role Policy结合Project Policy实现指定用户访问指定UDF。
通过Policy可以精细化地管理具体用户对特定资源的具体权限粒度。
说明为了安全起见,建议初学者使用测试项目来验证Policy。
因此您可以通过Policy方案实现特定UDF被指定用户访问:
如果您不想让其他用户访问工作空间内具体的资源,在DataWorks中添加数据开发者权限后,再根据Role Policy的操作,在MaxCompute客户端将其配置为拒绝访问权限。
如果您需要指定用户访问指定资源,在DataWorks中添加数据开发者权限后,再根据Project Policy的操作,在MaxCompute客户端将其配置为允许访问权限。
操作步骤
创建默认拒绝访问UDF的角色。
在客户端输入如下命令创建角色denyudfrole。
create role denyudfrole;创建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" } ] }设置Role Policy。
在客户端执行如下命令,设置Role Policy文件的存放路径。
put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole;在客户端执行如下命令查看Role Policy。
get policy on role denyudfrole;返回结果如下。
odps@ get policy on role denyudfrole; { "Statement": [{ "Action": ["odps:Read", "odps:List"], "Effect": "Deny", "Resource": ["acs:odps:*:projects/sz_mc/resources/getaddr.jar"]}, { "Action": ["odps:Read", "odps:List"], "Effect": "Deny", "Resource": ["acs:odps:*:projects/sz_mc/registration/functions/getregion"]}], "Version": "1"}在客户端执行如下命令添加子账号至role denyudfrole。
grant denyudfrole to RAM$xxxx.pt@aliyun-test.com:ramtest;
验证拒绝访问UDF的角色是否创建成功。
登录客户端输入
whoami;确认角色。odps@ xxx>whoami; Name: RAM$xxx pt@aliyun-test.com:ramtest End_Point: http://service.odps.aliyun.com/api Tunnel_End_Point: http://dt.cn-shanghai.maxcompute.aliyun.com Project: xxx通过
show grants;查看当前登录用户权限。odps@xxx >show grants; [roles] role_project_dev, denyudfrole Authorization Type: Policy [role/denyudfrole] D projects/xxx/registration/functions/getregion: List | Read D projects/xxx/resources/getaddr.jar: List | Read [role/role_project_dev] A projects/xxx: * A projects/xxx/instances/*: * A projects/xxx/jobs/*: * A projects/xxx/offlinemodels/*: * A projects/xxx/packages/*: * A projects/xxx/registration/functions/*: * A projects/xxx/resources/*: * A projects/xxx/tables/*: * A projects/xxx/volumes/*: *通过查询发现该RAM子账号有两个角色,一个是role_project_dev(即DataWorks默认的开发者角色),另一个是刚自定义创建的denyudfrole。
验证自建UDF以及依赖的包的权限。
odps@ xxx>desc function getregion; FAILED: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilege 'odps:Read' on {acs:odps:*:projects/xxx/resources/xxx}. -->Tips: Pricipal:RAMS xxx.pl@aliyun-esl.com.ramlesl by policy ID:38747231-386f-4018-b792-1da11700dc7e. odps@ xxx>desc resource getaddr.jar; FAILED: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilege 'odps:Read' on {acs:odps:*:pro 1-5788-49b1-82b8-1f4a95c2f9c5. -->Tips: Pricipal:RAMS xxx.pt@aliyun-test.com [xxx] [DEBUG]: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privileg通过上述验证发现,该子账号在拥有DataWorks开发者角色的前提下,没有自建UDF(getregion)的读权限。您还需要结合Project Policy来实现该UDF只能被指定的用户访问。
配置Project Policy。
编写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$xxxx.pt@aliyun-test.com:yangyitest", "Action":["odps:Read","odps:List","odps:Select"], "Resource":"acs:odps:*:projects/sz_mc/registration/functions/getregion" }] }设置Role Policy。
在客户端执行如下命令,设置Role Policy文件的存放路径。
put policy /Users/yangyi/Desktop/project_policy.json;在客户端执行如下命令查看Role Policy。
get policy;返回结果如下。
odps@ xxx>get policy; { "Statement": [{ "Action": ["odps:Read", "odps:List", "odps:Select"], "Effect": "Allow", "Principal": ["RAM$xxxl.pt@aliyun-test.com:yangyitest"], "Resource": ["acs:odps:*:projects/sz_mc/resources/getaddr.jar"]}, { "Action": ["odps:Read", "odps:List", "odps:Select"], "Effect": "Allow", "Principal": ["RAM$yangyi.pt@aliyun-test.com:yangyitest"], "Resource": ["acs:odps:*:projects/sz_mc/registrxxx"] "Version": "1"}通过
whoami;和show grants;进行验证。odps@ xxx whoami; Name: RAM$xxx.pt@aliyun-test.com:yangyitest End_Point: http://service.odps.aliyun.com/api Tunnel_End_Point: http://dt.cn-shanghai.maxcompute.aliyun.com Project: sz_mc odps@ xxx show grants; [roles] role_project_dev Authorization Type: Policy [role/role_project_dev] A projects/sz_mc: * A projects/sz_mc/instances/*: * A projects/sz_mc/jobs/*: * A projects/sz_mc/offlinemodels/*: * A projects/sz_mc/packages/*: * A projects/sz_mc/registration/functions/*: * A projects/sz_mc/resources/*: * A projects/sz_mc/tables/*: * A projects/sz_mc/volumes/*: * [user/RAM$yangyi.pt@aliyun-test.com:yangyitest]运行SQL任务,查看是否仅指定的RAM子账号能够查看指定的UDF和依赖的包。
指定的RAM子账号查看指定的UDF。
odps@ xxx:select getregion('172.xxx.xxx.1'); ID = 2019011409xxx Log view: http://logview.odps.aliyun.com/logview/?h=http://service.odps.aliyun.com/api&p=sz_xxx U00DA2MTU2Myx7IlN0YXR1xxx/hZCJdLCJFZmZlY3QiOiJBbGxvxxx biI6IjEifQ== Job Queueing. STAGES STATUS TOTAL COMPLETED RUNNING PENDING BACKU M1_job_0 .......... TERMINATED 1 1 0 0 STAGES: 01/01 [==============================>>] 100% ELAPSED TIME: 24.34 s Summary: resource cost: cpu 0.27 Core * Min, memory 0.53 GB * Min inputs: outputs: Job run time: 18.000 Job run mode: fuxi job Job run engine: execution engine M1: instance count: 1 run time: 18.000 instance time: min: 16.000查看依赖包。
odps# desc resource getaddr.jar; Name getaddr.jar Owner ALIYUNSxxx.pt@oliyun-test.com Type JAR Comment IDE RESOURCE UPDATE TO ODPS /home/admin/oxs-base-biz-phoenix/temp/4d3efccz0l9eiirin53o5n4/getaddr.jar CreatedTime 2018-05-24 19:51:16 LastModifiedTime 2018-05-24 19:51:16 LastUpdator Size 1353716 Md5sum 770497a9f605e09e198cb166cec7fa08