用户及权限管理
本文介绍Lindorm时序引擎中访问控制机制以及如何进行用户管理及权限管理。
时序引擎的访问控制体系
Lindorm提供了一套多层次的访问控制体系,从而提供企业级应用的安全保障。访问控制体系如下所示:
第一层防护:实例级别的物理层面访问控制
管理方法可参见设置白名单。
第二层防护:引擎级别的逻辑层面访问控制
在引擎层面提供的基于用户认证以及权限校验为主体的访问控制。
用户认证与权限校验功能的启用
对于一个Lindorm实例的时序引擎,默认情况下未启用用户认证与权限校验。因此在默认情况下无论是通过哪种方式访问时序引擎,都可以不带上用户信息直接操作。
但是,对于一个投入线上生产应用的实例而言,出于安全因素考虑,强烈建议开启时序引擎的用户认证与权限校验。通过ALTER SYSTEM语句开启,具体方法如下:
通过任意方式连接到时序引擎后,执行ALTER SYSTEM SET USER_AUTH=TRUE;
即可开启用户认证与权限校验功能。
时序引擎一旦开启用户认证和权限校验,后续的所有访问都必须带上用户信息,否则将可能出现鉴权失败(包括当前执行
ALTER SYSTEM
语句启用用户认证和权限校验的连接)。因此,该功能开启后,已有的部分业务访问可能会失败。所以在开启该功能前,建议仔细规划并充分评估影响。用户认证与权限校验功能开启后也可通过ALTER SYSTEM语句关闭。执行语句如下:
ALTER SYSTEM SET USER_AUTH=FALSE;
查看当前实例是否已经开启用户认证与权限校验功能,可通过SHOW PARAMETER语句查看。执行语句如下:
SHOW PARAMETER USER_AUTH;
时序引擎基于用户认证与权限校验的访问控制
当用户认证与权限校验的功能开启后,业务对时序引擎的访问都需要在连接时带上用户名和密码。同时,无论是写入还是查询操作,连接所属用户必须要具有访问目标的对应权限,操作才能成功。通过这种方式,时序引擎可以对业务访问进行严格的安全控制以及权限隔离。
在使用SQL时带上认证信息的方法
随着业务形态不同,在连接时指定用户名、密码的方式也有所差异。具体如下:
使用Lindorm-Cli访问时序引擎的场景
使用JDBC构建应用的场景
请参见URL语法与连接参数。
基于通用SQL接口构建应用的场景
请参见用户认证信息指定。
用户管理
时序引擎通过SQL提供了用户管理的能力,提供的能力如下:
增加用户
请参见CREATE USER。
删除用户
请参见DROP USER。
修改用户密码
请参见ALTER USER。
查看已有用户
请参见SHOW。
实例创建后会默认创建一个初始用户。它的用户名为root,密码也是root,可以用于创建其他业务所需的用户并赋权。
开启用户认证与权限校验功能后,需要先以root用户登录才可以增加其他用户。
强烈建议实例创建完毕后立即修改上述初始用户密码,否则可能会造成很大的安全隐患。
权限管理
时序引擎中的权限分为四种,如下所示:
权限名 | 含义 |
READ | 读权限。当查询数据时,要求用户对查询所涉及的数据表具有读权限。 |
WRITE | 写权限。当写入数据时,要求用户对查询所设计的数据表具有写权限。 |
ADMIN | 管理权限。当对时序引擎中的数据对象进行管理时,需要用户对操作的数据对象具有管理权限。 |
SYSTEM | 系统权限。当一些操作可能会影响整个实例的行为时,这样的操作需要用户具有系统权限。 |
另一方面,时序引擎可以根据不同的业务需求限定对用户权限赋予以及回收的范围。当前时序引擎支持的权限赋予和回收的粒度如下:
GLOBAL
全局范围的授权与撤回。
当用户被赋予全局范围的任意种类权限后,用户则拥有了对于整个时序引擎内所有数据对象的对应操作权限。比如一个全局的READ权限将使得用户可以查询任意数据库中的任意时序数据表。
DATABASE
数据库范围的授权与撤回。
当用户被赋予某个数据库的指定种类权限后,用户则拥有了对于该数据库内部所有数据对象的对应操作权限。比如某个数据库DB1的READ权限将使得用户可以查询该数据库内的所有时序数据表。
时序引擎支持通过GRANT语句对用户进行授权,同时支持通过REVOKE语句对用户已有权限进行撤回。
尝试对用户进行权限授予或撤回时,要求当前连接所属的用户本身拥有全局ADMIN权限。
权限的优先级是GLOBAL>DATABASE。即如果拥有了GLOBAL的READ权限,则能查询任意Database中的时序表;但如果只是拥有特定Database的READ权限,则只能查询该Database下的时序表。
SYSTEM权限只能是GLOBAL范围的权限。
常用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... | × | × | ○ | × | × | × | ○ | 拥有目标数据库的ADMIN权限也可变更。 |
DROP DATABASE... | × | × | ○ | × | × | × | ○ | 拥有目标数据库的ADMIN权限也可删除。 |
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时的用户鉴权
对于部分使用OpenTSDB兼容的HTTP API访问时序引擎的应用(参见已有OpenTSDB或时序数据库TSDB应用程序迁移指引),当用户认证与权限校验功能启用时,发送到这些API的请求也需要带上用户信息。
访问OpenTSDB兼容API时指定用户信息的方法
指定方法类似调用通用SQL接口,通过在HTTP请求头中加入基于Basic Authentication协议编码的用户认证信息,详细可参见用户认证信息指定。
说明对于使用时间序列数据库TSDB的SDK的业务,用户名和密码可以通过创建
TSDBConfig
对象时调用basicAuth
方法来指定。访问OpenTSDB兼容API所需的权限
调用这些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
×
×
○
与宽表引擎访问控制的融合
时序引擎的用户信息与权限数据与宽表引擎可以通用,因此如果创建的Lindorm实例中也包含宽表引擎的话,在时序引擎中创建的用户也可以用于访问宽表引擎。此时,时序引擎的用户也可在宽表引擎的集群管理工具中进行查阅和管理,如下图所示:

同理,宽表引擎中创建的用户同样也可用于访问时序引擎,可以通过在时序引擎中对宽表引擎的用户赋予特定时序引擎Database的权限来实现。
宽表引擎的用户可能被授予TRASH权限,该权限目前在时序引擎中并无实际意义。
如果宽表引擎中的一个Namespace与时序引擎的Database同名,且某个用户拥有该Namespace的权限,则该用户默认就拥有了对时序引擎同名Database的相应访问权限。反之亦然。