一、DLA的权限模型
DLA是有自己的账号体系(与阿里云的账号不同),基于此DLA做了两层权限验证机制,确保您的数据被安全访问:
DLA层授权和校验,基于MySQL语法而定义和实现(Grant:dev.mysql.com/doc/refma、Revoke:dev.mysql.com/doc/refma、Show Grants:dev.mysql.com/doc/refma)
数据源和RAM层授权和校验,基于RAM的的访问控制而实现(比如OSS、TableStore等云原生产品):help.aliyun.com/product,或者基于数据源本身的权限校验(比如RDS,是自建账号,因而也有自建权限系统)
用户的SQL发送到DLA,做完DLA的权限校验后,再转发到后端数据源层,执行RAM层和数据源的权限校验,最后再真正访问到用户的数据;
二、DLA层校验原理
DLA是根据用户操作对象的范围“从大到小”验证的,从Global级(全局权限),到Schema级,再到Table级,最后到Column级(目前不支持)一层层验证权限。MySQL/DLA的权限遵循“正向白名单”机制,任何一层有权限就校验成功,到最后一层也没权限时校验失败:

三、DLA层授权方法
基本上参考了MySQL的Grant/Revoke/Show Grants/Show users等语法来实现:
-- 用户相关
select user(); --获取当前用户的名称
select current_user(); --获取当前用户的名称
show users(); -- 展示所有账号的列表,只有root才会看到其他账号;
-- grant相关
GRANT {SELECT | SHOW | ALTER | DROP | CREATE | INSERT | UPDATE | DELETE | GRANT OPTION | ALL | ALL PRIVILEGES | USAGE }
ON {* | *.* | xxDb.* | xxDb.yyTable | yyTable }
TO { oa_1234546 | 'oa_123456' | 'oa_123456'@'1.2.3.4'}
[WITH grant option]
-- revoke相关
REVOKE {SELECT | SHOW | ALTER | DROP | CREATE | INSERT | UPDATE | DELETE |GRANT OPTION | ALL | ALL PRIVILEGES | USAGE}
ON {* | *.* | xxDb.* | xxDb.yyTable | yyTable }
FROM { oa_1234546 | 'oa_123456' | 'oa_123456'@'1.2.3.4'}
-- show grants相关
SHOW GRANTS
[for [ current_user | current_user() | oa_123456 | 'oa_123456' | 'oa_123456'@'localhost'] ]
相关概念说明:
(当前授权人) grant 权限列表 on 资源列表 to 被授权人信息 [with grant option]
(当前授权人) revoke 权限列表 on 资源列表 from 被授权人信息
授权人:
只能由DLA的root账号给其他非Root账号授权;
暂时不支持非Root账号给其他账号授权;
不能跨云账号授权和回收权限;
权限列表:
可以用 ',' 连接在一起,比如:SELECT,DELETE,UPDATE,INSERT,...
有ALL或ALL PRIVILEGES就会全部授权或者全部回收,无视其他的Privilege;但一定要注意,grant option这个权限本身,不包含在ALL中,必须显式授权或者回收;
暂时不支持其他类型的授权;
SELECT是为Query授权;
SHOW为show、use命令授权(这里与mysql的逻辑差异比较大);
ALTER为alter或其他变更型的ddl授权;
CREATE、DROP、INSERT、UPDATE、DELETE为对应类型的DDL或DML授权;
GRANT OPTION为dcl授权(grant和revoke相关);可以在Privilege中指定GRANT OPTION,也可以通过语句片段with grant option来做grant 授权;
USAGE表示基本的使用能力;
资源列表:
* 假设了 当前连接已经使用了某个库xxDB 的前提下,然后针对xxDB做授权,Schema级别权限;
. 表示所有库的所有表授权,Global级别权限;
xxDb.* 表示针对xxDB这个库做授权,Schema级别权限;
xxDb.yyTable 表示针对xxDB库的xxTable做授权,Schema级别权限;
yyTable 假设了 当前连接已经使用了某个库xxDB 的前提下,针对xxDB库的xxTable做授权,Table级别权限;
暂时不支持Column级别的授权;
被授权用户定义:
直接写用户名:oa_123456
用户字符串来表示:'oa_123456'
用户@地址:'oa_123456'@'1.1.1.1',但目前即使写了ip、host信息,也不会用于连接的白名单校验;
针对SHOW GRANTS等约束:
只有相同云账号下的Root用户才能为别人show grants;
不能跨不同uid执行show grant
必须有show权限和grant权限或为本人自己,才能执行show grants;
SHOW GRANTS FOR 'jeffrey'@'localhost':目前不支持ip地址;
有兴趣的加入:





