您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)如何進行Data Lake Analytics賬號和權(quán)限體系的分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
基于數(shù)據(jù)湖做分析,可以不用做任何ETL、數(shù)據(jù)搬遷等前置過程,實現(xiàn)跨各種異構(gòu)數(shù)據(jù)源進行大數(shù)據(jù)關(guān)聯(lián)分析,從而極大的節(jié)省成本和提升用戶體驗。
下圖是DLA的簡易架構(gòu)(__MPP計算引擎+存儲計算分離+彈性高可用+異構(gòu)數(shù)據(jù)集源等)__:
cdn.nlark.com/lark/0/2018/png/103052/1541757933088-c409a27e-3db2-45bb-9228-98f37d52550c.png">
目前DLA是以MySQL協(xié)議方式對外提供服務(wù),用戶需要通過JDBC連接,連到DLA服務(wù)。DLA內(nèi)部的賬號和密碼是獨立自建的(與RAM不同),對應(yīng)的賬號和密碼信息,在用戶開通DLA服務(wù)時以站內(nèi)信、郵件、短信等方式通知您。
可能您會疑惑,為什么DLA不是以RAM或AK賬號做認(rèn)證和授權(quán),而需要自建賬號。在這里,做一些簡單的介紹:
DLA是數(shù)據(jù)庫,在客戶端建立連接(需要認(rèn)證)、訪問庫、表、字段(需要鑒權(quán))時,大量跨服務(wù)訪問RAM系統(tǒng),會給RAM系統(tǒng)造成很大壓力,且可能會影響DLA服務(wù)延時;
DLA是數(shù)據(jù)庫,需要兼容MySQL權(quán)限模型,庫、表、字段等領(lǐng)域?qū)ο蠛茈y一一映射到RAM體系;同時RAM下的資源對象的權(quán)限粒度可粗可細(xì),且更多偏向于管理數(shù)據(jù)生命周期而非詳細(xì)數(shù)據(jù)層面的權(quán)限;
用戶習(xí)慣的Grant、Revoke、Show grants等邏輯,都是直接和傳統(tǒng)數(shù)據(jù)庫的庫、表、字段一一映射。
參考了阿里云上及業(yè)界云服務(wù)平臺上其他數(shù)據(jù)庫產(chǎn)品的設(shè)計,存在一樣的考量;
Root/Service賬號:RAM主賬號在某個Region內(nèi)開通DLA服務(wù)時,系統(tǒng)會自動創(chuàng)建第一個DLA賬戶,并以站內(nèi)信、短信、郵件方式通知RAM主賬號,Root賬號只有一個,不能刪除;
User/子賬號:由RAM主賬號后續(xù)在Console上創(chuàng)建的新的DLA的User賬號(注意,不是由Root賬號創(chuàng)建的),云賬號用戶可以創(chuàng)建、刪除User賬號,也可以為其修改密碼等;
Product賬號:其他云產(chǎn)品(比如DBS)與DLA交互時,由用戶在RAM中為該云產(chǎn)品授權(quán)過,由DLA自動產(chǎn)生并派發(fā)給云產(chǎn)品的賬號;
Root賬號和User賬號,關(guān)聯(lián)的RAM uid都是對應(yīng)的云賬號,從而Root和User賬號都有機會訪問云賬號所有的資源(當(dāng)然,這都是在授權(quán)管理之內(nèi));
找到服務(wù):
購買:
為不同的Region初始化服務(wù):
初始化完成,得到一個Root賬號:
配置服務(wù)訪問點
連接DLA服務(wù),并進入服務(wù)
##連接DLA服務(wù),賬號和密碼都在您的收件箱內(nèi),服務(wù)訪問點則在服務(wù)頁面 [root]# mysql -u<您的dla用戶名> -p<您的dla密碼> -h<您的dla服務(wù)訪問點> -P10000 ## 進入DLA服務(wù),開始測試之旅 mysql> show databases; Empty set (0.09 sec)
連接DLA服務(wù),并進入服務(wù),也能正常工作了。
DLA中有兩層權(quán)限驗證機制,確保您的數(shù)據(jù)被安全訪問:
DLA層授權(quán)和校驗校驗,基于MySQL語法而定義和實現(xiàn)(Grant:https://dev.mysql.com/doc/refman/5.7/en/grant.html、Revoke:https://dev.mysql.com/doc/refman/5.7/en/revoke.html、Show Grants:https://dev.mysql.com/doc/refman/5.7/en/show-grants.html)
數(shù)據(jù)源和RAM層授權(quán)和校驗,基于RAM的的訪問控制而實現(xiàn)(比如OSS、TableStore等云原生產(chǎn)品):https://help.aliyun.com/product/28625.html,或者基于數(shù)據(jù)源本身的權(quán)限校驗(比如RDS,是自建賬號,因而也有自建權(quán)限系統(tǒng))
用戶的SQL發(fā)送到DLA,做完DLA的權(quán)限校驗后,再轉(zhuǎn)發(fā)到后端數(shù)據(jù)源層,執(zhí)行RAM層和數(shù)據(jù)源的權(quán)限校驗,最后再真正訪問到用戶的數(shù)據(jù);
DLA是根據(jù)用戶操作對象的范圍“從大到小”驗證的,從Global級(全局權(quán)限),到Schema級,再到Table級,最后到Column級(目前不支持)一層層驗證權(quán)限。任何一層有權(quán)限校驗成功,到最后一層也沒權(quán)限時校驗失?。?/p>
基本上參考了MySQL的Grant/Revoke/Show Grants語法來實現(xiàn):
##grant相關(guān) 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相關(guān) 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相關(guān) SHOW GRANTS [for [ current_user | current_user() | oa_123456 | 'oa_123456' | 'oa_123456'@'localhost'] ]
授權(quán)人:
只能由DLA的root賬號給其他非Root賬號授權(quán);
暫時不支持非Root賬號給其他賬號授權(quán);
不能跨云賬號授權(quán)和回收權(quán)限;
privilege列表:
可以用','連接在一起,比如SELECT,DELETE,UPDATE,INSERT,...
有ALL或ALL PRIVILEGES就會全部授權(quán)或者全部回收,無視其他的Privilege;但一定要注意,grant option這個權(quán)限本身,不包含在ALL中,必須顯式授權(quán)或者回收
暫時不支持其他類型的授權(quán);
SELECT是為Query授權(quán);
SHOW為show、use命令授權(quán)(這里與mysql的邏輯差異比較大);
ALTER為alter或其他變更型的ddl授權(quán);
CREATE為create型的ddl授權(quán);
DROP為drop型的ddl授權(quán);
INSERT為insert型的dml授權(quán);
UPDATE為update型的dml授權(quán);
DELETE為delete型的dml授權(quán);
GRANT OPTION為dcl授權(quán)(grant和revoke相關(guān));可以在Privilege中指定GRANT OPTION,也可以通過語句片段with grant option來做grant 授權(quán);
USAGE其實啥也沒有,表示為空;
ResourceType中:
* 表示當(dāng)前連接使用了某個庫xxDB,然后針對xxDB做授權(quán),庫級別權(quán)限;
. 表示所有庫的所有表授權(quán),Global級別權(quán)限;
xxDb.* 表示針對xxDB這個庫做授權(quán),庫級別權(quán)限;
xxDb.yyTable 表示針對xxDB庫的xxTable做授權(quán),表級別權(quán)限;
yyTable 表示當(dāng)前連接使用了某個庫xxDB,針對xxDB庫的xxTable做授權(quán),表級別權(quán)限;
暫時不支持字段級別的授權(quán);
被授權(quán)用戶定義:
直接寫用戶名:oa_123456
用戶字符串來表示:'oa_123456'
即使寫了ip、host信息,也不會用于連接的白名單校驗;
只有相同云賬號下的Root用戶才能為別人show grants;
不能跨不同uid執(zhí)行show grant
必須有show權(quán)限和grant權(quán)限才能執(zhí)行show grants,或者為本人執(zhí)行__;__
SHOW GRANTS FOR 'jeffrey'@'localhost':目前不支持ip地址;
因為DLA中的子賬號與RAM中的子賬號并不是一一對應(yīng),因而RAM中資源的權(quán)限和DLA中庫表的權(quán)限也不是自然映射的,而是需要在DLA中以特殊定義的方式來做資源的映射和權(quán)限的隔離。
目前DLA中授權(quán)單位是Schema級別的,也就意味著如果Root賬號給某個User賬號授權(quán)了一個庫的權(quán)限,那這個User賬號能夠訪問這個庫下所有的表,也就意味著能夠訪問該庫映射到RAM上所有的資源,這些訪問并不受RAM的子賬號權(quán)限控制。
比如,我們看一個典型的建庫語句(假設(shè)用戶已經(jīng)可以在DLA中創(chuàng)建相關(guān)的庫):
CREATE DATABASE db_name with dbproperties ( CATALOG = 'ots', LOCATION = 'https://test-hangzhou.ots.aliyuncs.com', INSTANCE = 'test' )
如果Root賬號給某個User賬后執(zhí)行Grant操作后,該User賬號就可以訪問這個庫:
grant all on db_name.* to xxx_s1519122757;
上述過程都假設(shè)云賬號的系統(tǒng)角色授權(quán)已經(jīng)完成,下一節(jié)我們介紹首先如何完成系統(tǒng)角色授權(quán),從而允許DLA訪問你在其他云產(chǎn)品中的數(shù)據(jù)。
系統(tǒng)角色授權(quán)是指:用戶給DLA授權(quán),允許DLA訪問用戶相關(guān)云服務(wù)里的數(shù)據(jù),從而實現(xiàn)DLA關(guān)聯(lián)分析用戶數(shù)據(jù)的目標(biāo),或者通過DLA實現(xiàn)ETL,將數(shù)據(jù)回流到用戶的庫。具體過程可以參考:https://help.aliyun.com/document_detail/53478.html
DLA支持跨賬號,允許A用戶在DLA上,連接B用戶的OSS上的數(shù)據(jù)進行分析計算,不過這需要做一些操作,后續(xù)文檔會以圖形化的方式來介紹和引導(dǎo)用戶:
庫建完后,去建表
插入一行數(shù)據(jù)
點擊同意授權(quán):
查看角色授權(quán)已經(jīng)成功:
我們重新回到DLA Root賬號(oa_xxx),通過JDBC協(xié)議連接到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>
開始創(chuàng)建庫,去關(guān)聯(lián)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-shanghai.ots-internal.aliyuncs.com', 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)
開始創(chuàng)建表,去關(guān)聯(lián)TableStore中的表,并查詢數(shù)據(jù)(結(jié)果與OTS中的結(jié)果一致):
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)
至此,我們已經(jīng)成功完成了數(shù)據(jù)關(guān)聯(lián)并實現(xiàn)數(shù)據(jù)查詢的過程??!
上訴都是Root賬號在操作,從前面的分析可知,Root賬號是可以操作對應(yīng)云賬號所有的云資源的,但是DLA的User賬號卻不行,必須通過Root賬號給User賬號Grant權(quán)限,DLA才能允許某個User賬號訪問對應(yīng)的庫和表:
切換到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賬號連接頁面,我們給前面的賬號授權(quán):
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賬號連接頁面,重新查詢看看,已經(jīng)有權(quán)限了,并且可以讀取數(shù)據(jù):
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)
至此,子賬號授權(quán)訪問就可以了!
一般情況,用戶大部分使用DLA的場景是,云賬號A使用DLA訪問云賬號A在其他云產(chǎn)品中的數(shù)據(jù),從前面的分析可以知道,只要用戶在DLA的console上選擇具體的數(shù)據(jù)源(比如TableStore)給DLA做系統(tǒng)角色授權(quán)之后,就可以打通數(shù)據(jù)源,創(chuàng)建庫表和查詢數(shù)據(jù)了。
但是,還有一種場景是:云賬號A使用DLA來訪問云賬號B在其他云產(chǎn)品(以下以TableStore)中的數(shù)據(jù),這需要專門的角色授權(quán)才能正常運行:
假設(shè)上述測試賬號對應(yīng)的云賬號為A,下面就以TableStore和另一個云賬號B(DLA另一個真實的測試云賬號)作為案例,演示B賬號給A賬號針對TableStore中某個instance做跨賬號授權(quán),并且A在DLA中完成查詢的過程。
首先,需要到B賬號內(nèi),在"訪問控制(https://ram.console.aliyun.com)"中創(chuàng)建一個跨賬號授權(quán)的角色:
重新使用云賬號A的DLA Root賬號,通過MySQL-cli連接到DLA,然后連接和訪問云賬號B的數(shù)據(jù):
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.ots-internal.aliyuncs.com', --云賬號B的TableStore instance instance = 'test-sh', cross_account_accessing_arn= 'acs:ram::1013xxxxxx:role/test-cross-account-accessing-role' --云賬號B為云賬號A@云服務(wù)DLA的跨賬號角色授權(quán)時的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
參數(shù)的,意味著默認(rèn)是云賬號自己給自己開通了DLA訪問云服務(wù)的權(quán)限,而有了cross_account_accessing_arn
參數(shù),就表示跨賬號服務(wù)的開啟,這個DLA中的庫以及庫下面的表,都有了跨賬號訪問的權(quán)限??!
看完上述內(nèi)容,你們對如何進行Data Lake Analytics賬號和權(quán)限體系的分析有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。