用户与权限管理可以实现不同用户对不同数据库的访问权限控制,防止未授权用户恶意访问或篡改数据,从而提高数据库的安全性。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 | × | × | ○ |