用戶及權(quán)限管理
用戶與權(quán)限管理可以實(shí)現(xiàn)不同用戶對不同數(shù)據(jù)庫的訪問權(quán)限控制,防止未授權(quán)用戶惡意訪問或篡改數(shù)據(jù),從而提高數(shù)據(jù)庫的安全性。Lindorm時(shí)序引擎默認(rèn)未啟用用戶認(rèn)證與權(quán)限校驗(yàn)。您需要手動開啟用戶認(rèn)證與權(quán)限校驗(yàn)。開啟后,連接時(shí)添加用戶信息,鑒權(quán)通過才能連接成功。本文介紹如何開啟用戶認(rèn)證與權(quán)限校驗(yàn),如何在連接信息中添加用戶信息,以及常用SQL和HTTP API的所需權(quán)限。
時(shí)序引擎的訪問控制體系
Lindorm提供了一套多層次的訪問控制體系,從而提供企業(yè)級應(yīng)用的安全保障。訪問控制體系如下所示:
第一層:阿里云提供的管理用戶身份與資源訪問權(quán)限服務(wù)RAM。
第二層:實(shí)例級別的物理層面訪問控制
使用方法,請參見設(shè)置白名單。
第三層:引擎級別的邏輯層面訪問控制
引擎級別提供的基于用戶認(rèn)證以及權(quán)限校驗(yàn)為主體的訪問控制。
注意事項(xiàng)
Lindorm實(shí)例創(chuàng)建后會默認(rèn)創(chuàng)建一個(gè)初始用戶。默認(rèn)用戶名和密碼均為root_tsdb(3.4.30以下版本默認(rèn)用戶和密碼均為root)。實(shí)例創(chuàng)建完成后,請立即修改初始用戶的密碼,避免安全隱患。
開啟用戶認(rèn)證與權(quán)限校驗(yàn)后,如果正在運(yùn)行中的業(yè)務(wù)訪問未包含用戶信息,會發(fā)生訪問中斷,需添加用戶信息后重啟應(yīng)用。因此,在開啟該功能前,建議仔細(xì)規(guī)劃并充分評估影響。
開啟用戶認(rèn)證與權(quán)限校驗(yàn)
用戶認(rèn)證與權(quán)限校驗(yàn)?zāi)J(rèn)關(guān)閉。您需要登錄數(shù)據(jù)庫,開啟用戶認(rèn)證與權(quán)限校驗(yàn)。
開啟方法
ALTER SYSTEM SET USER_AUTH=TRUE;
開啟用戶認(rèn)證與權(quán)限校驗(yàn)后,也可通過ALTER SYSTEM SET USER_AUTH=FALSE;
關(guān)閉該功能。關(guān)閉后,將無法進(jìn)行認(rèn)證與權(quán)限校驗(yàn),會有安全風(fēng)險(xiǎn),建議不要關(guān)閉用戶認(rèn)證與權(quán)限校驗(yàn)。
查看開啟狀態(tài)
SHOW PARAMETER USER_AUTH;
連接信息添加用戶信息
開啟用戶認(rèn)證與權(quán)限校驗(yàn)后,業(yè)務(wù)對時(shí)序引擎的訪問都需要在連接時(shí)帶上用戶名和密碼。無論是寫入還是查詢,連接所屬用戶必須要具有訪問目標(biāo)的對應(yīng)權(quán)限,操作才能成功。通過這種方式,時(shí)序引擎可以對業(yè)務(wù)訪問進(jìn)行嚴(yán)格的安全控制以及權(quán)限隔離。
使用示例
lindorm-cli
lindorm-cli -url <Lindorm時(shí)序SQL地址> -username <用戶名> -password <密碼> -database <目標(biāo)數(shù)據(jù)庫名>
詳細(xì)的lindorm-cli連接文檔,請參見通過Lindorm-cli連接并使用Lindorm時(shí)序引擎。
JDBC
String url = "<Lindorm時(shí)序SQL地址>";
String username = "<用戶名>";
String password = "<密碼>";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
// 連接成功,執(zhí)行操作
} catch (SQLException e) {
e.printStackTrace();
}
詳細(xì)的JDBC連接文檔,請參見通過JDBC Driver連接并訪問Lindorm時(shí)序引擎。
Druid
dataSource.setDriver(DriverManager.getDriver("<Lindorm時(shí)序SQL地址>"))
dataSource.setUrl("<Lindorm時(shí)序SQL地址>")
dataSource.setUsername("<用戶名>")
dataSource.setPassword("<密碼>")
詳細(xì)的Druid連接文檔,請參見通過Druid連接池連接并訪問時(shí)序引擎。
HTTP API
對于使用OpenTSDB兼容的HTTP API訪問時(shí)序引擎的應(yīng)用,當(dāng)用戶認(rèn)證與權(quán)限校驗(yàn)功能啟用時(shí),發(fā)送請求到API,也需要指定用戶信息。
指定用戶信息的方法
指定方法類似調(diào)用通用SQL接口,通過在HTTP請求頭中加入基于Basic Authentication協(xié)議編碼的用戶認(rèn)證信息,詳細(xì)可參見用戶認(rèn)證信息指定。
使用時(shí)間序列數(shù)據(jù)庫TSDB SDK的業(yè)務(wù),可以通過創(chuàng)建TSDBConfig
對象時(shí)調(diào)用basicAuth
方法來指定用戶名和密碼。
url = "<Lindorm時(shí)序HTTP地址>/api/v2/sql"
username = "<用戶名>"
password = "<用戶名>"
auth = HTTPBasicAuth(username, password)
headers = {
"Content-Type": "text/plain",
"Authorization": f"Basic {base64.b64encode(f'{username}:{password}'.encode()).decode()}"
}
詳細(xì)的HTTP API連接文檔,請參見請求內(nèi)容。
調(diào)用HTTP API所需的權(quán)限信息,請參見訪問OpenTSDB兼容API所需的權(quán)限。
用戶與權(quán)限管理
權(quán)限模型
權(quán)限類型
時(shí)序引擎中的權(quán)限分為四種:
權(quán)限名 | 含義 |
READ | 讀權(quán)限。查詢數(shù)據(jù)時(shí),要求用戶對查詢所涉及的數(shù)據(jù)表具有讀權(quán)限。 |
WRITE | 寫權(quán)限。寫入數(shù)據(jù)時(shí),要求用戶對查詢所涉及的數(shù)據(jù)表具有寫權(quán)限。 |
ADMIN | 管理權(quán)限。對時(shí)序引擎中的數(shù)據(jù)對象進(jìn)行管理時(shí),需要用戶對操作的數(shù)據(jù)對象具有管理權(quán)限。 |
SYSTEM | 系統(tǒng)權(quán)限。當(dāng)操作可能會影響整個(gè)實(shí)例的行為時(shí),需要用戶具有系統(tǒng)權(quán)限。 |
授權(quán)范圍
時(shí)序引擎支持限定用戶授權(quán)的范圍。時(shí)序引擎支持的授權(quán)范圍如下:
GLOBAL
全局范圍的授權(quán)與撤回。
當(dāng)用戶被賦予全局范圍的權(quán)限后,用戶則擁有了對于整個(gè)時(shí)序引擎內(nèi)所有數(shù)據(jù)對象的對應(yīng)操作權(quán)限。例如,全局的READ權(quán)限將允許用戶查詢?nèi)我鈹?shù)據(jù)庫中的任意時(shí)序數(shù)據(jù)表。
DATABASE
數(shù)據(jù)庫粒度的授權(quán)與撤回。
當(dāng)用戶被賦予某個(gè)數(shù)據(jù)庫的權(quán)限后,用戶則擁有了對于該數(shù)據(jù)庫內(nèi)部所有數(shù)據(jù)對象的對應(yīng)操作權(quán)限。例如,某個(gè)數(shù)據(jù)庫DB1的READ權(quán)限將允許用戶查詢該數(shù)據(jù)庫內(nèi)的所有時(shí)序數(shù)據(jù)表。
授權(quán)規(guī)則
系統(tǒng)權(quán)限(SYSTEM)為全局(GLOBAL)權(quán)限。
只有具有系統(tǒng)權(quán)限(SYSTME)或全局(GLOBAL)的管理權(quán)限(ADMIN)的用戶,可以創(chuàng)建或刪除用戶、授權(quán)、回收權(quán)限。
用戶實(shí)際的權(quán)限是其擁有的所有權(quán)限的并集。例如,如果用戶具有全局(GLOBAL)的讀權(quán)限(READ),同時(shí)具有某個(gè)數(shù)據(jù)庫(DATABASE)的讀權(quán)限(READ),則可以查詢時(shí)序引擎內(nèi)所有數(shù)據(jù)庫的數(shù)據(jù)。
管理用戶與權(quán)限
時(shí)序引擎支持通過SQL和寬表引擎集群管理系統(tǒng)管理用戶與權(quán)限。
SQL管理用戶與權(quán)限
增加用戶,請參見CREATE USER。
刪除用戶,請參見DROP USER。
修改用戶密碼,請參見ALTER USER。
查看已有用戶,請參見SHOW。
授權(quán),請參見GRANT。
撤回授權(quán),請參見REVOKE。
集群管理系統(tǒng)管理用戶與權(quán)限
時(shí)序引擎的用戶信息與權(quán)限數(shù)據(jù)與寬表引擎通用。如果您也開通了寬表引擎,可以登錄寬表引擎的集群管理系統(tǒng)管理用戶與權(quán)限。集群管理系統(tǒng)的用法,請參見登錄集群管理系統(tǒng)。
寬表引擎集群管理系統(tǒng)支持TRASH權(quán)限,該權(quán)限目前在時(shí)序引擎中無實(shí)際意義。
如果寬表引擎中的Namespace與時(shí)序引擎的Database同名,且某個(gè)用戶擁有該Namespace的權(quán)限,則該用戶默認(rèn)就擁有了時(shí)序引擎同名Database的相應(yīng)權(quán)限。
常用SQL所需權(quán)限
常用的SQL語句所需的權(quán)限可參見下表。
下表中○表示需要的權(quán)限,×表示不需要的權(quán)限。
SQL語句 | GLOBAL | DATABASE | 備注 | |||||
READ | WRITE | ADMIN | SYSTEM | READ | WRITE | ADMIN | ||
SELECT...FROM... | ○ | × | × | × | ○ | × | × | - |
INSERT INTO...VALUES... | × | ○ | × | × | × | ○ | × | - |
INSERT INTO...SELECT... | ○ | ○ | × | × | ○ | ○ | × | 需要INSERT目標(biāo)表的WRITE權(quán)限,以及SELECT源表的READ權(quán)限。 |
DESCRIBE DATABASE ... | × | × | ○ | × | × | × | ○ | - |
CREATE DATABASE... | × | × | ○ | × | × | × | × | - |
ALTER DATABASE... | × | × | ○ | × | × | × | ○ | - |
DROP DATABASE... | × | × | ○ | × | × | × | ○ | - |
SHOW DATABASES | × | × | ○ | × | × | × | × | - |
DESCRIBE TABLE ... | ○ | × | × | × | ○ | × | × | - |
CREATE TABLE... | × | × | ○ | × | × | × | ○ | - |
DROP TABLE... | × | × | ○ | × | × | × | ○ | - |
CREATE USER | × | × | ○ | ○ | × | × | × | - |
ALTER USER... | × | × | ○ | ○ | × | × | × | - |
DROP USER... | × | × | ○ | ○ | × | × | × | - |
SHOW USERS | × | × | ○ | ○ | × | × | × | - |
GRANT... | × | × | ○ | ○ | × | × | × | - |
REVOKE... | × | × | ○ | ○ | × | × | × | - |
SHOW PRIVILEGES... | × | × | ○ | ○ | × | × | × | - |
ALTER SYSTEM... | × | × | × | ○ | × | × | × | - |
SHOW PARAMETER... | × | × | × | ○ | × | × | × | - |
訪問OpenTSDB兼容API所需的權(quán)限
調(diào)用HTTP API時(shí)需要用戶具備GLOBAL權(quán)限。
各個(gè)API所需的權(quán)限可參見下表。
下表中○表示需要的權(quán)限,×表示不需要的權(quán)限。
API種類 | GLOBAL WRITE | GLOBAL READ | GLOBAL ADMIN |
/api/put | ○ | × | × |
/api/query | × | ○ | × |
/api/query/last | × | ○ | × |
/api/mput | ○ | × | × |
/api/mquery | × | ○ | × |
/api/query/mlast | × | ○ | × |
/api/suggest | × | ○ | × |
/api/dump_meta | × | ○ | × |
/api/search/lookup | × | ○ | × |
/api/ttl | × | × | ○ |
/api/truncate | × | × | ○ |