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 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_USERNAME 和 INFLUX_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.11.8
InfluxDB shell 1.11.8
使用CLI标志进行身份验证
使用 -username 和 -password 标志提供身份验证凭据给 influx CLI。
influx -username todd -password influxdb4ever
Connected to http://localhost:8086 version 1.11.8
InfluxDB shell 1.11.8
在 influx shell 中使用凭据进行身份验证
启动 influx Shell并运行 auth 命令。
当提示时输入您的用户名和密码。
> influx
Connected to http://localhost: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.io/,可以为您完成这个工作。
令牌的有效载荷(或声明)必须呈现以下格式:
{
"username": "myUserName",
"exp": 1516239022
}
- username - 您的 InfluxDB 用户的名称。
- exp - 令牌的过期时间,以UNIX纪元时间表示。 为了提高安全性,请保持令牌过期时间短。 在测试中,您可以使用 https://www.unixtimestamp.com/index.php 手动生成UNIX时间戳。
使用您的共享密钥对有效负载进行编码。 您可以在自己的身份验证服务器中使用 JWT 库或手动在 https://jwt.io/ 上完成此操作。
生成的令牌遵循以下格式:
在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
对启用了身份验证的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 访问权限,并对以下管理查询具有完全访问权限:
数据库管理
CREATE DATABASEDROP DATABASEDROP SERIESDROP MEASUREMENTCREATE RETENTION POLICYALTER RETENTION POLICYDROP RETENTION POLICYCREATE CONTINUOUS QUERYDROP CONTINUOUS QUERY
用户管理
- 管理员用户管理
- 非管理员用户管理:
- 用户管理总览:
请参见下方以获取有关用户管理命令的完整讨论。
非管理员用户
非管理员用户在每个数据库中可以拥有以下三种权限之一:
READWRITEALL(同时具有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 ALL PRIVILEGES TO <username>
从管理员用户撤销管理权限
REVOKE ALL PRIVILEGES FROM <username>
SHOW 所有现有用户及其管理员状态
SHOW USERS
命令行示例
> SHOW USERS
user admin
todd false
paul true
hermione false
dobby false
非管理员用户管理
CREATE 一个新的非管理员用户
CREATE USER <username> WITH PASSWORD '<password>'
命令行示例
> 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关键字、包含连字符或包含任何特殊字符,则必须用双引号将其包裹,例如:
!@#$%^&*()- - 密码 string 必须用单引号括起来。
在进行请求认证时,不要包含单引号。
我们建议在密码中避免使用单引号 (
') 和反斜杠 (\) 字符。 对于包含这些字符的密码,在创建密码和提交认证请求时,用反斜杠转义特殊字符 (例如 (\')。 - 重复相同的
CREATE USER语句是幂等的。如果任何值发生变化,数据库将返回重复用户错误。有关详细信息,请查看 GitHub 问题 #6890。
命令行示例
> 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'
>
授予现有用户READ、WRITE或ALL数据库权限
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>
命令行示例:
授予 todd 对 NOAA_water_database 数据库的 READ 访问权限:
> GRANT READ ON "NOAA_water_database" TO "todd"
>
GRANT ALL access to todd on the NOAA_water_database database:
> GRANT ALL ON "NOAA_water_database" TO "todd"
>
从现有用户撤销 READ、WRITE 或 ALL 数据库权限
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>
命令行示例:
从 NOAA_water_database 数据库中撤销 todd 的 ALL 权限:
> REVOKE ALL ON "NOAA_water_database" FROM "todd"
>
从 todd 撤销在 NOAA_water_database 数据库上的 WRITE 权限:
> REVOKE WRITE ON "NOAA_water_database" FROM "todd"
>
注意:如果拥有
ALL权限的用户被撤销WRITE权限,他们将保留READ权限,反之亦然。
SHOW 用户的数据库权限
SHOW GRANTS FOR <user_name>
命令行示例:
> 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>'
命令行示例:
> SET PASSWORD FOR "todd" = 'influxdb4ever'
>
注意: 密码 string 必须用单引号包裹。 在验证请求时,请勿包含单引号。
我们建议在密码中避免使用单引号 (') 和反斜杠 (\) 字符。对于包含这些字符的密码,创建密码时和提交身份验证请求时,请用反斜杠转义特殊字符 (例如 (\')。
DROP 一个用户
DROP USER <username>
命令行示例:
> DROP USER "todd"
>
身份验证和授权 HTTP 错误
没有身份验证凭据或凭据不正确的请求会产生 HTTP 401 Unauthorized 响应。
未授权用户的请求会产生 HTTP 403 Forbidden 响应。