權限管理
權限管理
IoTDB 為用戶提供了權限管理操作,從而為用戶提供對于數據的權限管理功能,保障數據的安全。
我們將通過以下幾個具體的例子為您示范基本的用戶權限操作,詳細的 SQL 語句及使用方式詳情請參見本文 數據模式與概念章節。同時,在 JAVA 編程環境中,您可以使用 JDBC API 單條或批量執行權限管理類語句。
基本概念
用戶
用戶即數據庫的合法使用者。一個用戶與一個唯一的用戶名相對應,并且擁有密碼作為身份驗證的手段。一個人在使用數據庫之前,必須先提供合法的(即存于數據庫中的)用戶名與密碼,使得自己成為用戶。
權限
數據庫提供多種操作,并不是所有的用戶都能執行所有操作。如果一個用戶可以執行某項操作,則稱該用戶有執行該操作的權限。權限可分為數據管理權限(如對數據進行增刪改查)以及權限管理權限(用戶、角色的創建與刪除,權限的賦予與撤銷等)。數據管理權限往往需要一個路徑來限定其生效范圍,可使用路徑模式靈活管理權限。
角色
角色是若干權限的集合,并且有一個唯一的角色名作為標識符。用戶通常和一個現實身份相對應(例如交通調度員),而一個現實身份可能對應著多個用戶。這些具有相同現實身份的用戶往往具有相同的一些權限。角色就是為了能對這樣的權限進行統一的管理的抽象。
默認用戶及其具有的角色
初始安裝后的 IoTDB 中有一個默認用戶:root,默認密碼為 root。該用戶為管理員用戶,固定擁有所有權限,無法被賦予、撤銷權限,也無法被刪除。
權限操作示例
根據本文中描述的 樣例數據 內容,IoTDB 的樣例數據可能同時屬于 ln, sgcc 等不同發電集團,不同的發電集團不希望其他發電集團獲取自己的數據庫數據,因此我們需要將不同的數據在集團層進行權限隔離。
創建用戶
使用 CREATE USER <userName> <password> 創建用戶。例如,我們可以使用具有所有權限的root用戶為 ln 和 sgcc 集團創建兩個用戶角色,名為 ln_write_user, sgcc_write_user,密碼均為 write_pwd。建議使用反引號(`)包裹用戶名。SQL 語句為:
CREATE USER `ln_write_user` 'write_pwd'
CREATE USER `sgcc_write_user` 'write_pwd'此時使用展示用戶的 SQL 語句:
LIST USER我們可以看到這兩個已經被創建的用戶,結果如下:
IoTDB> CREATE USER `ln_write_user` 'write_pwd'
Msg: The statement is executed successfully.
IoTDB> CREATE USER `sgcc_write_user` 'write_pwd'
Msg: The statement is executed successfully.
IoTDB> LIST USER
+---------------+
| user|
+---------------+
| ln_write_user|
| root|
|sgcc_write_user|
+---------------+
Total line number = 3
It costs 0.157s賦予用戶權限
此時,雖然兩個用戶已經創建,但是他們不具有任何權限,因此他們并不能對數據庫進行操作,例如我們使用 ln_write_user 用戶對數據庫中的數據進行寫入,SQL 語句為:
INSERT INTO root.ln.wf01.wt01(timestamp,status) values(1509465600000,true)此時,系統不允許用戶進行此操作,會提示錯誤:
IoTDB> INSERT INTO root.ln.wf01.wt01(timestamp,status) values(1509465600000,true)
Msg: 602: No permissions for this operation, please add privilege INSERT_TIMESERIES.現在,我們用root用戶分別賦予他們向對應 database 數據的寫入權限.
我們使用 GRANT USER <userName> PRIVILEGES <privileges> ON <nodeName> 語句賦予用戶權限(注:其中,創建用戶權限無需指定路徑),例如:
GRANT USER `ln_write_user` PRIVILEGES INSERT_TIMESERIES on root.ln.**
GRANT USER `sgcc_write_user` PRIVILEGES INSERT_TIMESERIES on root.sgcc1.**, root.sgcc2.**
GRANT USER `ln_write_user` PRIVILEGES CREATE_USER執行狀態如下所示:
IoTDB> GRANT USER `ln_write_user` PRIVILEGES INSERT_TIMESERIES on root.ln.**
Msg: The statement is executed successfully.
IoTDB> GRANT USER `sgcc_write_user` PRIVILEGES INSERT_TIMESERIES on root.sgcc1.**, root.sgcc2.**
Msg: The statement is executed successfully.
IoTDB> GRANT USER `ln_write_user` PRIVILEGES CREATE_USER
Msg: The statement is executed successfully.接著使用ln_write_user再嘗試寫入數據
IoTDB> INSERT INTO root.ln.wf01.wt01(timestamp, status) values(1509465600000, true)
Msg: The statement is executed successfully.撤銷用戶權限
授予用戶權限后,我們可以使用 REVOKE USER <userName> PRIVILEGES <privileges> ON <nodeName> 來撤銷已授予的用戶權限(注:其中,撤銷創建用戶權限無需指定路徑)。例如,用root用戶撤銷ln_write_user和sgcc_write_user的權限:
REVOKE USER `ln_write_user` PRIVILEGES INSERT_TIMESERIES on root.ln.**
REVOKE USER `sgcc_write_user` PRIVILEGES INSERT_TIMESERIES on root.sgcc1.**, root.sgcc2.**
REVOKE USER `ln_write_user` PRIVILEGES CREATE_USER執行狀態如下所示:
REVOKE USER `ln_write_user` PRIVILEGES INSERT_TIMESERIES on root.ln.**
Msg: The statement is executed successfully.
REVOKE USER `sgcc_write_user` PRIVILEGES INSERT_TIMESERIES on root.sgcc1.**, root.sgcc2.**
Msg: The statement is executed successfully.
REVOKE USER `ln_write_user` PRIVILEGES CREATE_USER
Msg: The statement is executed successfully.撤銷權限后,ln_write_user就沒有向root.ln.**寫入數據的權限了。
INSERT INTO root.ln.wf01.wt01(timestamp, status) values(1509465600000, true)
Msg: 602: No permissions for this operation, please add privilege INSERT_TIMESERIES.SQL 語句
與權限相關的語句包括:
- 創建用戶
CREATE USER <userName> <password>;
Eg: IoTDB > CREATE USER `thulab` 'passwd';- 刪除用戶
DROP USER <userName>;
Eg: IoTDB > DROP USER `xiaoming`;- 創建角色
CREATE ROLE <roleName>;
Eg: IoTDB > CREATE ROLE `admin`;- 刪除角色
DROP ROLE <roleName>;
Eg: IoTDB > DROP ROLE `admin`;- 賦予用戶權限
GRANT USER <userName> PRIVILEGES <privileges> ON <nodeNames>;
Eg: IoTDB > GRANT USER `tempuser` PRIVILEGES INSERT_TIMESERIES, DELETE_TIMESERIES on root.ln.**, root.sgcc.**;
Eg: IoTDB > GRANT USER `tempuser` PRIVILEGES CREATE_ROLE;- 賦予用戶全部的權限
GRANT USER <userName> PRIVILEGES ALL;
Eg: IoTDB > GRANT USER `tempuser` PRIVILEGES ALL;- 賦予角色權限
GRANT ROLE <roleName> PRIVILEGES <privileges> ON <nodeNames>;
Eg: IoTDB > GRANT ROLE `temprole` PRIVILEGES INSERT_TIMESERIES, DELETE_TIMESERIES ON root.sgcc.**, root.ln.**;
Eg: IoTDB > GRANT ROLE `temprole` PRIVILEGES CREATE_ROLE;- 賦予角色全部的權限
GRANT ROLE <roleName> PRIVILEGES ALL;
Eg: IoTDB > GRANT ROLE `temprole` PRIVILEGES ALL;- 賦予用戶角色
GRANT <roleName> TO <userName>;
Eg: IoTDB > GRANT `temprole` TO tempuser;- 撤銷用戶權限
REVOKE USER <userName> PRIVILEGES <privileges> ON <nodeNames>;
Eg: IoTDB > REVOKE USER `tempuser` PRIVILEGES DELETE_TIMESERIES on root.ln.**;
Eg: IoTDB > REVOKE USER `tempuser` PRIVILEGES CREATE_ROLE;- 移除用戶所有權限
REVOKE USER <userName> PRIVILEGES ALL;
Eg: IoTDB > REVOKE USER `tempuser` PRIVILEGES ALL;- 撤銷角色權限
REVOKE ROLE <roleName> PRIVILEGES <privileges> ON <nodeNames>;
Eg: IoTDB > REVOKE ROLE `temprole` PRIVILEGES DELETE_TIMESERIES ON root.ln.**;
Eg: IoTDB > REVOKE ROLE `temprole` PRIVILEGES CREATE_ROLE;- 撤銷角色全部的權限
REVOKE ROLE <roleName> PRIVILEGES ALL;
Eg: IoTDB > REVOKE ROLE `temprole` PRIVILEGES ALL;- 撤銷用戶角色
REVOKE <roleName> FROM <userName>;
Eg: IoTDB > REVOKE `temprole` FROM tempuser;- 列出所有用戶
LIST USER
Eg: IoTDB > LIST USER- 列出指定角色下所有用戶
LIST USER OF ROLE <roleName>;
Eg: IoTDB > LIST USER OF ROLE `roleuser`;- 列出所有角色
LIST ROLE
Eg: IoTDB > LIST ROLE- 列出指定用戶下所有角色
LIST ROLE OF USER <username> ;
Eg: IoTDB > LIST ROLE OF USER `tempuser`;- 列出用戶所有權限
LIST PRIVILEGES USER <username>;
Eg: IoTDB > LIST PRIVILEGES USER `tempuser`;- 列出用戶在具體路徑上相關聯的權限
LIST PRIVILEGES USER <username> ON <paths>;
Eg: IoTDB> LIST PRIVILEGES USER `tempuser` ON root.ln.**, root.ln.wf01.**;
+--------+-----------------------------------+
| role| privilege|
+--------+-----------------------------------+
| | root.ln.** : ALTER_TIMESERIES|
|temprole|root.ln.wf01.** : CREATE_TIMESERIES|
+--------+-----------------------------------+
Total line number = 2
It costs 0.005s
IoTDB> LIST PRIVILEGES USER `tempuser` ON root.ln.wf01.wt01.**;
+--------+-----------------------------------+
| role| privilege|
+--------+-----------------------------------+
| | root.ln.** : ALTER_TIMESERIES|
|temprole|root.ln.wf01.** : CREATE_TIMESERIES|
+--------+-----------------------------------+
Total line number = 2
It costs 0.005s- 列出角色所有權限
LIST PRIVILEGES ROLE <roleName>;
Eg: IoTDB > LIST PRIVILEGES ROLE `actor`;- 列出角色在具體路徑上相關聯的權限
LIST PRIVILEGES ROLE <roleName> ON <paths>;
Eg: IoTDB> LIST PRIVILEGES ROLE `temprole` ON root.ln.**, root.ln.wf01.wt01.**;
+-----------------------------------+
| privilege|
+-----------------------------------+
|root.ln.wf01.** : CREATE_TIMESERIES|
+-----------------------------------+
Total line number = 1
It costs 0.005s
IoTDB> LIST PRIVILEGES ROLE `temprole` ON root.ln.wf01.wt01.**;
+-----------------------------------+
| privilege|
+-----------------------------------+
|root.ln.wf01.** : CREATE_TIMESERIES|
+-----------------------------------+
Total line number = 1
It costs 0.005s- 更新密碼
ALTER USER <username> SET PASSWORD <password>;
Eg: IoTDB > ALTER USER `tempuser` SET PASSWORD 'newpwd';其他說明
用戶、權限與角色的關系
角色是權限的集合,而權限和角色都是用戶的一種屬性。即一個角色可以擁有若干權限。一個用戶可以擁有若干角色與權限(稱為用戶自身權限)。
目前在 IoTDB 中并不存在相互沖突的權限,因此一個用戶真正具有的權限是用戶自身權限與其所有的角色的權限的并集。即要判定用戶是否能執行某一項操作,就要看用戶自身權限或用戶的角色的所有權限中是否有一條允許了該操作。用戶自身權限與其角色權限,他的多個角色的權限之間可能存在相同的權限,但這并不會產生影響。
需要注意的是:如果一個用戶自身有某種權限(對應操作 A),而他的某個角色有相同的權限。那么如果僅從該用戶撤銷該權限無法達到禁止該用戶執行操作 A 的目的,還需要從這個角色中也撤銷對應的權限,或者從這個用戶將該角色撤銷。同樣,如果僅從上述角色將權限撤銷,也不能禁止該用戶執行操作 A。
同時,對角色的修改會立即反映到所有擁有該角色的用戶上,例如對角色增加某種權限將立即使所有擁有該角色的用戶都擁有對應權限,刪除某種權限也將使對應用戶失去該權限(除非用戶本身有該權限)。
系統所含權限列表
| 權限名稱 | 說明 | 示例 |
|---|---|---|
| CREATE_DATABASE | 創建 database。包含設置 database 的權限和TTL。路徑相關 | Eg1: CREATE DATABASE root.ln;Eg2: set ttl to root.ln 3600000;Eg3: unset ttl to root.ln; |
| DELETE_DATABASE | 刪除 database。路徑相關 | Eg: delete database root.ln; |
| CREATE_TIMESERIES | 創建時間序列。路徑相關 | Eg1: 創建時間序列create timeseries root.ln.wf02.status with datatype=BOOLEAN,encoding=PLAIN;Eg2: 創建對齊時間序列 create aligned timeseries root.ln.device1(latitude FLOAT encoding=PLAIN compressor=SNAPPY, longitude FLOAT encoding=PLAIN compressor=SNAPPY); |
| INSERT_TIMESERIES | 插入數據。路徑相關 | Eg1: insert into root.ln.wf02(timestamp,status) values(1,true);Eg2: insert into root.sg1.d1(time, s1, s2) aligned values(1, 1, 1) |
| ALTER_TIMESERIES | 修改時間序列標簽。路徑相關 | Eg1: alter timeseries root.turbine.d1.s1 ADD TAGS tag3=v3, tag4=v4;Eg2: ALTER timeseries root.turbine.d1.s1 UPSERT ALIAS=newAlias TAGS(tag2=newV2, tag3=v3) ATTRIBUTES(attr3=v3, attr4=v4); |
| READ_TIMESERIES | 查詢數據。路徑相關 | Eg1: SHOW DATABASES; Eg2: show child paths root.ln, show child nodes root.ln;Eg3: show devices;Eg4: show timeseries root.**;Eg5: show schema templates;Eg6: show all ttlEg7: 數據查詢(這一節之下的查詢語句均使用該權限) Eg8: CVS格式數據導出 ./export-csv.bat -h 127.0.0.1 -p 6667 -u tempuser -pw root -td ./Eg9: 查詢性能追蹤 tracing select * from root.**Eg10: UDF查詢 select example(*) from root.sg.d1Eg11: 查詢觸發器 show triggersEg12: 統計查詢 count devices |
| DELETE_TIMESERIES | 刪除數據或時間序列。路徑相關 | Eg1: 刪除時間序列delete timeseries root.ln.wf01.wt01.statusEg2: 刪除數據 delete from root.ln.wf02.wt02.status where time < 10Eg3: 使用DROP關鍵字 drop timeseries root.ln.wf01.wt01.status |
| CREATE_USER | 創建用戶。路徑無關 | Eg: create user thulab 'passwd'; |
| DELETE_USER | 刪除用戶。路徑無關 | Eg: drop user xiaoming; |
| MODIFY_PASSWORD | 修改所有用戶的密碼。路徑無關。(沒有該權限者仍然能夠修改自己的密碼。) | Eg: alter user tempuser SET PASSWORD 'newpwd'; |
| LIST_USER | 列出所有用戶,列出具有某角色的所有用戶,列出用戶在指定路徑下相關權限。路徑無關 | Eg1: list user;Eg2: list user of role 'wirte_role';Eg3: list privileges user admin;Eg4: list privileges user 'admin' on root.sgcc.**; |
| GRANT_USER_PRIVILEGE | 賦予用戶權限。路徑無關 | Eg: grant user tempuser privileges DELETE_TIMESERIES on root.ln.**; |
| REVOKE_USER_PRIVILEGE | 撤銷用戶權限。路徑無關 | Eg: revoke user tempuser privileges DELETE_TIMESERIES on root.ln.**; |
| GRANT_USER_ROLE | 賦予用戶角色。路徑無關 | Eg: grant temprole to tempuser; |
| REVOKE_USER_ROLE | 撤銷用戶角色。路徑無關 | Eg: revoke temprole from tempuser; |
| CREATE_ROLE | 創建角色。路徑無關 | Eg: create role admin; |
| DELETE_ROLE | 刪除角色。路徑無關 | Eg: drop role admin; |
| LIST_ROLE | 列出所有角色,列出某用戶下所有角色,列出角色在指定路徑下相關權限。路徑無關 | Eg1: list roleEg2: list role of user 'actor';Eg3: list privileges role wirte_role;Eg4: list privileges role wirte_role ON root.sgcc; |
| GRANT_ROLE_PRIVILEGE | 賦予角色權限。路徑無關 | Eg: grant role temprole privileges DELETE_TIMESERIES ON root.ln.**; |
| REVOKE_ROLE_PRIVILEGE | 撤銷角色權限。路徑無關 | Eg: revoke role temprole privileges DELETE_TIMESERIES ON root.ln.**; |
| CREATE_FUNCTION | 注冊 UDF。路徑無關 | Eg: create function example AS 'org.apache.iotdb.udf.UDTFExample'; |
| DROP_FUNCTION | 卸載 UDF。路徑無關 | Eg: drop function example |
| CREATE_TRIGGER | 創建觸發器。路徑相關 | Eg1: CREATE TRIGGER <TRIGGER-NAME> BEFORE INSERT ON <FULL-PATH> AS <CLASSNAME>Eg2: CREATE TRIGGER <TRIGGER-NAME> AFTER INSERT ON <FULL-PATH> AS <CLASSNAME> |
| DROP_TRIGGER | 卸載觸發器。路徑相關 | Eg: drop trigger 'alert-listener-sg1d1s1' |
| CREATE_CONTINUOUS_QUERY | 創建連續查詢。路徑無關 | Eg: CREATE CONTINUOUS QUERY cq1 RESAMPLE RANGE 40s BEGIN <QUERY-BODY> END |
| DROP_CONTINUOUS_QUERY | 卸載連續查詢。路徑無關 | Eg1: DROP CONTINUOUS QUERY cq3Eg2: DROP CQ cq3 |
| SHOW_CONTINUOUS_QUERIES | 展示所有連續查詢。路徑無關 | Eg1: SHOW CONTINUOUS QUERIESEg2: SHOW cqs |
| UPDATE_TEMPLATE | 創建、刪除模板。路徑無關。 | Eg1: create schema template t1(s1 int32)Eg2: drop schema template t1 |
| READ_TEMPLATE | 查看所有模板、模板內容。 路徑無關 | Eg1: show schema templatesEg2: show nodes in template t1 |
| APPLY_TEMPLATE | 掛載、卸載、激活、解除模板。路徑有關。 | Eg1: set schema template t1 to root.sg.dEg2: unset schema template t1 from root.sg.dEg3: create timeseries of schema template on root.sg.dEg4: delete timeseries of schema template on root.sg.d |
| READ_TEMPLATE_APPLICATION | 查看模板的掛載路徑和激活路徑。路徑無關 | Eg1: show paths set schema template t1Eg2: show paths using schema template t1 |
注意: 路徑無關的權限只能在路徑root.**下賦予或撤銷;
注意: 下述sql語句需要賦予多個權限才可以使用:
- 導入數據,需要賦予
READ_TIMESERIES,INSERT_TIMESERIES兩種權限。
Eg: IoTDB > ./import-csv.bat -h 127.0.0.1 -p 6667 -u renyuhua -pw root -f dump0.csv- 查詢寫回(SELECT_INTO)
- 需要所有
select子句中源序列的READ_TIMESERIES權限 - 需要所有
into子句中目標序列INSERT_TIMESERIES權限
- 需要所有
Eg: IoTDB > select s1, s1 into t1, t2 from root.sg.d1 limit 5 offset 1000用戶名限制
IoTDB 規定用戶名的字符長度不小于 4,其中用戶名不能包含空格。
密碼限制
IoTDB 規定密碼的字符長度不小于 4,其中密碼不能包含空格,密碼默認采用 MD5 進行加密。
角色名限制
IoTDB 規定角色名的字符長度不小于 4,其中角色名不能包含空格。
權限管理中的路徑模式
一個路徑模式的結果集包含了它的子模式的結果集的所有元素。例如,root.sg.d.*是root.sg.*.*的子模式,而root.sg.**不是root.sg.*.*的子模式。當用戶被授予對某個路徑模式的權限時,在他的DDL或DML中使用的模式必須是該路徑模式的子模式,這保證了用戶訪問時間序列時不會超出他的權限范圍。
權限緩存
在分布式相關的權限操作中,在進行除了創建用戶和角色之外的其他權限更改操作時,都會先清除與該用戶(角色)相關的所有的dataNode的緩存信息,如果任何一臺dataNode緩存信息清楚失敗,這個權限更改的任務就會失敗。
非root用戶限制進行的操作
目前以下IoTDB支持的sql語句只有root用戶可以進行操作,且沒有對應的權限可以賦予新用戶。
TsFile管理
- 加載TsFile
Eg: IoTDB > load '/Users/Desktop/data/1575028885956-101-0.tsfile'- 刪除TsFile文件
Eg: IoTDB > remove '/Users/Desktop/data/data/root.vehicle/0/0/1575028885956-101-0.tsfile'- 卸載TsFile文件到指定目錄
Eg: IoTDB > unload '/Users/Desktop/data/data/root.vehicle/0/0/1575028885956-101-0.tsfile' '/data/data/tmp'刪除時間分區(實驗性功能)
- 刪除時間分區(實驗性功能)
Eg: IoTDB > DELETE PARTITION root.ln 0,1,2連續查詢
- 連續查詢(CQ)
Eg: IoTDB > CREATE CONTINUOUS QUERY cq1 BEGIN SELECT max_value(temperature) INTO temperature_max FROM root.ln.*.* GROUP BY time(10s) END運維命令
- FLUSH
Eg: IoTDB > flush- MERGE
Eg: IoTDB > MERGE
Eg: IoTDB > FULL MERGE- CLEAR CACHE
Eg: IoTDB > CLEAR CACHE- SET SYSTEM TO READONLY / WRITABLE
Eg: IoTDB > SET SYSTEM TO READONLY / WRITABLE- 查詢終止
Eg: IoTDB > KILL QUERY 1水印工具
- 為新用戶施加水印
Eg: IoTDB > grant watermark_embedding to Alice- 撤銷水印
Eg: IoTDB > revoke watermark_embedding from Alice