InfluxDB 中的身份验证和授权
此页面记录了早期版本的 InfluxDB OSS。InfluxDB OSS v2 是最新的稳定版本。请参阅等效的 InfluxDB v2 文档: 管理 API 令牌。
本文档涵盖在 InfluxDB 中设置和管理身份验证和授权。
身份验证和授权不应依赖于阻止恶意行为者访问和保护数据。 如果需要额外的安全或合规性功能,InfluxDB 应该在第三方服务之后运行。 如果 InfluxDB 部署在公共可访问的端点上,我们强烈建议启用身份验证。 否则,数据将对任何未经身份验证的用户公开可用。
身份验证
InfluxDB API 和 命令行界面 (CLI)(使用 API 连接到数据库)包括基于用户凭据的简单内置身份验证。 当您启用身份验证时,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 进行身份验证有三种选择。
使用环境变量进行身份验证
使用 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.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 实现。
在您的 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
) 中,取消注释并编辑 username
和 password
设置。
###############################################################################
# OUTPUT PLUGINS #
###############################################################################
# ...
[[outputs.influxdb]]
# ...
username = "example-username" # Provide your username
password = "example-password" # Provide your password
# ...
重启 Telegraf,一切就绪!
授权
只有在您启用身份验证后,才会强制执行授权。 默认情况下,身份验证处于禁用状态,所有凭据都被静默忽略,并且所有用户都拥有所有权限。
用户类型和权限
管理员用户
管理员用户对所有数据库都具有 READ
和 WRITE
访问权限,并且对以下管理查询具有完全访问权限
数据库管理
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
(READ
和WRITE
访问权限)
READ
、WRITE
和 ALL
权限是按用户、按数据库控制的。 新的非管理员用户在被管理员用户明确 授予数据库权限 之前,无权访问任何数据库。 非管理员用户可以 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
READ
、WRITE
或 ALL
数据库权限
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
READ
、WRITE
或 ALL
数据库权限
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
响应。
此页是否对您有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子! 我们欢迎并鼓励您提供有关 InfluxDB 和本文档的反馈和错误报告。 要寻求支持,请使用以下资源
拥有年度合同或支持合同的客户可以联系 InfluxData 支持。