您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何進行Data Lake Analytics賬號和權限體系的分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
基于數據湖做分析,可以不用做任何ETL、數據搬遷等前置過程,實現跨各種異構數據源進行大數據關聯分析,從而極大的節省成本和提升用戶體驗。
下圖是DLA的簡易架構(__MPP計算引擎+存儲計算分離+彈性高可用+異構數據集源等)__:
cdn.nlark.com/lark/0/2018/png/103052/1541757933088-c409a27e-3db2-45bb-9228-98f37d52550c.png">
目前DLA是以MySQL協議方式對外提供服務,用戶需要通過JDBC連接,連到DLA服務。DLA內部的賬號和密碼是獨立自建的(與RAM不同),對應的賬號和密碼信息,在用戶開通DLA服務時以站內信、郵件、短信等方式通知您。
可能您會疑惑,為什么DLA不是以RAM或AK賬號做認證和授權,而需要自建賬號。在這里,做一些簡單的介紹:
DLA是數據庫,在客戶端建立連接(需要認證)、訪問庫、表、字段(需要鑒權)時,大量跨服務訪問RAM系統,會給RAM系統造成很大壓力,且可能會影響DLA服務延時;
DLA是數據庫,需要兼容MySQL權限模型,庫、表、字段等領域對象很難一一映射到RAM體系;同時RAM下的資源對象的權限粒度可粗可細,且更多偏向于管理數據生命周期而非詳細數據層面的權限;
用戶習慣的Grant、Revoke、Show grants等邏輯,都是直接和傳統數據庫的庫、表、字段一一映射。
參考了阿里云上及業界云服務平臺上其他數據庫產品的設計,存在一樣的考量;
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賬號都有機會訪問云賬號所有的資源(當然,這都是在授權管理之內);
找到服務:
購買:
為不同的Region初始化服務:
初始化完成,得到一個Root賬號:
配置服務訪問點
連接DLA服務,并進入服務
##連接DLA服務,賬號和密碼都在您的收件箱內,服務訪問點則在服務頁面 [root]# mysql -u<您的dla用戶名> -p<您的dla密碼> -h<您的dla服務訪問點> -P10000 ## 進入DLA服務,開始測試之旅 mysql> show databases; Empty set (0.09 sec)
連接DLA服務,并進入服務,也能正常工作了。
DLA中有兩層權限驗證機制,確保您的數據被安全訪問:
DLA層授權和校驗校驗,基于MySQL語法而定義和實現(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)
數據源和RAM層授權和校驗,基于RAM的的訪問控制而實現(比如OSS、TableStore等云原生產品):https://help.aliyun.com/product/28625.html,或者基于數據源本身的權限校驗(比如RDS,是自建賬號,因而也有自建權限系統)
用戶的SQL發送到DLA,做完DLA的權限校驗后,再轉發到后端數據源層,執行RAM層和數據源的權限校驗,最后再真正訪問到用戶的數據;
DLA是根據用戶操作對象的范圍“從大到小”驗證的,從Global級(全局權限),到Schema級,再到Table級,最后到Column級(目前不支持)一層層驗證權限。任何一層有權限校驗成功,到最后一層也沒權限時校驗失敗:
基本上參考了MySQL的Grant/Revoke/Show Grants語法來實現:
##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'] ]
授權人:
只能由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中:
* 表示當前連接使用了某個庫xxDB,然后針對xxDB做授權,庫級別權限;
. 表示所有庫的所有表授權,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地址;
因為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.aliyuncs.com', INSTANCE = 'test' )
如果Root賬號給某個User賬后執行Grant操作后,該User賬號就可以訪問這個庫:
grant all on db_name.* to xxx_s1519122757;
上述過程都假設云賬號的系統角色授權已經完成,下一節我們介紹首先如何完成系統角色授權,從而允許DLA訪問你在其他云產品中的數據。
系統角色授權是指:用戶給DLA授權,允許DLA訪問用戶相關云服務里的數據,從而實現DLA關聯分析用戶數據的目標,或者通過DLA實現ETL,將數據回流到用戶的庫。具體過程可以參考:https://help.aliyun.com/document_detail/53478.html
DLA支持跨賬號,允許A用戶在DLA上,連接B用戶的OSS上的數據進行分析計算,不過這需要做一些操作,后續文檔會以圖形化的方式來介紹和引導用戶:
庫建完后,去建表
插入一行數據
點擊同意授權:
查看角色授權已經成功:
我們重新回到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-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)
開始創建表,去關聯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)
至此,我們已經成功完成了數據關聯并實現數據查詢的過程!!
上訴都是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)
至此,子賬號授權訪問就可以了!
一般情況,用戶大部分使用DLA的場景是,云賬號A使用DLA訪問云賬號A在其他云產品中的數據,從前面的分析可以知道,只要用戶在DLA的console上選擇具體的數據源(比如TableStore)給DLA做系統角色授權之后,就可以打通數據源,創建庫表和查詢數據了。
但是,還有一種場景是:云賬號A使用DLA來訪問云賬號B在其他云產品(以下以TableStore)中的數據,這需要專門的角色授權才能正常運行:
假設上述測試賬號對應的云賬號為A,下面就以TableStore和另一個云賬號B(DLA另一個真實的測試云賬號)作為案例,演示B賬號給A賬號針對TableStore中某個instance做跨賬號授權,并且A在DLA中完成查詢的過程。
首先,需要到B賬號內,在"訪問控制(https://ram.console.aliyun.com)"中創建一個跨賬號授權的角色:
重新使用云賬號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.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@云服務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中的庫以及庫下面的表,都有了跨賬號訪問的權限!!
看完上述內容,你們對如何進行Data Lake Analytics賬號和權限體系的分析有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。