暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DLA的权限操作的基本体验

云原生数据湖 2020-11-02
209


一、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地址;

    有兴趣的加入:

文章转载自云原生数据湖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论