InfluxDB 中的身份验证和授权
本页面记录了 InfluxDB OSS 的早期版本。 InfluxDB OSS v2 是最新稳定版本。 查看等效的 InfluxDB v2 文档: 管理 API 令牌。
本文档涵盖了 InfluxDB 中设置和管理身份验证和授权的过程。
不应依赖身份验证和授权来防止访问和保护数据免受恶意行为者的侵害。如果需要额外的安全或合规性功能,应将 InfluxDB 运行在第三方服务后面。如果 InfluxDB 部署在公开可访问的端点上,我们强烈建议启用身份验证。否则,数据将对任何未经身份验证的用户公开。
身份验证
InfluxDB API 和通过 API 连接到数据库的 命令行界面 (CLI) 包含基于用户凭据的简单内置身份验证。启用身份验证后,InfluxDB 仅执行带有有效凭据发送的 HTTP 请求。
身份验证仅在 HTTP 请求范围内发生。插件目前没有验证请求和服务端点(例如,Graphite、collectd 等)的能力。
设置身份验证
至少创建一个 管理员用户。有关创建管理员用户的信息,请参阅 授权部分。
如果您启用了身份验证但没有用户,InfluxDB 不会 强制执行身份验证,并且只接受 查询 以创建新的管理员用户。
一旦有管理员用户,InfluxDB 将强制执行身份验证。
在配置文件中启用身份验证,通过在
[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-enabled
和ping-auth-enabled
设置为true
以在分析和 ping 端点上要求身份验证。重启 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_USERNAME
和 INFLUX_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/) 实现。
在 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
)中,取消注释并编辑 username
和 password
设置。
###############################################################################
# OUTPUT PLUGINS #
###############################################################################
# ...
[[outputs.influxdb]]
# ...
username = "example-username" # Provide your username
password = "example-password" # Provide your password
# ...
重新启动 Telegraf,您就设置好了!
授权
一旦您 启用了身份验证,就会实施授权。默认情况下,身份验证是禁用的,所有凭据都被默默忽略,所有用户都有所有权限。
用户类型和权限
管理员用户
管理员用户可以访问所有数据库的 READ
和 WRITE
权限,并可以完全访问以下管理查询
数据库管理
创建数据库
删除数据库
删除系列
删除度量
创建保留策略
修改保留策略
删除保留策略
创建连续查询
删除连续查询
有关这些命令的更多信息,请参阅 [数据库管理](/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示例
将读取
权限授予todd
在NOAA_water_database
数据库上
> GRANT READ ON "NOAA_water_database" TO "todd"
>
将所有
权限授予todd
在NOAA_water_database
数据库上
> GRANT ALL ON "NOAA_water_database" TO "todd"
>
从现有用户撤销读取
、写入
或所有
数据库权限
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>
CLI示例
从todd
在NOAA_water_database
数据库上撤销所有
权限
> REVOKE ALL ON "NOAA_water_database" FROM "todd"
>
从todd
在NOAA_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 禁止
响应。
这个页面有帮助吗?
感谢您的反馈!