文档说明

InfluxDB 中的身份验证和授权

本页面记录了 InfluxDB OSS 的早期版本。 InfluxDB OSS v2 是最新稳定版本。 查看等效的 InfluxDB v2 文档: 管理 API 令牌

本文档涵盖了 InfluxDB 中设置和管理身份验证和授权的过程。

不应依赖身份验证和授权来防止访问和保护数据免受恶意行为者的侵害。如果需要额外的安全或合规性功能,应将 InfluxDB 运行在第三方服务后面。如果 InfluxDB 部署在公开可访问的端点上,我们强烈建议启用身份验证。否则,数据将对任何未经身份验证的用户公开。

身份验证

InfluxDB API 和通过 API 连接到数据库的 命令行界面 (CLI) 包含基于用户凭据的简单内置身份验证。启用身份验证后,InfluxDB 仅执行带有有效凭据发送的 HTTP 请求。

身份验证仅在 HTTP 请求范围内发生。插件目前没有验证请求和服务端点(例如,Graphite、collectd 等)的能力。

设置身份验证

  1. 至少创建一个 管理员用户。有关创建管理员用户的信息,请参阅 授权部分

    如果您启用了身份验证但没有用户,InfluxDB 不会 强制执行身份验证,并且只接受 查询 以创建新的管理员用户。

    一旦有管理员用户,InfluxDB 将强制执行身份验证。

  2. 在配置文件中启用身份验证,通过在 [http] 部分中将 auth-enabled 选项设置为 true 来实现。

    [http]
      enabled = true
      bind-address = ":8086"
      auth-enabled = true # Set to true
      log-enabled = true
      write-tracing = false
      pprof-enabled = true
      pprof-auth-enabled = true
      debug-pprof-enabled = false
      ping-auth-enabled = true
      https-enabled = true
      https-certificate = "/etc/ssl/influxdb.pem"
    

    如果 pprof-enabled 设置为 true,请将 pprof-auth-enabledping-auth-enabled 设置为 true 以在分析和 ping 端点上要求身份验证。

  3. 重启 InfluxDB。重启后,InfluxDB 在每个请求上检查用户凭据,并且仅处理具有现有用户的有效凭据的请求。

验证请求

使用 InfluxDB API 进行身份验证

使用 InfluxDB API 进行身份验证有两种选择。

如果您同时使用基本身份验证和 URL 查询参数进行身份验证,则查询参数中指定的用户凭据将具有优先级。以下示例中的查询假设用户是 管理员用户。有关不同用户类型、它们的权限以及用户管理的更多信息,请参阅 授权部分

注意:启用身份验证时,InfluxDB 会隐藏密码。

使用基本身份验证进行身份验证
curl -G https://127.0.0.1:8086/query \
  -u todd:influxdb4ever \
  --data-urlencode "q=SHOW DATABASES"
使用 URL 中的查询参数或请求体中的查询参数进行身份验证

u 设置为用户名,将 p 设置为密码。

凭据作为查询参数
curl -G "https://127.0.0.1:8086/query?u=todd&p=influxdb4ever" \
  --data-urlencode "q=SHOW DATABASES"
凭据在请求体中
curl -G https://127.0.0.1:8086/query \
  --data-urlencode "u=todd" \
  --data-urlencode "p=influxdb4ever" \
  --data-urlencode "q=SHOW DATABASES"

使用 CLI 进行身份验证

使用 CLI 进行身份验证有三个选项。[链接](/influxdb/v1/tools/shell/)

使用环境变量进行身份验证

使用 INFLUX_USERNAMEINFLUX_PASSWORD 环境变量向 influx CLI 提供身份验证凭据。

export INFLUX_USERNAME=todd
export INFLUX_PASSWORD=influxdb4ever
echo $INFLUX_USERNAME $INFLUX_PASSWORD
todd influxdb4ever

influx
Connected to https://127.0.0.1:8086 version 1.11.7
InfluxDB shell 1.11.7
使用 CLI 标志进行身份验证

使用 -username-password 标志向 influx CLI 提供身份验证凭据。

influx -username todd -password influxdb4ever
Connected to https://127.0.0.1:8086 version 1.11.7
InfluxDB shell 1.11.7
使用 influx shell 中的凭据进行身份验证

启动 influx shell 并运行 auth 命令。根据提示输入您的用户名和密码。

> influx
Connected to https://127.0.0.1:8086 version 1.11.7
InfluxDB shell 1.11.7
> auth
username: todd
password:
>

使用 JWT 令牌进行身份验证

为了使用密码的更安全替代方案,请将 JWT 令牌包含在请求 InfluxDB API 的请求中。目前这只能通过 [InfluxDB HTTP API](/influxdb/v1/tools/api/) 实现。

  1. 在 InfluxDB 配置文件中添加共享密钥
  2. 生成您的 JWT 令牌
  3. 在 HTTP 请求中包含令牌
