文档文档

InfluxDB 中的身份验证和授权

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

本文档涵盖在 InfluxDB 中设置和管理身份验证和授权。

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

身份验证

InfluxDB API 和 命令行界面 (CLI)(使用 API 连接到数据库)包括基于用户凭据的简单内置身份验证。 当您启用身份验证时,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 进行身份验证有三种选择。

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

使用 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.8
InfluxDB shell 1.11.8
使用 CLI 标志进行身份验证

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

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

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

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

使用 JWT 令牌进行身份验证

为了更安全地替代使用密码,请在发送到 InfluxDB API 的请求中包含 JWT 令牌。 这目前仅通过 InfluxDB HTTP API 实现。

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

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

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

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

生成您的 JWT 令牌

使用身份验证服务,使用您的 InfluxDB 用户名、过期时间和您的共享密钥生成安全令牌。 有在线工具,例如 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 请求中包含令牌

将您生成的令牌作为 Authorization 标头的一部分包含在 HTTP 请求中。 使用 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>"

验证 Telegraf 对 InfluxDB 的请求

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

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

# ...

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

# ...

重启 Telegraf,一切就绪!

授权

只有在您启用身份验证后,才会强制执行授权。 默认情况下,身份验证处于禁用状态,所有凭据都被静默忽略,并且所有用户都拥有所有权限。

用户类型和权限

管理员用户

管理员用户对所有数据库都具有 READWRITE 访问权限,并且对以下管理查询具有完全访问权限

数据库管理
  • CREATE DATABASE
  • DROP DATABASE
  • DROP SERIES
  • DROP MEASUREMENT
  • CREATE RETENTION POLICY
  • ALTER RETENTION POLICY
  • DROP RETENTION POLICY
  • CREATE CONTINUOUS QUERY
  • DROP CONTINUOUS QUERY

有关这些命令的更多信息,请参阅 数据库管理连续查询

用户管理

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

非管理员用户

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

  • READ
  • WRITE
  • ALLREADWRITE 访问权限)

READWRITEALL 权限是按用户、按数据库控制的。 新的非管理员用户在被管理员用户明确 授予数据库权限 之前,无权访问任何数据库。 非管理员用户可以 SHOW 他们拥有 READ 和/或 WRITE 权限的数据库。

用户管理命令

管理员用户管理

当您启用 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 管理员权限
GRANT ALL PRIVILEGES TO <username>
从管理员用户 REVOKE 管理员权限
REVOKE ALL PRIVILEGES FROM <username>
SHOW 所有现有用户及其管理员状态
SHOW USERS
CLI 示例
> SHOW USERS
user 	   admin
todd     false
paul     true
hermione false
dobby    false

非管理员用户管理

CREATE 一个新的非管理员用户
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 READWRITEALL 数据库权限
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>

CLI 示例

NOAA_water_database 数据库上向 todd GRANT READ 访问权限

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

NOAA_water_database 数据库上向 todd GRANT ALL 访问权限

> GRANT ALL ON "NOAA_water_database" TO "todd"
>
从现有用户 REVOKE READWRITEALL 数据库权限
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>

CLI 示例

NOAA_water_database 数据库上的 todd REVOKE ALL 权限

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

NOAA_water_database 数据库上的 todd REVOKE WRITE 权限

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

注意: 如果拥有 ALL 权限的用户被撤销了 WRITE 权限,则他们将保留 READ 权限,反之亦然。

SHOW 用户的数据库权限
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 用户
DROP USER <username>

CLI 示例

> DROP USER "todd"
>

身份验证和授权 HTTP 错误

没有身份验证凭据或凭据不正确的请求会产生 HTTP 401 Unauthorized 响应。

未经授权用户的请求会产生 HTTP 403 Forbidden 响应。


此页是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。 您可以继续像现在一样使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已发布公开 Alpha 版

InfluxDB 3 开源版本现已可用于 Alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个产品作为 Alpha 版本的一部分。

InfluxDB 3 Core 是我们的新开源产品。 它是用于时间序列和事件数据的最新数据引擎。 InfluxDB 3 Enterprise 是一个商业版本,它建立在 Core 的基础上,增加了历史查询功能、读取副本、高可用性、可扩展性和细粒度的安全性。

有关如何开始使用的更多信息,请查看