认证和授权

认证

InfluxDB的HTTP API和命令行界面(CLI),包括简单的基于用户凭据的内置认证。当开启认证时,InfluxDB只会执行发送中带有有效证书的HTTP请求。

注意:认证只发生在HTTP请求范围内。插件目前不具备认证请求的能力,(例如Graphite、collectd等)是没有认证的。

创建认证

1. 至少创建一个admin用户

如果你开启了认证但是没有用户,那么InfluxDB将不会开启认证,而且只有在创建了一个admin用户之后才会接受外部请求。

当创建一个admin用户后,InfluxDB才能开启认证。

2. 在配置文件中,认证默认是不开启的

[http]区域的配置auth-enabled设为true,可以开启认证:

  1. [http]
  2. enabled = true
  3. bind-address = ":8086"
  4. auth-enabled = true # ✨
  5. log-enabled = true
  6. write-tracing = false
  7. pprof-enabled = false
  8. https-enabled = false
  9. https-certificate = "/etc/ssl/influxdb.pem"

3. 重启进程

现在InfluxDB会核对每个请求中的用户信息,只会处理已有用户而认证通过的请求。

认证请求

HTTP API中的认证

有两个HTTP API进行验证的方式。

如果使用基本身份验证和URL查询参数进行身份验证,则以查询参数中指定的用户优先。下面的示例中的查询假定用户是admin用户。

RFC 2617中所描述的基本身份验证

这是提供用户的首选方法。例:

  1. curl -G http://localhost:8086/query -u todd:influxdb4ever --data-urlencode "q=SHOW DATABASES"
在URL的参数或是请求体里面提供认证

设置up参数, 例:

  1. curl -G "http://localhost:8086/query?u=todd&p=influxdb4ever" --data-urlencode "q=SHOW DATABASES"

认证在请求体中的例子:

  1. curl -G http://localhost:8086/query --data-urlencode "u=todd" --data-urlencode "p=influxdb4ever" --data-urlencode "q=SHOW DATABASES"

CLI中的认证

在CLI中有三种认证方式。

设置INFLUX_USERNAMEINFLUX_PASSWORD环境变量

例如:

  1. export INFLUX_USERNAME todd
  2. export INFLUX_PASSWORD influxdb4ever
  3. echo $INFLUX_USERNAME $INFLUX_PASSWORD
  4. todd influxdb4ever
  5. influx
  6. Connected to http://localhost:8086 version 1.3.x
  7. InfluxDB shell 1.3.x
开启CLI时设置usernamepassword

例如:

  1. influx -username todd -password influxdb4ever
  2. Connected to http://localhost:8086 version 1.3.x
  3. InfluxDB shell 1.3.x
开启CLI后使用auth <username> <password>

例如:

  1. influx
  2. Connected to http://localhost:8086 version 1.3.x
  3. InfluxDB shell 1.3.x
  4. > auth
  5. username: todd
  6. password:
  7. >

授权

当开启认证之后,授权也就开启了。默认情况下,所有的用户都有所有的权限。

用户类型和权限

admin用户

admin用户有所有数据库的读写权限,这些所有的权限包括如下:

数据库管理:

  • CREATE DATABASE, DROP DATABASE
  • DROP SERIES, DROP MEASUREMENT
  • CREATE RETENTION POLICY,ALTER RETENTION POLICY, 和 DROP RETENTION POLICY
  • CREATE CONTINUOUS QUERYDROP CONTINUOUS QUERY

用户管理:

  • admin用户管理:CREATE USER, GRANT ALL PRIVILEGES, REVOKE ALL PRIVILEGES,和SHOW USERS

  • 非admin用户管理:CREATE USER, GRANT [READ,WRITE,ALL], REVOKE [READ,WRITE,ALL],和SHOW GRANTS

  • 一般admin用户管理:SET PASSWORDDROP USER

非admin用户