在 InfluxDB 配置文件中添加共享密钥

InfluxDB 使用共享密钥来编码 JWT 签名。默认情况下,shared-secret 设置为空字符串,在这种情况下不进行 JWT 身份验证。在您的 [InfluxDB 配置文件](/influxdb/v1/administration/config/#shared-secret)中添加自定义共享密钥。密钥字符串越长,越安全

[http]
  shared-secret = "my super secret pass phrase"

或者,为了避免将您的密钥短语作为明文保留在 InfluxDB 配置文件中,使用 INFLUXDB_HTTP_SHARED_SECRET 环境变量设置值。

生成您的 JWT 令牌

使用身份验证服务使用您的 InfluxDB 用户名、过期时间和共享密钥生成安全令牌。有在线工具,如 [https://jwt.node.org.cn/](https://jwt.node.org.cn/),可以帮助您完成此操作。

令牌的有效负载(或声明)必须以下列格式

{
  "username": "myUserName",
  "exp": 1516239022
}
  • username - 您 InfluxDB 用户的名称。
  • exp - 令牌在 UNIX 纪元时间中的过期时间。为了提高安全性,保持令牌过期期限短。对于测试,您可以使用 https://www.unixtimestamp.com/index.php 手动生成 UNIX 时间戳。

使用您的共享密钥对有效负载进行编码。您可以使用自己的身份验证服务器中的 JWT 库或在 https://jwt.node.org.cn/ 中手动进行。

生成的令牌遵循以下格式:<header>.<payload>.<signature>

在 HTTP 请求中包含令牌

将您生成的令牌包含在 HTTP 请求的 Authorization 标头中。使用 Bearer 授权方案

Authorization: Bearer <myToken>

只有未过期的令牌才能成功进行身份验证。请确保您的令牌尚未过期。

带有 JWT 身份验证的示例查询请求
curl -G "https://127.0.0.1:8086/query?db=demodb" \
  --data-urlencode "q=SHOW DATABASES" \
  --header "Authorization: Bearer <header>.<payload>.<signature>"

对 InfluxDB 的 Telegraf 请求进行身份验证

对启用了身份验证的 InfluxDB 实例进行身份验证的 Telegraf 请求需要进行一些额外步骤。在 Telegraf 配置文件(/etc/telegraf/telegraf.conf)中,取消注释并编辑 usernamepassword 设置。

###############################################################################
#                            OUTPUT PLUGINS                                   #
###############################################################################

# ...

[[outputs.influxdb]]
  # ...
  username = "example-username" # Provide your username
  password = "example-password" # Provide your password

# ...

重新启动 Telegraf,您就设置好了!

授权

一旦您 启用了身份验证,就会实施授权。默认情况下,身份验证是禁用的,所有凭据都被默默忽略,所有用户都有所有权限。

用户类型和权限

管理员用户

管理员用户可以访问所有数据库的 READWRITE 权限,并可以完全访问以下管理查询

数据库管理
  • 创建数据库
  • 删除数据库
  • 删除系列
  • 删除度量
  • 创建保留策略
  • 修改保留策略
  • 删除保留策略
  • 创建连续查询
  • 删除连续查询

有关这些命令的更多信息,请参阅 [数据库管理](/influxdb/v1/query_language/manage-database/) 和 [连续查询](/influxdb/v1/query_language/continuous_queries/)。

用户管理

有关用户管理命令的完整讨论,请参阅下文

非管理员用户

非管理员用户在每个数据库中可以具有以下三种权限之一

  • 读取
  • 写入
  • 所有(既具有读取写入访问权限)

读取写入所有权限是按用户和数据库控制的。新的非管理员用户在没有被管理员用户特别授权数据库权限之前,无法访问任何数据库。非管理员用户可以显示他们具有读取和/或写入权限的数据库。

用户管理命令

管理员用户管理

当您启用HTTP身份验证时,InfluxDB要求您在可以与系统交互之前创建至少一个管理员用户。

CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES
创建另一个管理员用户
CREATE USER <username> WITH PASSWORD '<password>' WITH ALL PRIVILEGES

重复确切的CREATE USER语句是幂等的。如果任何值发生变化,数据库将返回重复用户错误。

> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
> CREATE USER todd WITH PASSWORD '123' WITH ALL PRIVILEGES
ERR: user already exists
> CREATE USER todd WITH PASSWORD '123456'
ERR: user already exists
> CREATE USER todd WITH PASSWORD '123456' WITH ALL PRIVILEGES
>
将管理权限授予现有用户
GRANT ALL PRIVILEGES TO <username>
从管理员用户撤销管理权限
REVOKE ALL PRIVILEGES FROM <username>
显示所有现有用户及其管理员状态
SHOW USERS
CLI示例
> SHOW USERS
user 	   admin
todd     false
paul     true
hermione false
dobby    false

非管理员用户管理

创建新的非管理员用户
CREATE USER <username> WITH PASSWORD '<password>'
CLI示例
> CREATE USER todd WITH PASSWORD 'influxdb41yf3'
> CREATE USER alice WITH PASSWORD 'wonder\'land'
> CREATE USER "rachel_smith" WITH PASSWORD 'asdf1234!'
> CREATE USER "monitoring-robot" WITH PASSWORD 'XXXXX'
> CREATE USER "$savyadmin" WITH PASSWORD 'm3tr1cL0v3r'
>
关于提供用户凭据的重要说明
  • 如果用户值以数字开头,是InfluxQL关键字,包含连字符和/或包含任何特殊字符,则必须用双引号括起来,例如:!@#$%^&*()-
  • 密码字符串必须用单引号括起来。在身份验证请求中不要包含单引号。我们建议避免在密码中使用单引号(')和反斜杠(\)字符。对于包含这些字符的密码,在创建密码和提交身份验证请求时,用反斜杠转义特殊字符(例如,在创建密码和提交身份验证请求时,使用(\')。
  • 重复确切的CREATE USER语句是幂等的。如果任何值发生变化,数据库将返回重复用户错误。有关详细信息,请参阅GitHub Issue #6890
CLI示例
> CREATE USER "todd" WITH PASSWORD '123456'
> CREATE USER "todd" WITH PASSWORD '123456'
> CREATE USER "todd" WITH PASSWORD '123'
ERR: user already exists
> CREATE USER "todd" WITH PASSWORD '123456'
> CREATE USER "todd" WITH PASSWORD '123456' WITH ALL PRIVILEGES
ERR: user already exists
> CREATE USER "todd" WITH PASSWORD '123456'
>
读取写入所有数据库权限授予现有用户
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>

CLI示例

读取权限授予toddNOAA_water_database数据库上

> GRANT READ ON "NOAA_water_database" TO "todd"
>

所有权限授予toddNOAA_water_database数据库上

> GRANT ALL ON "NOAA_water_database" TO "todd"
>
从现有用户撤销读取写入所有数据库权限
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>

CLI示例

toddNOAA_water_database数据库上撤销所有权限

> REVOKE ALL ON "NOAA_water_database" FROM "todd"
>

toddNOAA_water_database数据库上撤销写入权限

> REVOKE WRITE ON "NOAA_water_database" FROM "todd"
>

注意:如果具有所有权限的用户撤销了写入权限,他们将保留读取权限,反之亦然。

显示用户的数据库权限
SHOW GRANTS FOR <user_name>

CLI示例

> SHOW GRANTS FOR "todd"
database		            privilege
NOAA_water_database	        WRITE
another_database_name	      READ
yet_another_database_name   ALL PRIVILEGES
one_more_database_name      NO PRIVILEGES

通用管理员和非管理员用户管理

重置用户密码
SET PASSWORD FOR <username> = '<password>'

CLI示例

> SET PASSWORD FOR "todd" = 'influxdb4ever'
>

注意:密码字符串必须用单引号括起来。在身份验证请求中不要包含单引号。

我们建议避免在密码中使用单引号(')和反斜杠(\)字符。对于包含这些字符的密码,在创建密码和提交身份验证请求时,用反斜杠转义特殊字符(例如,在创建密码和提交身份验证请求时,使用(\')。

删除用户
DROP USER <username>

CLI示例

> DROP USER "todd"
>

身份验证和授权HTTP错误

没有身份验证凭据或凭据错误的请求将产生HTTP 401 未授权响应。

未经授权用户的请求将产生HTTP 403 禁止响应。


这个页面有帮助吗?

感谢您的反馈!


Flux的未来

Flux将进入维护模式。您可以继续按照目前的方式使用它,而无需更改您的代码。

阅读更多

InfluxDB v3增强和InfluxDB集群版现已普遍可用

新功能包括更快的查询性能和管理工具,推动InfluxDB v3产品线的进步。InfluxDB集群版现已普遍可用。

InfluxDB v3性能和功能

InfluxDB v3产品线在查询性能方面取得了显著提升,并提供了新的管理工具。这些增强包括一个操作仪表板来监控您的InfluxDB集群的健康状况,InfluxDB云专用版中的单点登录(SSO)支持,以及针对令牌和数据库的新管理API。

了解新的v3增强功能


InfluxDB集群版普遍可用

InfluxDB集群版现已普遍可用,为您在自管理堆栈中提供InfluxDB v3的功能。

与我们讨论InfluxDB集群版