文档文档

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 http://localhost:8086/query \
  -u todd:influxdb4ever \
  --data-urlencode "q=SHOW DATABASES"
使用 URL 或请求正文中的查询参数进行身份验证

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

凭据作为查询参数
curl -G "http://localhost:8086/query?u=todd&p=influxdb4ever" \
  --data-urlencode "q=SHOW DATABASES"
请求正文中的凭据
curl -G http://localhost: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 http://localhost:8086 version 1.12.0
InfluxDB shell 1.12.0
使用 CLI 标志进行身份验证

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

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

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

> influx
Connected to http://localhost:8086 version 1.12.0
InfluxDB shell 1.12.0
> 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 请求中包含令牌

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

Authorization: Bearer <myToken>

只有未过期的令牌才能成功验证。请确保您的令牌未过期。

使用 JWT 身份验证的示例查询请求
curl -G "http://localhost: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
  • ALL(同时具有 READWRITE 访问权限)

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 问题 #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 权限的用户被 REVOKE 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 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一款开源、高速、近期数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、读取副本、增强的安全性以及数据压缩,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看