非admin用户对于每个数据库,有如下三个权限:

  • READ
  • WRITE
  • ALL(包括READWRITE

READ,WRITEALL控制到每个数据库每个用户上。一个新的非admin用户对任何数据库都没有权限,除非被admin用户指定一个数据库权限。非admin用户可以在他们有READ或/和WRITE权限的机器上运行SHOW命令。

用户管理命令

admin用户管理

当开启HTTP认证之后,在你操作系统之前,InfluxDB要求你至少创建一个admin用户。

  1. CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES
CREATE另一个admin用户
  1. CREATE USER <username> WITH PASSWORD '<password>' WITH ALL PRIVILEGES

CLI例子:

  1. > CREATE USER paul WITH PASSWORD 'timeseries4days' WITH ALL PRIVILEGES
  2. >

注意:重复创建确切的用户语句是幂等的。如果有值发生变化,数据库将返回一个重复的用户错误。CLI例子:

  1. CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
  2. CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
  3. CREATE USER todd WITH PASSWORD '123' WITH ALL PRIVILEGES
  4. ERR: user already exists
  5. CREATE USER todd WITH PASSWORD '123456'
  6. ERR: user already exists
  7. CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
给一个存在的用户GRANT权限
  1. GRANT ALL PRIVILEGES TO <username>

CLI例子:

  1. > GRANT ALL PRIVILEGES TO "todd"
  2. >
给一个admin用户REVOKE权限
  1. REVOKE ALL PRIVILEGES FROM <username>

CLI例子:

  1. > REVOKE ALL PRIVILEGES FROM "todd"
  2. >
SHOW所有存在的用户以及其admin状态
  1. SHOW USERS

CLI例子:

  1. > SHOW USERS
  2. user admin
  3. todd false
  4. paul true
  5. hermione false
  6. dobby false

非admin用户管理

CREATE一个非admin用户:
  1. CREATE USER <username> WITH PASSWORD '<password>'

CLI例子:

  1. > CREATE USER todd WITH PASSWORD 'influxdb41yf3'
  2. > CREATE USER alice WITH PASSWORD 'wonder\'land'
  3. > CREATE USER "rachel_smith" WITH PASSWORD 'asdf1234!'
  4. > CREATE USER "monitoring-robot" WITH PASSWORD 'XXXXX'
  5. > CREATE USER "$savyadmin" WITH PASSWORD 'm3tr1cL0v3r'
  6. >

注意:

  • 用户名如果用一个数字的开始,或者是一个influxql关键字,又或者包含任何特殊字符,例如:!@#$%^&*()-, 则必须用双引号引起来
  • 密码字符串必须用单引号引起来。
  • 在验证请求时不包含单引号。

如果密码包含单引号或换行符,当提交认证请求时,应该用反斜杠转义。

GRANT READ, WRITE或者ALL数据库权限给一个存在的用户
  1. GRANT [READ,WRITE,ALL] ON <database_name> TO <username>

CLI例子: 给用户todd``GRANT数据库NOAA_water_databaseREAD的权限:

  1. > GRANT READ ON "NOAA_water_database" TO "todd"
  2. >

给用户todd``GRANT数据库NOAA_water_databaseALL的权限:

  1. > GRANT ALL ON "NOAA_water_database" TO "todd"
  2. >
REVOKE READ, WRITE或者ALL 数据库权限给一个存在的用户
  1. REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>

CLI例子: 给用户todd``REVOKE数据库NOAA_water_databaseALL的权限:

  1. > REVOKE ALL ON "NOAA_water_database" FROM "todd"
  2. >

给用户todd``REVOKE数据库NOAA_water_databaseWRITE的权限:

  1. > REVOKE WRITE ON "NOAA_water_database" FROM "todd"
  2. >
SHOW一个用户的数据库权限
  1. SHOW GRANTS FOR <user_name>

CLI例子:

  1. > SHOW GRANTS FOR "todd"
  2. database privilege
  3. NOAA_water_database WRITE
  4. another_database_name READ
  5. yet_another_database_name ALL PRIVILEGES

普通admin和非admin用户管理

重新设置一个用户的密码
  1. SET PASSWORD FOR <username> = '<password>'

CLI例子:

  1. > SET PASSWORD FOR "todd" = 'influxdb4ever'
  2. >
  1. > **Note:** The password [string]($Query_language-influxdb-v1.3-query_language-spec-#strings) must be wrapped in single quotes.
DROP一个用户
  1. DROP USER <username>

CLI例子:

  1. > DROP USER "todd"
  2. >

认证和授权的HTTP错误

没有认证或者是带有不正确认证信息的请求发到InfluxDB,将会返回一个HTTP 401 Unauthorized的错误。

没有授权的用户的请求发到InfluxDB,将会返回一个HTTP 403 Forbidden的错误。