使用者與許可權管理可以實現不同使用者對不同資料庫的存取權限控制,防止未授權使用者惡意訪問或篡改資料,從而提高資料庫的安全性。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串連並使用時序引擎。
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 | × | × | ○ |