标签:使用权 qfile clear 共享数据 ted 时间 function 安全管理 角色
MaxCompute 多租户的数据安全体系,主要包括如下内容:
用户与授权管理。
在MaxCompute Project中对用户添加(add)、移除(remove)、授权(grant)管理。
还可以通过角色(role)管理授权,MaxCompute project默认有admin role。
而授权方式包含ACL和Policy方式,本文只讲ACL方式,Policy方式待后续升级篇中介绍。
ACL即似于 SQL92 定义的 GRANT/REVOKE 语法,它通过简单的授权语句来完成对已存在的项目空间对象的授权或撤销授权。授权语法如下:
grant actions on object to subject
revoke actions on object from subject
上个小节中介绍了MaxCompute体系包含多种策略,而各种策略赋权是权限递增关系。以需要获取一个L4等级表的权限来展开说明这个递增关系,主要进行以下步骤操作:
第一步: 如果用户未有过授权记录,且非本项目用户,首先需要添加一个 USER(用户),这个过程,用户还没有任何实际权限。
第二步: 赋权 USER(用户)对象的操作权限,有以下方式赋权。
1) 可以是单独的操作权限;
2) 通过 policy 方式赋权给用户;
3) 将 ACL 和 policy 赋权给 role 再赋权给用户。 如果资源是没有设置 Label 的,则此时用户已经拥有的该资源的权限。
第三步: 对于拥有 Label 的资源,例如:数据表、打包了数据表的 package,则还需要 赋权 Label 权限。有以下四钟 Label 赋权:
1) 针对某个数据表的字段;
2) 针对某个数据表;
3) 针对某个 package;
4) 给某个 USER(用户)一个批量的 Label 权限,不支持 ROLE。
各权限赋权过程及关系图如下:
ProjectProtection(数据流出保护机制)是 MaxCompute 防止项目内的数据批量流出的安全功能。 开启数据流程保护后,如果相互之间没有建立“TrustedProject Group” ,与其它 project 的数据赋权就必须通过 Package 方式进行,Package 赋权后,对方 package 可以自主赋权 Package 内的资源给组内用户。
部分资源(例如某些常用表、UDF 等),如想放权给其 Package 管理,也可以通过 Package 的方式,将资源打包后赋权给其他 Project。
ProjectProtection(数据流出保护机制)支持做例外处理,部分特殊的业务场景,可以针 对应用的 IP 地址、产品云账号做 Exception 策略,以满足特殊的数据流出需求。
DataWorks提供多人协同数据开发工作的平台,其安全模型需要考虑几方面:
针对第一点,DataWorks的用户认证,DataWorks对接RAM,云账号可作为主账号进行开通并创建DataWorks项目,而项目成员必须为该主账号的RAM子账号不能是其他云账号。
另外,同个主账号创建的项目作为一个组织,项目与项目之间的任务可以进行依赖配置;不同主账号创建的项目之间数据(各种任务)隔离。
针对第二点,DataWorks通过业务划分“开发项目”、“生产项目”进行任务开发调试和稳定生产的隔离;通过成员角色控制哪个成员可以进行任务开发调试,哪个成员可以运维生产任务等。
针对第三点,DataWorks在MaxCompute Project创建成功的同时,在MaxCompute Project里对应DataWorks的角色创建role,并给不同role赋权。
从前面介绍的MaxCompute和DataWorks两个小节可以知道,通过MaxCompute的安全模型进行权限控制,并不会影响成员在DataWorks任何界面操作。通过DataWorks的用户角色分配,是有可能影响成员的MaxCompute资源权限。下面我们详细介绍这两个产品之间权限如何交叉关联。
通过MaxCompute或DataWorks官网产品页进入的控制台创建的项目,
DataWorks 两种选择:
云账号在DataWorks项目中只能是主账号即项目owner,在MaxCompute既可以为owner也可以为普通user。当通过DataWorks项目成员管理添加成员时只能是添加当前项目主账号对应的RAM子账号。而MaxCompute可以通过命令行add user xxx;
命令添加其他云账号。
如前面小节(DataWorks安全模型)说的DataWorks为了解决项目成员在ETL过程中需要的MaxCompute相关资源权限,绑定了一些MaxCompute role。具体是指DataWorks项目固定有几个成员角色,同时在对应MaxCompute project上创建了对应几个role。另外MaxCompute project本身除了project owner,也还有一个admin role。
具体权限对应如下表:
MaxCompute角色 | MaxCompute数据权限 | DataWorks成员角色 | 平台权限特征 |
---|---|---|---|
project owner | MaxCompute project的owner,拥有所有project的权限。 | 无 | 无 |
admin | 每一个project在创建时,会自动创建一个 admin 的role,并且为该role授予了确定的权限:可以访问project的所有对象、对user或role进行管理、对user或role进行授权。 与project Owner 相比,admin 角色不能将 admin 权限指派给用户,不能设定项目空间的安全配置,不能修改项目空间的鉴权模型,admin 角色所对应的权限不能被修改。 project owner可以将这admin role赋权给一个user,让该user代理安全管理。 |
无 | 无 |
role_project_admin | project/table/fuction/resource/instance/job/package 的所有权限 | 项目管理员 | 指项目空间的管理者,可对该项目空间的基本属性、数据源、当前项目空间计算引擎配置和项目成员等进行管理,并为项目成员赋予项目管理员、开发、运维、部署、访客角色。 |
role_project_dev | project/fuction/resource/instance/job/package/table 的所有权限 | 开发 | 开发角色的用户能够创建工作流、脚本文件、资源和 UDF,新建/删除表,同时可以创建发布包,但不能执行发布操作。 |
role_project_pe | project/fuction/resource/instance/job 的所有权限,拥有package 的 read 权限和table 的 read/describe 权限。 | 运维 | 运维角色的用户由项目管理员分配运维权限;拥有发布及线上运维的操作权限,没有数据开发的操作权限。 |
role_project_deploy | 默认无权限 | 部署 | 部署角色与运维角色相似,但是它没有线上运维的操作权限。 |
role_project_guest | 默认无权限 | 访客 | 访客角色的用户只具备查看权限,没有权限进行编辑工作流和代码等操作。 |
role_project_security | 默认无权限 | 安全管理员 | 安全管理员仅在数据保护伞中用到,用于敏感规则配置,数据风险审计等 |
由上表可知,DataWorks角色对应的MaxCompute权限是固定的,一旦某个user通过DataWorks角色获取MaxCompute相关role权限后,又通过命令行方式获得MaxCompute的其他权限,会使该user在MaxCompute的权限与在DataWorks上看到的不一致。
一个DataWorks项目空间绑定一个MaxCompute project,此时根据DataWorks的项目管理——MaxCompute设置中的“MaxCompute访问身份”这个属性设置决定DataWorks其他项目成员是否拥有MaxCompute project的权限。
标准模式,一个DataWorks项目空间绑定两个MaxCompute project,此时固定MaxCompute的project一个是开发项目一个是生产项目,DataWorks其他项目成员根据成员角色拥有MaxCompute 开发project对应的role权限,但没有MaxCompute生产project的权限,MaxCompute 任务需要走发布流程发布到生产project后以owner账号提交到MaxCompute执行。
操作类型 | DataWorks用户管理 | MaxCompute用户管理 |
---|---|---|
操作描述 | 准确添加和管理用户,应删除或锁定,无属主、闲置以及离职人员的账号权限,严控管理员、运维权限。 | 应删除或锁定,无属主、闲置以及离职人员的账号权 限。 通过DataWorks新增的用户,注意会可能授权于默认的 role。 |
操作角色 | 项目管理员 | owner或admin role |
现状查看 | DataWorks项目管理页模块的——项目成员管理查看现有成员及角色,并确认各个成员权限的合理性。 | 查看项目下的用户:list users; ;查看指定用户拥有的权限: show grants for <username>; |
赋权操作 | DataWorks项目管理页模块的——项目成员管理添加成员和分配角色。注意: 1.只能添加该项目负责人账号下的RAM子账号为项目成员; 2.添加一个成员,并分配角色,可能会在MaxCompute 赋予默认的 role 权限。具体可参看前面《MaxCompute & DataWorks用户和权限关系图》小节 |
成员仅加入 MaxCompute project,不在DataWorks 项目成员中体现,且无任何权限。 需要结合“对象操作”、“Role 权限”、“label 权限”才能使用,所以应关注成员是否拥有“对象操作”和“label 权限”,并对相应授权进行清理。 另外,可以添加云账号和RAM子账号。 在项目空间中添加用户: add user <username>; |
回退操作 | 清理成员或对应角色权限,删除后,会自动清除对应 MaxCompute 内的 user 和默认 role。 | 在项目空间中移除用户:remove user <username>; |
操作类型 | MaxCompute role管理 | DataWorks角色管理 |
---|---|---|
操作描述 | 准确的创建role并配置role权限,及时清理离职或转岗人员的账号,清理role中不必要开放的资源和权限。 MaxCompute project创建成功后除了默认有admin role外,DataWorks还给创建几个role具体可参考前面《成员角色权限关系》小节。 |
准确的分配角色,成员工作性质发生改变需及时改变角色,严格控制项目管理员和运维角色的分配。 |
操作角色 | project owner或admin | 项目管理员 |
现状查看 | 查看当前project所有role:list roles; 查看role中的权限: describe role <role_name>; 查看某用户在什么role中: show grants for <username>; 查看某个role都指派给哪些user:目前暂不支持! |
DataWorks项目管理->成员管理页面,可以点击每个角色查看该角色下的成员。 |
赋权操作 | MaxCompute除了默认的role,还可以自定义role,通过命令自定义role权限并将role授权给user。 创建role: Create role <role_name>; 给角色授权: grant actions on object to <role_name>; 添加用户到角色: GRANT <roleName> TO <full_username> ; 此外,DataWorks的项目管理->MaxCompute高级配置->自定义用户角色页面,可以通过界面方式创建MaxCompute自定义role、对role进行授权、将role授权给成员,但是注意通过命令行创建的role不会在这个界面显示。 |
DataWorks角色是固定的不能自定义,成员添加到DataWorks项目时勾选角色分配给成员,该成员既可拥有对应角色的权限。 |
回退操作 | 删除角色中的用户:REVOKE <roleName> FROM <full_username>; 撤销对角色的授权: revoke <privList> on <objType> <objName> from role <rolename>; 删除角色: DROP ROLE <roleName>; 如果是通过DataWorks的项目管理->MaxCompute高级配置->自定义用户角色页面创建的role,也通过这个页面进行回退操作。 |
DataWorks的角色不能删除,只能将某个成员的角色去掉。 |
操作类型 | 说明 |
---|---|
操作描述 | 回收非必须必要的对象操作授权,操作权限涉及多种操作对象和类型,应逐一确认。 |
操作角色 | project owner或admin role |
现状查看 | 查看指定用户的权限:show grants for <username>; 查看当前用户的权限: show grants; 查看指定对象的授权列表: show acl for <objectName> [on type <objectType>]; 查看某 package 赋权情况案例: show acl for alipaydw.alipaydw_for_alisec_app on type package; |
赋权操作 | 进行某对象的操作赋权:grant actions on object to subject; 操作、主体、客体类型表达式: actions 类型: action_item1, action_item2, ... object 类型: project project_name,table schema_name ,instance inst_name ,function func_name ,resource res_name subject 类型: user full_username ,role role_name 操作、主体、客体类型,详细说明请看官方文档。 |
回退操作 | 回收某对象的操作权限:revoke actions on object from subject; |
操作类型 | 说明 |
---|---|
操作描述 | 角色(Role)可以打包多个 ACL 权限。当需要对一组用户赋予相同的权限,或者多ACL 权限时,可以使用角色(Role)来授权。 |
操作角色 | project owner或admin role |
现状查看 | 查看指定角色的赋权内容,以及拥有该权限用户:describe role <rolename>; 查看指定用户拥有哪些 role 及 ACL: show grants for <username>; 查看当前用户的 role 及 ACL: show grants; |
赋权操作 | 1. 创建角色:create role <rolename>; 2. 给用户指派某种角色: grant <rolename> to <username>; 3. 给角色打包 ACL,有两种方式: 方法一:逐一执行 ACL 授权命令。: grant actions on object to role <rolename>; 操作、主体、客体类型表达式: actions 类型: action_item1, action_item2, ... object 类型: project project_name , table schema_name ,instance inst_name , function func_name , resource res_name 操作、主体类型,详细说明见官方文档。 方法二:新建 policy 文件,将 policy 映射给 role。 Put policy <policy 文件所在本地位置> on role <rolename>; 案例: PUT POLICY D:\sx_default.txt ON ROLE sx_default; 将存放在 D 盘根目录下的 policy 文件 sx_default.txt,映射给 sx_default 角色;Policy 配置详见《policy 的授权》小节 |
回退操作 | 1. 删除角色:drop role <rolename>; 2. 撤销角色指派: revoke <rolename> from <username>; 3. 更改角色打包的 ACL,两种方式: 方法一:逐一执行 ACL 更改授权命令。 revoke actions on object from role <rolename>; 方法二:更改 policy 文件,将新的 policy 映射给 role。 Put policy <policy 文件所在本地位置> on role <rolename>; |
操作类型 | 说明 |
---|---|
操作描述 | 开启 ProjectProtection 的项目,如果没有在同一个互信项目组(TrustedProject Group),则必须使用 package 方式赋权,package 赋权有两种方式。确保package 合理打包和赋权,无闲置 package 赋权。 |
操作角色 | project owner |
现状查看 | 1. 了解本项目 Package 创建及赋权情况: 查看已创建和已安装的 Package 列表: show packages; 查看 Package 详细信息: describe package <pkgname>; 2. 本项目安装的 Package ,对用户的授权情况: show acl for <project_name.package_name> on type package; |
赋权操作 | Package创建者: 1. 创建 Package: create package <pkgname>; 2. 将分享的资源添加到 Package: add project_object to package package_name [with privileges privileges]; project_object 表达式: table table_name ,instance inst_name ,function func_name ,resource res_name 3. 许可其他项目空间使用 Package: allow project <prjname> to install package <pkgname> [using label<number>]; Package使用者: 1. 安装 Package: install package <pkgname>; 2. 将 package 赋权给用户、角色,package赋权给具体用户时,不能指定 label。(project owner 或admin 都可操作) grant actions on package <pkgName> to user <username>; grant actions on package <pkgName> to role <role_name>; actions 类型:参考官方文档,一般将Package的 read权限赋给对象既可满足对象访问package里的资源。 |
回退操作 | 1. 撤销其他项目空间使用 Package 的许可:disallow project <prjname> to install package <pkgname>; 2. 删除 Package: delete package <pkgname>; 3. 将分享的资源移出 Package: remove project_object from package package_name; project_object 表达式: table table_name ,instance inst_name ,function func_name ,resource res_name 4. 撤销 package 的用户、角色的权限。 revoke actions on package <pkgName> from user <username>; revoke actions on package <pkgName> from role <role_name>; |
操作类型 | 说明 |
---|---|
操作描述 | Maxcompute的字段、表、package 分为 1~4 个等级,应根据用户实际需要,赋予对应的 label 权限。 |
操作角色 | project owner |
现状查看 | 1. 查看一个用户能访问哪些敏感数据集:SHOW LABEL [<level>] GRANTS [FOR USER <username>]; --省略 [FOR USER <username>]时,查看当前用户所能访问的敏感数据集. --省略<level>时,将显示所有 label 等级的授权; --若指定<level>,则只显示指定等级的授权. 2. 查看一个敏感数据表能被哪些用户访问: SHOW LABEL [<level>] GRANTS ON TABLE <tablename>;--显示指定 table 上的 Label 授权 3. 查看一个用户对一个数据表的所有列级别的 Label 权限: SHOW LABEL [<level>] GRANTS ON TABLE <tablename> FOR USER <username>; --显示指定用户对指定 table 上列级别的 Label 授权 |
赋权操作 | 1. 给用户单个表或字段的安全许可标签。GRANT LABEL <number> ON TABLE <tablename>[(column_list)] TO USER <username> [WITH EXP <days>]; --默认过期时间是 180 天 举例: GRANT LABEL 2 ON TABLE t1 TO USER alice WITH EXP 1; --显式授权alice 访问 t1 表中敏感度不超过 2 级的数据,授权有效期为 1 天 GRANT LABEL 3 ON TABLE t1(col1, col2) TO USER alice WITH EXP 1; --显式授权 alice 访问 t1(col1, col2)中敏感度不超过3 级的数据,授权有效期为 1 天 2. 给用户授权整个项目的安全许可标签。 SET LABEL <number> TO USER <username>; 3. 控制 package 安装者对 package 中敏感资源的许可访问级别 ALLOW PROJECT <prjName> TO INSTALL PACKAGE <pkgName> [USING LABEL <number>];--由 package 创建者授权,授予 package 安装者对 package 中敏感资源的许可访问级别 4. 将 package 赋权给用户、角色,package 赋权给具体用户时,不能指定 label。 grant actions on package <pkgName> to user <username>; grant actions on package <pkgName> to role <role_name>; |
回退操作 | 1. 撤销用户单个表或字段的安全许可标签。 【撤销授权】: REVOKE LABEL ON TABLE <tablename>[(column_list)] FROM USER <username>; 【清理过期的授权】: CLEAR EXPIRED GRANTS; 举例: REVOKE LABEL ON TABLE t1 FROM USER alice;--撤销 alice对 t1 表的敏感数据访问 2. 更改用户授权整个项目的安全许可标签,默认等级为 0。 SET LABEL <number> TO USER <username>; 3. 更改 package 安装者对 package 中敏感资源的许可访问级别,调整为其他级别,默认为 0。 ALLOW PROJECT <prjName> TO INSTALL PACKAGE <pkgName> [USING LABEL <number>]; 4. 撤销 package 的用户、角色的权限。 revoke actions on package <pkgName> from user <username>; revoke actions on package <pkgName> from role <role_name>; |
项目空间的数据保护主要解决“不允许用户将数据转移到项目空间之外”的需求。
操作类型 | 说明 |
---|---|
操作描述 | 设置 ProjectProtection 避免项目批量数据下载到本地电脑,出现批量数据泄露风险。 |
操作角色 | project owner |
查看现状 | 执行命令:show SecurityConfiguration; 查是否 ProjectProtection=true |
操作设置 | 设置 ProjectProtection 机制,默认为 false; 两个方法设置: DataWorks界面上设置: 进入DataWorks项目管理->MaxCompute设置->基本设置页面,把“项目空间数据保护”属性打开。 命令行方式执行MaxCompute命令: SET ProjectProtection=true [WITH EXCEPTION <policyFile>]; 开启后由于部分公共账号,个人用户因种种原因需要数据流出权限,根据需要附带 exception 例外策略(白名单),exception policy具体看升级篇介绍。 以下情形建议配置 Exception 策略: 1) 需要数据流出权限的应用系统云账号或 IP 地址。 2) 个人账号开通白名单,应指定允许下载的表。 添加项目互信: 对于数据可互通的 project 可以通过项目互信的方式确保数据顺利流转。 查看当前project 中的所有 TrustedProjects: list trustedprojects; 在当前 project 中添加一个 TrustedProject add trustedproject <projectname>; 在当前 project 中移除一个 TrustedProject: remove trustedproject <projectname>; 未添加TrustedProject 的项目,申请本项目数据,需要以 package 方式授权。 |
回退操作 | 关闭 ProjectProtection 机制:SET ProjectProtection=false; 移除 TrustedProject: remove trustedproject <projectname> ; |
基于标签的安全(LabelSecurity)是项目空间级别的一种强制访问控制策略(Mandatory Access Control, MAC),它的引入是为了让项目空间管理员能更加灵活地控制用户对列级别敏感数据的访问。
操作类型 | 说明 |
---|---|
操作描述 | 打开 LabelSecurity 确保字段级别安全控制生效, 项目空间中的 LabelSecurity 安全机制默认是关闭的。 |
操作角色 | project owner |
查看现状 | show SecurityConfiguration; 查是否 LabelSecurity=true |
操作设置 | 开启 LabelSecurity 机制,默认为 false。Set LabelSecurity=true; |
回退操作 | 关闭 LabelSecurity 机制:Set LabelSecurity=false; 操作前,需要确认外部 project 数据的依赖情况,是否赋于了表的 label 权限。 |
操作类型 | 说明 |
---|---|
操作描述 | MaxCompute数据的敏感性可以分为 0~4 级。所有数据表,可以设置安全等级,避免数据表出现不合理授权访问情形。 |
查看现状 | 查看 MaxCompute表字段的等级,两个方式: 方式一,执行命令: DESCRIBE <tablename>; 方式二:在DataWorks的数据管理查看表详情中的字段信息。 |
操作设置 | 给表字段设置安全级别可以通过两种方式: 方式一【推荐此方式】: DataWorks的数据管理里,新建表或者编辑已有表的字段信息,均可以设置字段安全级别。(注意,只有Project的LabelSecurity=true,数据管理页面才可见字段安全级别属性。) 方式二,执行命令: SET LABEL <number> TO TABLE tablename[(column_list)]; -- number 取值范围:[0, 4]。 举例: SET LABEL 1 TO TABLE t1; --设置表 t1 的 label 为 1 级 SET LABEL 2 TO TABLE t1(mobile, addr); --将 t1 的 mobile,addr 两列的 label 设置为 2 级 SET LABEL 3 TO TABLE t1; --设置表 t1 的 label 为 3 级. 注意此时 mobile,addr 两列的 label 仍为 2 级 注意:通过命令行设置自动安全级别后,在DataWorks的数据管理界面,对应表字段安全等级不同步,因此,建议通过DataWorks对表的字段进行安全级别设置 |
回退操作 | 将安全等级调整回原来等级。注意:字段安全等级的上调,会导致原有的授权失效(涉及 package 授权、生产账号和个人账号),调整前必须通知到受影响用户,以减少影响。 |
操作类型 | 说明 |
---|---|
操作描述 | 设置IP白名单,指定白名单列表中的IP(console或者SDK所在的出口IP)能够访问这个Project。 注: 1.当前project的所有user(包括主账号)都会受限。 2.DataWorks的机器默认在白名单内,因此通过DataWorks提交MaxCompute任务不会受此限制。 |
操作角色 | project owner |
查看现状 | 通过console执行命令:setproject; 查看对应的‘odps.security.ip.whitelist= ’若等号后面为空则未设置白名单列表 |
操作设置 | 设置前请特别注意:在白名单list加上自己当前机器IP,以免把自己屏蔽。 通过console执行命令: setproject odps.security.ip.whitelist=xxx.xxx.xxx.xxx,xxx.xxx.x.x/xx,xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx; 白名单中IP列表的表示格式有三种。 单纯IP:例如101.132.236.134。 子网掩码:100.116.0.0/16。 网段:101.132.236.134-101.132.236.144。 设置IP白名单后,您需要等待五分钟后才会生效。 若需更精细化管理,也可以通过policy授权,可参考后面的案例《project Policy 案例》。 |
回退操作 | IP白名单清空后,MaxCompute就认为Project关闭了白名单功能。setproject odps.security.ip.whitelist=; |
操作类型 | 说明 |
---|---|
描述 | 开发者通过DataWorks进行数据分析,通常会屏显在IDE上并且可以下载结果。project设置ProjectProtection为true后,在本project中只要有表的读取权限,依然可以通过DataWorks的开发界面select后进行结果下载。 |
操作角色 | DataWorks管理员 |
查看现状 | 进入DataWorks的项目管理->项目设置页面,查看“在本项目中能下载select结果”属性是否打开。 |
操作设置 | 进入DataWorks的项目管理->项目设置页面,关闭“在本项目中能下载select结果”开关。 |
回退操作 | 进入DataWorks的项目管理->项目设置页面,打开“在本项目中能下载select结果”开关。 |
使用MaxCompute过程中,会关联使用到其他的云服务,因此也需要考虑通过其他云服务提高MaxCompute的安全管理。本章节主要介绍通过DataWorks使用MaxCompute时,添加项目成员必须会用到RAM子账号,那么如何在RAM子账号服务上提高安全管理。
前面《MaxCompute安全模型》章节中提到MaxCompute的用户认证“支持 云账号 和 RAM 账号 两种账号体系,对于RAM账号,仅识别账号体系不识别RAM权 限体系,即可将主账号自身的任意 RAM 子账号加入 MaxCompute 的某一个项目中,但 MaxCompute 在对该 RAM 子账号做权限验证时,并不会考虑 RAM 中的权限定义。” 因此,我们只需要从RAM子账号登录验证入手进行安全控制。
子账号密码强度设置
如果您允许子用户更改登录密码,那么应该要求他们创建强密码并且定期轮换。
您可以通过 RAM 控制台设置密码策略,如最短长度、是否需要非字母字符、必须进行轮换的频率等等。
子账号登录掩码设置
通过设置网络掩码决定哪些IP地址会受到登录控制台的影响,子用户必须只能从指定的IP地址进行登录。
及时撤销用户不再需要的权限
当一个子账号对应员工由于工作职责变更而不再使用权限时,应该及时将对应子账号的权限撤销。
标签:使用权 qfile clear 共享数据 ted 时间 function 安全管理 角色
原文地址:https://www.cnblogs.com/zhaowei121/p/10276807.html