1、Data Lake Analytics介绍
数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki...。基于数据湖作分析,能够不用作任何ETL、数据搬迁等前置过程,实现跨各类异构数据源进行大数据关联分析,从而极大的节省成本和提高用户体验。html
阿里云数据湖分析产品Data Lake Analytics(简称DLA):https://www.aliyun.com/produc...
产品文档:https://help.aliyun.com/produ...mysql
下图是DLA的简易架构(__MPP计算引擎+存储计算分离+弹性高可用+异构数据集源等)__:sql
2、自建帐号
目前DLA是以MySQL协议方式对外提供服务,用户须要经过JDBC链接,连到DLA服务。DLA内部的帐号和密码是独立自建的(与RAM不一样),对应的帐号和密码信息,在用户开通DLA服务时以站内信、邮件、短信等方式通知您。数据库
可能您会疑惑,为何DLA不是以RAM或AK帐号作认证和受权,而须要自建帐号。在这里,作一些简单的介绍:后端
DLA是数据库,在客户端创建链接(须要认证)、访问库、表、字段(须要鉴权)时,大量跨服务访问RAM系统,会给RAM系统形成很大压力,且可能会影响DLA服务延时;
DLA是数据库,须要兼容MySQL权限模型,库、表、字段等领域对象很难一一映射到RAM体系;同时RAM下的资源对象的权限粒度可粗可细,且更多偏向于管理数据生命周期而非详细数据层面的权限;
用户习惯的Grant、Revoke、Show grants等逻辑,都是直接和传统数据库的库、表、字段一一映射。
参考了阿里云上及业界云服务平台上其余数据库产品的设计,存在同样的考量;
目前DLA帐号体系与RAM帐号体系的关系:安全
3、三种帐号模型
Root/Service帐号:RAM主帐号在某个Region内开通DLA服务时,系统会自动建立第一个DLA帐户,并以站内信、短信、邮件方式通知RAM主帐号,Root帐号只有一个,不能删除;
User/子帐号:由RAM主帐号后续在Console上建立的新的DLA的User帐号(注意,不是由Root帐号建立的),云帐号用户能够建立、删除User帐号,也能够为其修改密码等;
Product帐号:其余云产品(好比DBS)与DLA交互时,由用户在RAM中为该云产品受权过,由DLA自动产生并派发给云产品的帐号;
Root帐号和User帐号,关联的RAM uid都是对应的云帐号,从而Root和User帐号都有机会访问云帐号全部的资源(固然,这都是在受权管理以内);
4、帐号实测操做
a)开通服务并初始化服务
找到服务:架构
购买:测试
开通完成,点击进入控制台:大数据
为不一样的Region初始化服务:ui
初始化完成,获得一个Root帐号:
从新回到主页:https://openanalytics.console...,设置服务访问点:
image.png | left | 747x379
配置服务访问点
image.png | left | 747x431
image.png | left | 747x353
b)链接数据库并经过认证
链接DLA服务,并进入服务
[root]# mysql -u<您的dla用户名> -p<您的dla密码> -h<您的dla服务访问点> -P10000
mysql> show databases;
Empty set (0.09 sec)
image.png | left | 747x213
到此,咱们已经完成了服务开经过程,并认证和链接成功。
c)建立子帐号,并链接数据库
image.png | left | 747x325
image.png | left | 747x206
image.png | left | 747x163
链接DLA服务,并进入服务,也能正常工做了:
image.png | left | 747x233
5、权限模型
DLA中有两层权限验证机制,确保您的数据被安全访问:
DLA层受权和校验校验,基于MySQL语法而定义和实现(Grant:https://dev.mysql.com/doc/ref...、Revoke:https://dev.mysql.com/doc/ref...、Show Grants:https://dev.mysql.com/doc/ref...)
数据源和RAM层受权和校验,基于RAM的的访问控制而实现(好比OSS、TableStore等云原生产品):https://help.aliyun.com/produ...,或者基于数据源自己的权限校验(好比RDS,是自建帐号,于是也有自建权限系统)
用户的SQL发送到DLA,作完DLA的权限校验后,再转发到后端数据源层,执行RAM层和数据源的权限校验,最后再真正访问到用户的数据;
a)DLA层校验原理
DLA是根据用户操做对象的范围“从大到小”验证的,从Global级(全局权限),到Schema级,再到Table级,最后到Column级(目前不支持)一层层验证权限。任何一层有权限校验成功,到最后一层也没权限时校验失败:
image.png | left | 351x557
b)DLA层受权方法
基本上参考了MySQL的Grant/Revoke/Show Grants语法来实现:
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 {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
[for [ current_user | current_user() | oa_123456 | 'oa_123456' | 'oa_123456'@'localhost'] ]
相关关键信息说明:
受权人:
只能由DLA的root帐号给其余非Root帐号受权;
暂时不支持非Root帐号给其余帐号受权;
不能跨云帐号受权和回收权限;
privilege列表:
能够用','链接在一块儿,好比SELECT,DELETE,UPDATE,INSERT,...
有ALL或ALL PRIVILEGES就会所有受权或者所有回收,无视其余的Privilege;但必定要注意,grant option这个权限自己,不包含在ALL中,必须显式受权或者回收
暂时不支持其余类型的受权;
SELECT是为Query受权;
SHOW为show、use命令受权(这里与mysql的逻辑差别比较大);
ALTER为alter或其余变动型的ddl受权;
CREATE为create型的ddl受权;
DROP为drop型的ddl受权;
INSERT为insert型的dml受权;
UPDATE为update型的dml受权;
DELETE为delete型的dml受权;
GRANT OPTION为dcl受权(grant和revoke相关);能够在Privilege中指定GRANT OPTION,也能够经过语句片断with grant option来作grant 受权;
USAGE其实啥也没有,表示为空;
ResourceType中:
. 表示全部库的全部表受权,Global级别权限;
xxDb.* 表示针对xxDB这个库作受权,库级别权限;
xxDb.yyTable 表示针对xxDB库的xxTable作受权,表级别权限;
yyTable 表示当前链接使用了某个库xxDB,针对xxDB库的xxTable作受权,表级别权限;
暂时不支持字段级别的受权;
被受权用户定义:
直接写用户名:oa_123456
用户字符串来表示:'oa_123456'
即便写了ip、host信息,也不会用于链接的白名单校验;
只有相同云帐号下的Root用户才能为别人show grants;
不能跨不一样uid执行show grant
必须有show权限和grant权限才能执行show grants,或者为本人执行__;__
SHOW GRANTS FOR 'jeffrey'@'localhost':目前不支持ip地址;
c)DLA与RAM间权限映射
由于DLA中的子帐号与RAM中的子帐号并非一一对应,于是RAM中资源的权限和DLA中库表的权限也不是天然映射的,而是须要在DLA中以特殊定义的方式来作资源的映射和权限的隔离。
目前DLA中受权单位是Schema级别的,也就意味着若是Root帐号给某个User帐号受权了一个库的权限,那这个User帐号可以访问这个库下全部的表,也就意味着可以访问该库映射到RAM上全部的资源,这些访问并不受RAM的子帐号权限控制。
好比,咱们看一个典型的建库语句(假设用户已经能够在DLA中建立相关的库):
CREATE DATABASE db_name
with dbproperties (
CATALOG = 'ots',
LOCATION = 'https://test-hangzhou.ots.ali...',
INSTANCE = 'test'
)
若是Root帐号给某个User帐后执行Grant操做后,该User帐号就能够访问这个库:
grant all on db_name.* to xxx_s1519122757;
上述过程都假设云帐号的系统角色受权已经完成,下一节咱们介绍首先如何完成系统角色受权,从而容许DLA访问你在其余云产品中的数据。
d)系统角色受权
系统角色受权是指:用户给DLA受权,容许DLA访问用户相关云服务里的数据,从而实现DLA关联分析用户数据的目标,或者经过DLA实现ETL,将数据回流到用户的库。具体过程能够参考:https://help.aliyun.com/docum...
e)跨帐号访问
DLA支持跨帐号,容许A用户在DLA上,链接B用户的OSS上的数据进行分析计算,不过这须要作一些操做,后续文档会以图形化的方式来介绍和引导用户:
image.png | left | 563x426
6、权限实测操做(以TableStore为案例)
a)准备TableStore的库表
咱们来到OTS的首页,https://ots.console.aliyun.co...,建立但愿DLA作分析的库和表:
image.png | left | 747x384
库建完后,去建表
image.png | left | 747x301
image.png | left | 747x313
image.png | left | 747x243
image.png | left | 747x331
插入一行数据
image.png | left | 747x250
b)开通TableStore给DLA的云服务角色受权
关于访问控制和角色受权等信息,请参考:https://help.aliyun.com/produ...
回到DLA主页:https://openanalytics.console...
image.png | left | 747x432
点击赞成受权:
image.png | left | 747x342
受权完成以后的状态:
image.png | left | 747x484
查看角色受权已经成功:
image.png | left | 747x413
c)在DLA中建立库和表,关联TableStore库和表
咱们从新回到DLA Root帐号(oa_xxx),经过JDBC协议链接到DLA(帐号信息、DLA访问点、JDBC链接方式,请参考前面文档)
╰─○ mysql -u<您的DLA Root帐号> -p<您的DLA Root帐号的密码> -h<您的DLA-jdbc访问点> -P10000
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 194631
Server version: 5.6.40-log Source distribution
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
开始建立库,去关联TableStore中的实例:
mysql> select user(); |
---|
user() |
oa_xxxxxxxxxxx |
1 row in set (0.08 sec)
mysql> show databases; Empty set (0.02 sec)
mysql> create database ots_account_test
with dbproperties(
catalog = 'ots',
location = 'https://account-test.cn-shang...',
instance = 'account-test'
) comment 'test account and privileges';
Query OK, 0 rows affected (0.10 sec)
mysql> show databases; |
---|
Database |
ots_account_test |
1 row in set (0.01 sec)
mysql> show create database ots_account_test; | |
---|---|
Database | Create Database |
ots_account_test | CREATE DATABASE ots_account_test |
WITH DBPROPERTIES (
catalog = 'ots', location = 'https://account-test.cn-shanghai.ots-internal.aliyuncs.com', instance = 'account-test'
)
COMMENT 'test account and privileges' |
---|
1 row in set (0.03 sec)
开始建立表,去关联TableStore中的表,并查询数据(结果与OTS中的结果一致):
mysql> use ots_account_test;
Database changed
mysql> show tables;
Empty set (0.03 sec)
mysql> create external table account_test (
-> pk1 int not null primary key, -> name varchar(20) -> );
Query OK, 0 rows affected (0.15 sec)
mysql> show create table account_test; | |
---|---|
Table | Create Table |
account_test | CREATE EXTERNAL TABLE account_test ( |
`pk1` int NOT NULL COMMENT '', `name` varchar(20) NULL COMMENT '', PRIMARY KEY (`pk1`)
)
COMMENT '' |
---|
1 row in set (0.04 sec)
mysql> select * from account_test; | |
---|---|
pk1 | name |
123 | account-test |
1 row in set (1.61 sec)
至此,咱们已经成功完成了数据关联并实现数据查询的过程!!
d)把库和表受权给子帐号来访问
上诉都是Root帐号在操做,从前面的分析可知,Root帐号是能够操做对应云帐号全部的云资源的,可是DLA的User帐号却不行,必须经过Root帐号给User帐号Grant权限,DLA才能容许某个User帐号访问对应的库和表:
切换到User帐号/子帐号链接页面,此时看不到任何库表:
mysql> select user(); |
---|
user() |
test_sxxxxxxxxxxxxxxxx |
1 row in set (0.14 sec)
mysql> show databases;
Empty set (0.02 sec)
mysql> show grants ; |
---|
Grants for test_sxxxxxxxxxxxxxxxx |
GRANT USAGE ON . TO 'test_sxxxxxxxxxxxxxxxx' |
1 row in set (0.03 sec)
切换Root帐号链接页面,咱们给前面的帐号受权:
mysql> select user(); |
---|
user() |
oa_xxxxxxxxxxx |
1 row in set (0.14 sec)
mysql> show grants for test_sxxxxxxxxxxxxxxxx; |
---|
Grants for test_sxxxxxxxxxxxxxxxx |
GRANT USAGE ON . TO 'test_sxxxxxxxxxxxxxxxx' |
1 rows in set (0.02 sec)
mysql> grant all on ots_account_test.* to test_sxxxxxxxxxxxxxxxx;
Query OK, 0 rows affected (0.05 sec)
mysql> show grants for test_sxxxxxxxxxxxxxxxx; |
---|
Grants for test_sxxxxxxxxxxxxxxxx |
GRANT USAGE ON . TO 'test_sxxxxxxxxxxxxxxxx' |
GRANT ALL ON ots_account_test .* TO 'test_sxxxxxxxxxxxxxxxx' |
2 rows in set (0.03 sec)
切换User帐号链接页面,从新查询看看,已经有权限了,而且能够读取数据:
mysql> select user(); |
---|
user() |
test_sxxxxxxxxxxxxxxxx |
1 row in set (0.14 sec)
mysql> show grants ; |
---|
Grants for test_sxxxxxxxxxxxxxxxx |
GRANT USAGE ON . TO 'test_sxxxxxxxxxxxxxxxx' |
GRANT ALL ON ots_account_test .* TO 'test_sxxxxxxxxxxxxxxxx' |
2 rows in set (0.02 sec)
mysql> show databases; |
---|
Database |
ots_account_test |
1 row in set (0.02 sec)
mysql> select * from ots_account_test.account_test; | |
---|---|
pk1 | name |
123 | account-test |
1 row in set (0.43 sec)
至此,子帐号受权访问就能够了!
e)支持跨帐号访问
通常状况,用户大部分使用DLA的场景是,云帐号A使用DLA访问云帐号A在其余云产品中的数据,从前面的分析能够知道,只要用户在DLA的console上选择具体的数据源(好比TableStore)给DLA作系统角色受权以后,就能够打通数据源,建立库表和查询数据了。
可是,还有一种场景是:云帐号A使用DLA来访问云帐号B在其余云产品(如下以TableStore)中的数据,这须要专门的角色受权才能正常运行:
image.png | left | 563x426
假设上述测试帐号对应的云帐号为A,下面就以TableStore和另外一个云帐号B(DLA另外一个真实的测试云帐号)做为案例,演示B帐号给A帐号针对TableStore中某个instance作跨帐号受权,而且A在DLA中完成查询的过程。
首先,须要到B帐号内,在"访问控制(https://ram.console.aliyun.com)"中建立一个跨帐号受权的角色:
image.png | left | 747x445
选择一个“服务角色”,选择一个合适的模板,快速建立:
image.png | left | 747x323
image.png | left | 747x407
image.png | left | 747x283
image.png | left | 747x355
从新回到角色管理页面,找到这个角色作修改(修改为支持DLA的模板):
image.png | left | 747x412
image.png | left | 747x278
image.png | left | 747x315
image.png | left | 747x273
跨帐号的角色建立和修改完成,开始作“角色受权策略”的配置,这里咱们以TableStore为例,其余数据源相似:
image.png | left | 747x337
image.png | left | 747x144
跨帐号角色定义,以及角色受权都操做完成,咱们开始进入DLA的实际测试,首先查看云帐号B的TableStore中的instance和table的状况:
image.png | left | 747x393
image.png | left | 747x259
从新使用云帐号A的DLA Root帐号,经过MySQL-cli链接到DLA,而后链接和访问云帐号B的数据:
mysql> select user(); |
---|
user() |
oa_xxxxxxxxxxx |
1 row in set (0.06 sec)
mysql> show databases; |
---|
Database |
ots_account_test |
1 row in set (0.24 sec)
mysql> create database ots_cross_account_test
with dbproperties(
catalog = 'ots',
location = 'https://test-sh.cn-shanghai.o...', --云帐号B的TableStore instance
instance = 'test-sh',
cross_account_accessing_arn= 'acs:1013xxxxxx:role/test-cross-account-accessing-role' --云帐号B为云帐号A@云服务DLA的跨帐号角色受权时的Arn信息
);
Query OK, 0 rows affected (0.14 sec)
mysql> show databases ; |
---|
Database |
ots_account_test |
ots_cross_account_test |
2 rows in set (0.18 sec)
mysql> show create database ots_cross_account_test; | |
---|---|
Database | Create Database |
ots_cross_account_test | CREATE DATABASE ots_cross_account_test |
WITH DBPROPERTIES (
catalog = 'ots', location = 'https://test-sh.cn-shanghai.ots-internal.aliyuncs.com', instance = 'test-sh', cross_account_accessing_arn = 'acs:ram::1013xxxxxx:role/test-cross-account-accessing-role'
)
COMMENT '' |
---|
1 row in set (0.19 sec)
mysql> use ots_cross_account_test;
Database changed
mysql> show tables;
Empty set (0.19 sec)
mysql> create external table test_table1 (
id1 int not null primary key,
col1 int
);
Query OK, 0 rows affected (0.31 sec)
mysql> show tables; |
---|
Table_Name |
test_table1 |
1 row in set (0.20 sec)
mysql> show create table test_table1; | |
---|---|
Table | Create Table |
test_table1 | CREATE EXTERNAL TABLE test_table1 ( |
`id1` int NOT NULL COMMENT '', `col1` int NULL COMMENT '', PRIMARY KEY (`id1`)
)
COMMENT '' |
---|
1 row in set (0.20 sec)
mysql> select * from test_table1; | |
---|---|
id1 | col1 |
0 | -111 |
111111 | 111 |
2 rows in set (1.29 sec)
顺便提醒一下,普通的建库流程中是不须要cross_account_accessing_arn参数的,意味着默认是云帐号本身给本身开通了DLA访问云服务的权限,而有了cross_account_accessing_arn参数,就表示跨帐号服务的开启,这个DLA中的库以及库下面的表,都有了跨帐号访问的权限!!
到这里,咱们跨帐号访问的全过程就完成啦!!若是你但愿链接OSS等云服务,你也能够按照上述流程操做一遍!!