用户权限及验证

总览

TigerGraph平台提供了一系列强大的身份验证功能,帮助数据库管理人员轻松管理用户权限以及对GSS操作进行验证:
  • 创建和管理多个TigerGraph用户账户。
  • 基于不同的图,为每一个用户分配适用于该图的特定身份,每个身份对应一组权限。
  • 可以使用Oauth 2.0方式进行用户验证。
  • 权限控制的设计框架预留了未来的扩展空间,未来的版本会添加更多的基于安全策略和用户账户的验证功能。
TigerGraph的权限逻辑是基于用户身份的,所以它可以应用到一个多图环境中: 一个用户只在某个特定的图中被分配身份,该身份的作用域不超出图的范围 。但是,超级用户(自1.2版本中引入)可以管理超级图(即所有的图的全集)。

账户与密码

TigerGraph的用户账户存在的前提是TigerGraph平台已经存在,它与操作系统的账户是不同的。一个新安装会自动生成一个初始用户,默认用户名和密码都是tigergraph。该账户拥有一切管理权限,可于创建其他账户并给其他账户分配权限(详见身份和权限。也就是说,这个初始的tigergraph账号其实就是超级用户。
如果启用了用户验证(详见用户验证功能的启用与使用方法),则TigerGraph只有在收到有效的用户名密码、以及对应用户名拥有相关权限的前提下,才会执行该用户提交的操作请求。
TigerGraph接受两种用户验证方法:
  1. 1.
    用户名+密码
  2. 2.
    令牌(token):令牌为一个内含有效期的32字节的字符串,可用于REST++验证。

用户验证功能的启用与使用方法

用户验证功能在刚刚安装完TigerGraph后,默认是关闭的。安装程序会创建一个gsql超级用户,用户名和密码都是tigergraph。无论任何情况,只要超级用户的用户名和密码都是tigergraph,系统就不会执行用户验证,这样设计的初衷是为了便于在没有安全顾虑的情况下(例如用户演示环境或培训环境),更加容易地完成安装和配置步骤。在早期没有多身份和多图模式的TigerGraph版本中,我们就这么设计了。
由于有两种方法可以用来访问TigerGraph数据库(GSQL shell方式及REST++方式),所以我们需要针对这两种方法,配置不同的参数来同时启用两种方法的用户验证功能。
  1. 1.
    配置GSQL的方法:修改tigergraph用户的密码,使之不同于tigergraph。
  2. 2.
    配置Oauth 2的方法(用于REST++):使用gadmin工具配置RESTPP.Authentication参数。具体的配置方法详见下文。
有关于这两种配置方法的细节详见下文。
基于web页面的GraphStudio UI工具的用户验证功能正在开发

GSQL访问方法的配置

对于GSQL访问方式,启用用户验证功能的步骤为:修改tigergraph用户的密码。详见下文中的“修改密码”部分。
在单用户模式下,运行GSQL命令或命令文件,并提供用户名和密码。“-u”参数表示用户名,“-p”参数表示密码。假设没有提供密码,则系统随后会提示操作人员输入密码,这意味着在这种情况下的配置方式一定是交互模式。如果连用户名(-u)都没有提供,则系统会默认该请求来自tigergraph用户名,随后也会提示操作人员输入密码(假定我们已经启用了GSQL验证)。注意,如果未提供用户名,且用户验证处于关闭状态,则系统默认不会验证用户,而全部执行所有输入的请求。这在之前的所有版本也均为如此,我们称之为无保护的管理员模式(unprotected administrative mode)。
TigerGraph从1.2版本开始支持多图模式,所以如果使用者只想在指定的图上执行请求的话,则该请求的命令行中必须指定图名。这可以使用“-g”参数来实现。
执行一个同时包含用户名、密码、图名的GSQL命令
$ gsql [-u username] [-p pasword] [-g gname] <commmand>
Password: ********
在GSQL的交互模式中运行上述命令时,只需要省略command部分,因为在shell中操作人员无须重复提交用户名和密码。下面的例子演示了两个用户各自通过自己的密码登录shell。这种情况下,操作人员也不需要指定图名。
{% code-tabs %} {% code-tabs-item title="例:进入交互模式" %}
例:进入交互模式
$ gsql
Password for tigergraph: ********
Welcome to GSQL Shell version: 1.2
GSQL > SHOW USER
Users:
- Name: tigergraph
- Roles: admin, observer
GSQL > EXIT
$ gsql -u frank
Password for frank: ******
Welcome to GSQL Shell version: 1.2
GSQL > SHOW USER
- Name: frank
- Secret: jiokmfqqfu2f95qs6ug85o89rpkneib3
- Roles: designer, observer
GSQL > EXIT

REST++访问模式的用户验证

我们的REST++服务器使用OAuth 2.0方式的用户验证:每个用户可以创建一个或多个密文(secret,即一个由伪随机算法生成的唯一的字符串)。每条密文关联一个用户账户以及该账户在特定图上所拥有的权限。任何人都能够使用该密文,并通过引入一个特殊的REST端点而生成一个令牌(token)。随后,令牌便用于通过其他的REST端点来控制TigerGraph数据库指令。根据OAuth 2.0协议,每个令牌都有一个生命周期。默认的生命周期为一个月。
每条REST++请求都会在它的HTTP头部(header)中包含一个验证令牌。REST++服务器会在HTTP头中读取该令牌,若令牌失效,则REST++会拒绝该请求并提示验证错误。
启用REST++验证功能 下面的命令可用于启用REST++令牌验证功能:
启用REST++ OAuth验证
gadmin --configure RESTPP.Authentication
gadmin config-apply
gadmin restart restpp nginx vis -y
创建令牌 操作人员必须在创建令牌之前先创建一条密文。密文是贼GSQL中生成的(详见‘创建密文’部分);GET /requesttoken端点用于创建令牌。
  • 密文 (必须提供): 用户的密文
  • 有效期(可选): 令牌的有效期,单位为秒。默认为一个月,折合约260万秒.
例: 为REST++请求生成令牌
curl -X GET 'localhost:9000/requesttoken?secret=jiokmfqqfu2f95qs6ug85o89rpkneib3&lifetime=1000000'

使用令牌

当启用了REST++验证后,我们必须在每个HTTP请求的头部都附上令牌。如果需要使用curl工具重写REST++请求,则需要用到以下语法:
使用curl工具提交GSQL请求,在HTTP头中嵌入验证令牌
curl -X GET -H "Authorization: Bearer <token>" 'http://localhost:9000/query/graphname/queryname?param1=val1&param2=val2
如果在GSQL命令中添加RUN QUERY字段,则意味着该GSQL命令会自动执行一个GSQL内部的curl命令,并对于该curl命令使用(或先生成,后使用)对应用户的令牌。
使用gadmin工具进行用户验证
当前版本下,gadmin工具通过Linux操作系统来验证用户,而与GSQL组件无关。简单来说,只有Linux下的TigerGraph用户才能使用gadmin工具。
详细描述:安装程序会在必要时为TigerGraph平台对应的Linux操作系统账号设定(或生成)一个用户名和密码,且默认用户名和密码都使用tigergraph。该账号为Linux操作系统用户。只有通过该系统账号才能使用gadmin工具。这个Linux操作系统账号和“GSQL用户验证”章节中提到的默认用户账号没有关系。

身份和权限

针对多图情况下的不同逻辑,我们对v1.2版本中的超级用户的身份权限做了一些修改。当前版本下,所有的身份都是基于特定的图所分配的。请认真阅读下文中的身份权限列表。
TigerGraph平台预设定了六种不同的身份:超级用户(superuser)、管理员(admin)、开发者(designer)、查询编写者(querywriter)、查询阅读者(queryreader)和观察者(observer)。每种不同身份有一组不同的权限。权限大小自上而下继承,位于最顶端的是超级用户。简单而言,分配逻辑如下:
  • 观察者(以前的版本叫公共账号,即public)允许登录数据库,并在指定的图中读取数据库纲目和其他目录的细节,也可以自行修改自己的密码。
  • 查询阅读者除了拥有观察者的权限之外,还能在指定的图上运行已有的加载作业和查询。
  • 查询编写者除了拥有查询阅读者的权限之外,还能在指定的图上创建查询,以及执行一些数据处理命令。
  • 开发者(之前的版本叫架构师,即architect)除了拥有查询编写者的权限之外,还可以在指定的图上修改数据库纲目,以及创建加载作业。
  • 管理员除了拥有开发者的所有权限之外,还能够在指定的图上创建和删除用户,并为他们分配或回收权限。这意味着管理员可以对其他用户的权限进行管理。
  • 超级用户自动获得所有的图的管理员权限,同时可以创建全局点类和边类。它还能够创建新的图,或删除整个数据库。
下面的表格详细记录了每种身份拥有的权限。除了超级用户之外,其他人的权限范围都局限在特定的图之内。在某些情况下,一条命令的输出可能会因为账号权限等级的不同而有所变化。下文中会详细介绍账户管理的命令。有关图的定义、加载、查询和命令编辑的详情,请参与GSQL语法参考。
命令类型
操作动作
超级用户
管理员
开发者
查询编写者
查询阅读者
观察者
查看状态
列出状态
x
x
x
x
x
x
用户管理
创建和删除用户
x
x
显示用户信息
x
x
x
x
x
x
修改密码
x
x
x
x
x
x
权限的分配/收回
x
x
密文的创建/删除/详述
x
x
x
x
x
令牌的创建/删除/详述/刷新 (不建议使用)
x
x
x
x
x
设计数据库纲目
点/边/图 的创建与删除
x
删除图存储
x
整体删除(Drop All)
x
使用一个图(Use Graph)
x
x
x
x
x
x
创建/执行全局的数据库纲目修改作业
x
x
x
x
x
x
创建/执行全局的数据库纲目修改作业
x
创建/执行数据库纲目修改作业
x
x
x
加载与查询
创建/删除加载作业
x
x
x
创建/安装/删除 查询
x
x
x
x
Typedef操作
x
x
x
x
线下到线上的作业转换
x
x
x
x
执行查询
x
x
x
x
x
= 新引入的操作
= 在1.2版本前,管理员和开发者可以执行该操作.
如果某条命令不在上面的表格中,默认该命令至少能够被观察者账号访问。

创建和管理用户

在TigerGraph的安装过程中,系统会自动创建一个叫做tigergraph的超级用户。该超级用户拥有一切操作权限,包括建立和删除其他用户,和为其他用户分配权限等。该超级用户还可以用来创建其他超级用户,创建出来的其他超级用户也拥有一切权限。
管理员的权限类似于超级用户,唯一的区别是管理员只能在某个特定的图的范围里创建用户和分配权限。
超级用户tigergraph是永久存在的,不能被其他账户删除。
本章节中的绝大多数命令都只能由超级用户或管理员运行。唯一的例外是SHOW USER,任何用户都能用它查看自己的身份信息。
用户管理命令
CREATE USER
DROP USER <user1>,...<userN>
SHOW USER
ALTER PASSWORD [<user1>]
GRANT ROLE admin [ON GRAPH <gname>] TO <user1>,...<userN>
REVOKE ROLE admin [ON GRAPH <gname>] FROM <user1>,...<userN>

创建用户

需要权限: 超级用户,管理员 新建一个用户。过程中GSQL会询问用户名和密码。
例: 创建用户
tigergraph:GSQL > CREATE USER
User Name : frank
New Password : ************
Re-enter Password : ************
The user "frank" is created.

删除用户

DROP USER <user1>,...<userN>
需要权限: 超级用户,管理员 删除列出的用户。
注意:本命令不会提示任何警告,且操作不可逆
例: 删除两个用户
tigergraph:GSQL > DROP USER hermione, jk
Password: *********
The user "hermione" is dropped.
The user "jk" is dropped.

查看用户信息

需要权限: 任何类型的账户
显示对应账号的用户名,身份,密文和令牌。非管理员非超级用户的账号只能看到自己的相关信息。管理员/超级用户则能够看到所有人的信息。
例: 管理员查看所有用户的相关信息
tigergraph:GSQL > SHOW USER
Users:
- Name: tigergraph
- Roles: admin, observer
- Name: frank
- Secret: 3ridhimp5icllq04qgt0r1fgddv1hf9e
- Token: j13nv837thrr19u0ahjr8m0is2ded6kk expire at: 2017-09-13 15:18:05
- Roles: designer, observer
- Name: jk
- Roles: observer
- Name: hermione
- Roles: observer

修改密码

ALTER PASSWORD [<user1>]
管理员/超级用户新建一个用户后,需要为其配置一个初始密码。随后,该用户可自行修改其密码。
例: 管理员修改自己的密码
herminone:GSQL > ALTER PASSWORD
Password: *******
New Password : ************
Re-enter Password : ************
Password has been changed.
此外,管理员/超级用户也能修改他人的密码。例如,通过ALT PASSWORD hermione为用户名为hermione的账号修改密码。
例: 管理员为他人他人修改密码。
tigergraph:GSQL > ALTER PASSWORD hermione
Password: *******
New Password : ************
Re-enter Password : ************
Password has been changed.

分配/回收权限

GRANT ROLE <username> [ON GRAPH <gname>] TO <user1>,...<userN>
REVOKE ROLE <username> [ON GRAPH <gname>] FROM <user1>,...<userN>
权限要求: 超级用户,管理员 分配(或回收)身份权限,也叫做添加(或删除)身份权限
除非使用了超级用户,否则必须要通过ON GRAPH子句指定需要操作的图名。
下面的示例中,我们为两个用户分别分配了查询阅读者权限,然后从其中一人身上收回该权限。随后再一次为两人分配查询编写者权限。
例: 分配/回收权限
GSQL > GRANT ROLE queryreader ON GRAPH Hogwarts TO jk,hermione
Role "queryreader" is successfully granted to user(s): jk, hermione
GSQL > REVOKE ROLE queryreader ON GRAPH Hogwarts FROM hermione
Role "queryreader" is successfully revoked from user(s): hermione
GSQL > GRANT ROLE querywriter ON GRAPH London TO hermione,jk
Role "querywriter" is successfully granted to user(s): hermione, jk
GSQL > SHOW USER
Users:
* - Name: tigergraph
- Roles: superuser
- Name: hermione
- Roles:
- GraphName: London
- Roles: querywriter
- Name: jk
- Roles:
- GraphName: Hogwarts
- Roles: queryreader
- GraphName: London
- Roles: querywriter
一个用户可以拥有多个身份。例如,一个用户可以同时在图Hogwarts上拥有查询阅读者权限,而在另一个图London上拥有查询编写者权限。

创建和管理代理用户组

代理用户组(Proxy Group)用于LDAP远程验证。 对于代理用户组的新建、详述和删除操作都需要用到超级用户或管理员用户权限。

创建用户组

CREATE GROUP <groupname> PROXY "<attributename>=<value>"
需要权限:管理员、超级用户 创建一个代理用户组,组内成员的某条属性均满足条件attributename=value。
当用户组建立后,可以对该组分配(或移除)身份。如下所示:
例:创建用户组以及分配身份
CREATE GROUP developers PROXY "role=engineering"
GRANT ROLE querywriter ON GRAPH computerNet TO developers

显示组信息

SHOW GROUP <groupname>
需要权限:管理员、超级用户 输出用户组的详细信息。

删除组

DROP GROUP <groupname>
需要权限:管理员、超级用户. 删除指定的组。 组内成员会失去代理关联关系,但其他方面不影响。

管理账号

当启用用户验证时,TigerGraph将在任何操作中强制用户提供用户名和密码,以便辨明该用户权限。
TigerGraph有提供两中账号验证方式:
  1. 1.
    用户名+密码
  2. 2.
    令牌验证:即一个32字节的字符串,可用于REST++请求。 令牌自创建之日起三个月有效。
下面的命令用于创建和管理密码,密文和令牌。
GSQL中的账号管理命令
ALTER PASSWORD [user1]
CREATE SECRET [alias1]
SHOW SECRET
DROP SECRET <secret1>
CREATE TOKEN
SHOW TOKEN
DROP TOKEN <token1>
REFRESH TOKEN <token1>
和其他GSQL命令类似,用户在执行这些操作的时候必须提供账户信息。创建密文和令牌必须要验证密码。

密文操作:创建、显示、删除

该命令用于创建和管理用户密文(secret)。密文是一个唯一的字符串,在特定环境中可作为用户账户验证身份。每次执行CREAT SECRET命令时都会生成一个全新的密文。因此在删除密文时,用户必须指定具体指定要删除的密文。下面的例子中包括如何用密码登录GSQL shell,创建两条密文(每个图一条),及删除其中的一条密文的操作。
一条密文代表不仅代表了一个用户账户,也代表了它在特定图上的权限。如果某个用户的权限被收回,则对应的密文也随之失效。
例:创建、显示、删除密文
$ gsql -u jk -g Hogwarts
Password for jk : *******
Welcome to GSQL Shell version: 1.2
GSQL > CREATE SECRET HH
The secret: 4sjmn1q13vp2klqb7v3t151vac9db2am has been created for user "tigergraph".
GSQL > SHOW SECRET
- Secret: 4sjmn1q13vp2klqb7v3t151vac9db2am
- Alias: HH
- GraphName: Hogwarts
GSQL > USE GRAPH London
Using graph 'London'
GSQL > CREATE SECRET LL
The secret: 75j8kf75g545mgc24mefsjm1iic7m9i2 has been created for user "tigergraph".
GSQL > SHOW SECRET
- Secret: 4sjmn1q13vp2klqb7v3t151vac9db2am
- Alias: HH
- GraphName: Hogwarts
- Secret: 75j8kf75g545mgc24mefsjm1iic7m9i2
- Alias: LL
- GraphName: London
GSQL > USE GRAPH Hogwarts
Using graph 'Hogwarts'
GSQL > DROP SECRET 4sjmn1q13vp2klqb7v3t151vac9db2am
Secret 4sjmn1q13vp2klqb7v3t151vac9db2am has been removed.
GSQL > SHOW SECRET
- Secret: 75j8kf75g545mgc24mefsjm1iic7m9i2
- Alias: LL
- GraphName: London

令牌操作:创建、显示、删除、刷新 (不建议使用)

不建议在GSQL中直接执行TOKEN命令组。我们推荐使用REST++ 端点的GET/request方法获得令牌。
这组命令用于创建和管理用户令牌。用户令牌是一个唯一的字符串,用于在REST++请求中进行身份验证。事实上,令牌验证是REST++唯一支持的验证方式。用户必须在创建令牌前先生成密文。每个令牌都有生命周期和失效时间。默认的生命周期是三个月。然而,这三个月的起始日期是可以被不断刷新的。我们通过REFRESH TOKEN命令可将起始日期刷到当下时间,从而延长令牌的有效期。
下面一组命令演示了如何:登录GSQL,创建密文,用其创建令牌,用另一条密文创建另一个令牌,然后删除其中一个令牌。
例:创建、显示、删除、刷新令牌
$ gsql -u jk -g London
Password for jk : *******
GSQL > CREATE SECRET
The secret: mv88grasoidc7fenk1ffl6hnll8f2apf has been created for user "jk".
GSQL > SHOW SECRET
- Secret: 33bt4o86c33nauhhipaenh9pluun86po
- GraphName: London
- Secret: mv88grasoidc7fenk1ffl6hnll8f2apf
- GraphName: London
GSQL > CREATE TOKEN
Secret : 33bt4o86c33nauhhipaenh9pluun86po
The access token: kn1hlp1a6b9lugq2mkqohsd8i0ht2tt3 is created and it will expire at 2018-05-03 18:39:19.
GSQL > SHOW TOKEN
- Secret: 33bt4o86c33nauhhipaenh9pluun86po
- Token: kn1hlp1a6b9lugq2mkqohsd8i0ht2tt3 expire at: 2018-05-03 18:39:19
- GraphName: London
- Secret: mv88grasoidc7fenk1ffl6hnll8f2apf
- GraphName: London
GSQL > CREATE TOKEN
Secret : mv88grasoidc7fenk1ffl6hnll8f2apf
The access token: ieec6odigmja01rkt3qmq0nar4iufsvq is created and it will expire at 2018-05-03 18:39:49.
GSQL > SHOW TOKEN
- Secret: 33bt4o86c33nauhhipaenh9pluun86po
- Token: kn1hlp1a6b9lugq2mkqohsd8i0ht2tt3 expire at: 2018-05-03 18:39:19
- GraphName: London
- Secret: mv88grasoidc7fenk1ffl6hnll8f2apf
- Token: ieec6odigmja01rkt3qmq0nar4iufsvq expire at: 2018-05-03 18:39:49
- GraphName: London
GSQL > DROP TOKEN kn1hlp1a6b9lugq2mkqohsd8i0ht2tt3
Token kn1hlp1a6b9lugq2mkqohsd8i0ht2tt3 has been removed.
GSQL > SHOW TOKEN
- Secret: 33bt4o86c33nauhhipaenh9pluun86po
- Alias: LL
- GraphName: London
- Secret: mv88grasoidc7fenk1ffl6hnll8f2apf
- Token: ieec6odigmja01rkt3qmq0nar4iufsvq expire at: 2018-05-03 18:39:49
- GraphName: London