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