Skip to content

InfluxDB 认证机制

InfluxDB 1.x 版本认证配置

启用认证

  • 配置文件修改

    toml
    # /etc/influxdb/influxdb.conf
    [http]
      # 启用认证
      auth-enabled = true
      # 启用基本认证
      basic-auth-enabled = true
      # 启用日志记录认证请求
      log-enabled = true
  • 重启InfluxDB服务

    bash
    systemctl restart influxdb

创建管理员用户

  • 首次创建用户

    bash
    # 未启用认证前创建管理员用户
    influx -execute "CREATE USER admin WITH PASSWORD 'admin_password' WITH ALL PRIVILEGES"
  • 启用认证后创建用户

    bash
    # 使用管理员用户登录
    influx -username admin -password admin_password
    
    # 创建普通用户
    CREATE USER user1 WITH PASSWORD 'user1_password'

配置用户权限

  • 授权数据库权限

    sql
    -- 授予用户对特定数据库的读写权限
    GRANT ALL ON mydb TO user1
    
    -- 授予用户对特定数据库的只读权限
    GRANT READ ON mydb TO user2
    
    -- 授予用户对所有数据库的读写权限
    GRANT ALL ON * TO user3
    
    -- 撤销用户权限
    REVOKE ALL ON mydb FROM user1
  • 查看用户权限

    sql
    -- 查看所有用户
    SHOW USERS
    
    -- 查看特定用户权限
    SHOW GRANTS FOR user1

InfluxDB 2.x 版本认证配置

初始设置

  • 首次启动配置

    bash
    # 启动InfluxDB服务
    systemctl start influxdb
    
    # 运行初始化命令创建管理员用户
    influx setup
  • 初始化流程

    Welcome to InfluxDB 2.7!
    Please type your primary username: admin
    Please type your password: 
    Please type your password again: 
    Please type your primary organization name: my-org
    Please type your primary bucket name: my-bucket
    Please type your retention period in hours, or 0 for infinite (default: 0): 168
    Setup with these parameters?
      Username:          admin
      Organization:      my-org
      Bucket:            my-bucket
      Retention Period:  168h
    Yes

配置API令牌

  • 创建API令牌

    bash
    # 创建具有读写权限的API令牌
    influx auth create --org my-org --description "Read/Write Token" --read-buckets --write-buckets
    
    # 创建具有特定桶权限的API令牌
    influx auth create --org my-org --description "Bucket Token" --read-bucket <bucket-id> --write-bucket <bucket-id>
  • 查看API令牌

    bash
    # 查看所有API令牌
    influx auth list
    
    # 查看特定API令牌详情
    influx auth get --id <auth-id>
  • 删除API令牌

    bash
    influx auth delete --id <auth-id>

用户和角色管理

  • 创建用户

    bash
    # 创建新用户
    influx user create --name user1 --org my-org --password user1_password
    
    # 查看所有用户
    influx user list
  • 创建角色

    bash
    # 创建角色
    influx role create --name read-only --org my-org
    
    # 为角色添加权限
    influx auth create --org my-org --user user1 --role read-only
    
    # 查看角色
    influx role list --org my-org

认证方式详解

基本认证(Basic Authentication)

  • 1.x 版本使用

    bash
    # 使用curl进行基本认证
    curl -G http://localhost:8086/query -u admin:admin_password --data-urlencode "q=SHOW DATABASES"
  • 2.x 版本使用

    bash
    # 使用API令牌进行认证
    curl -G http://localhost:8086/query?org=my-org -H "Authorization: Token <api-token>" --data-urlencode "q=SHOW DATABASES"

API令牌认证

  • 2.x 版本主要认证方式
    bash
    # 写入数据
    curl -i -X POST http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns -H "Authorization: Token <api-token>" -d 'measurement,tag1=value1 field1=1.2,field2=2i 1577836800000000000'
    
    # 查询数据
    curl -G http://localhost:8086/api/v2/query?org=my-org -H "Authorization: Token <api-token>" -d 'query=from(bucket:"my-bucket")|>range(start:-1h)'

JWT认证

  • 2.x 版本JWT支持

    bash
    # 配置JWT认证
    [http]
      auth-enabled = true
      jwt-enabled = true
      jwt-signing-key = "your-secret-key"
  • 使用JWT令牌

    bash
    curl -H "Authorization: Bearer <jwt-token>" http://localhost:8086/api/v2/query?org=my-org

认证最佳实践

1. 使用强密码策略

  • 密码复杂度要求

    • 至少8个字符
    • 包含大小写字母、数字和特殊字符
    • 定期更换密码
  • 密码管理建议

    • 使用密码管理器存储密码
    • 避免在多个系统使用相同密码
    • 启用密码过期政策

2. 最小权限原则

  • 权限配置建议

    • 仅授予用户所需的最小权限
    • 定期审查用户权限
    • 及时撤销不再需要的权限
  • 示例配置

    sql
    -- 只为用户授予特定数据库的只读权限
    GRANT READ ON monitoring_db TO monitoring_user
    
    -- 只为用户授予特定数据库的读写权限
    GRANT ALL ON app_db TO app_user

3. 定期轮换API令牌

  • API令牌管理

    • 定期轮换API令牌(建议每90天)
    • 为不同应用和服务使用不同的API令牌
    • 及时撤销不再使用的API令牌
  • 轮换流程

    1. 创建新的API令牌
    2. 更新应用配置使用新令牌
    3. 验证应用正常运行
    4. 删除旧的API令牌

4. 启用HTTPS

  • 配置HTTPS

    toml
    # 1.x 版本配置
    [http]
      https-enabled = true
      https-certificate = "/etc/ssl/influxdb.crt"
      https-private-key = "/etc/ssl/influxdb.key"
    
    # 2.x 版本配置
    [http]
      tls-cert = "/etc/ssl/influxdb.crt"
      tls-key = "/etc/ssl/influxdb.key"
  • 使用Let's Encrypt证书

    bash
    # 安装Certbot
    apt-get install certbot
    
    # 获取证书
    certbot certonly --standalone -d influxdb.example.com
    
    # 配置证书自动更新
    crontab -e
    0 2 * * * certbot renew --quiet

5. 限制访问IP

  • 1.x 版本配置

    toml
    [http]
      bind-address = "127.0.0.1:8086"  # 只监听本地地址
  • 2.x 版本配置

    toml
    [http]
      bind-address = "127.0.0.1:8086"  # 只监听本地地址
  • 使用防火墙限制IP

    bash
    # 使用ufw限制访问IP
    ufw allow from 192.168.1.0/24 to any port 8086
    ufw allow from 10.0.0.0/8 to any port 8086
    
    # 使用iptables限制访问IP
    iptables -A INPUT -p tcp --dport 8086 -s 192.168.1.0/24 -j ACCEPT
    iptables -A INPUT -p tcp --dport 8086 -s 10.0.0.0/8 -j ACCEPT
    iptables -A INPUT -p tcp --dport 8086 -j DROP

认证监控与审计

1. 启用认证日志

  • 1.x 版本配置

    toml
    [http]
      log-enabled = true
      log-queries-after = "1000000000"
      log-format = "json"
  • 2.x 版本配置

    toml
    [http]
      log-enabled = true
      log-level = "info"

2. 监控认证事件

  • 使用Telegraf监控认证事件

    toml
    [[inputs.influxdb]]
      urls = ["http://localhost:8086"]
      timeout = "5s"
      username = "admin"
      password = "admin_password"
      ssl = false
      ssl_verify = true
      insecure_skip_verify = false
  • 创建认证失败告警

    sql
    -- 1.x 版本创建连续查询监控认证失败
    CREATE CONTINUOUS QUERY cq_auth_fail ON telegraf BEGIN
      SELECT count(*) INTO telegraf.autogen.auth_failures FROM "httpd" WHERE "code" = '401' GROUP BY time(5m)
    END

3. 定期审计用户权限

  • 审计流程

    1. 列出所有用户和权限
    2. 审查用户权限是否符合最小权限原则
    3. 撤销不再需要的权限
    4. 禁用或删除不活跃用户
    5. 更新审计日志
  • 审计脚本示例

    bash
    #!/bin/bash
    
    # InfluxDB 1.x 用户权限审计脚本
    
    OUTPUT_FILE="influxdb_auth_audit_$(date +%Y%m%d).txt"
    
    echo "=== InfluxDB 认证审计报告 ===" > $OUTPUT_FILE
    echo "生成时间: $(date)" >> $OUTPUT_FILE
    echo "" >> $OUTPUT_FILE
    
    # 查看所有用户
    echo "=== 所有用户 ===" >> $OUTPUT_FILE
    influx -username admin -password admin_password -execute "SHOW USERS" >> $OUTPUT_FILE
    echo "" >> $OUTPUT_FILE
    
    # 查看每个用户的权限
    USERS=$(influx -username admin -password admin_password -execute "SHOW USERS" | grep -v user | grep -v ---- | awk '{print $1}')
    
    for user in $USERS; do
      echo "=== 用户 $user 权限 ===" >> $OUTPUT_FILE
      influx -username admin -password admin_password -execute "SHOW GRANTS FOR $user" >> $OUTPUT_FILE
      echo "" >> $OUTPUT_FILE
    done
    
    echo "审计完成,报告已保存到 $OUTPUT_FILE"

常见认证问题及解决

1. 忘记管理员密码

  • 1.x 版本重置密码

    bash
    # 停止InfluxDB服务
    systemctl stop influxdb
    
    # 修改配置文件,临时禁用认证
    sed -i 's/auth-enabled = true/auth-enabled = false/' /etc/influxdb/influxdb.conf
    
    # 启动InfluxDB服务
    systemctl start influxdb
    
    # 重置管理员密码
    influx -execute "SET PASSWORD FOR admin = 'new_password'"
    
    # 重新启用认证
    sed -i 's/auth-enabled = false/auth-enabled = true/' /etc/influxdb/influxdb.conf
    
    # 重启InfluxDB服务
    systemctl restart influxdb
  • 2.x 版本重置密码

    bash
    # 使用influx CLI重置密码
    influx user password --username admin --password new_password

2. 认证失败问题

  • 常见原因

    • 用户名或密码错误
    • API令牌过期或无效
    • 权限不足
    • HTTPS配置问题
    • 防火墙限制
  • 排查步骤

    bash
    # 检查InfluxDB服务状态
    systemctl status influxdb
    
    # 查看认证日志
    tail -f /var/log/influxdb/influxdb.log | grep -i auth
    
    # 测试基本认证
    curl -v -G http://localhost:8086/query -u admin:password --data-urlencode "q=SHOW DATABASES"

3. API令牌失效

  • 解决方法
    1. 检查API令牌是否过期
    2. 验证API令牌权限是否正确
    3. 检查API令牌是否被撤销
    4. 重新生成API令牌并更新应用配置

认证相关配置参数

1.x 版本关键参数

参数名称描述默认值建议值
auth-enabled是否启用认证falsetrue
basic-auth-enabled是否启用基本认证truetrue
log-enabled是否启用HTTP日志truetrue
log-queries-after慢查询日志记录阈值01000000000(1秒)
bind-addressHTTP服务绑定地址:8086127.0.0.1:8086(生产环境)
ssl-enabled是否启用HTTPSfalsetrue(生产环境)

2.x 版本关键参数

参数名称描述默认值建议值
auth-enabled是否启用认证truetrue
bind-addressHTTP服务绑定地址:8086127.0.0.1:8086(生产环境)
tls-certTLS证书路径""/etc/ssl/influxdb.crt
tls-keyTLS私钥路径""/etc/ssl/influxdb.key
jwt-enabled是否启用JWT认证falsefalse(除非需要)
jwt-signing-keyJWT签名密钥""随机生成的强密钥

常见问题(FAQ)

Q1: InfluxDB 1.x 和 2.x 认证机制有什么主要区别?

A1: 主要区别包括:

  • 1.x 使用传统的用户名密码认证和数据库级权限
  • 2.x 主要使用API令牌认证,支持更细粒度的权限控制
  • 2.x 引入了组织和桶的概念,权限管理更加灵活
  • 2.x 支持角色管理,可以更方便地批量管理用户权限

Q2: 如何保护InfluxDB的认证信息?

A2: 保护InfluxDB认证信息的方法包括:

  • 使用强密码或长API令牌
  • 定期更换密码和API令牌
  • 不要在配置文件中明文存储密码
  • 使用环境变量或密钥管理系统存储敏感信息
  • 限制访问InfluxDB的IP地址

Q3: 如何监控InfluxDB的认证活动?

A3: 监控InfluxDB认证活动的方法包括:

  • 启用HTTP日志,记录认证请求
  • 使用Telegraf收集HTTP指标
  • 创建认证失败告警
  • 定期审计用户权限
  • 使用第三方日志分析工具分析认证日志

Q4: 如何配置InfluxDB集群的认证?

A4: 配置InfluxDB集群认证的方法包括:

  • 在所有节点上启用相同的认证配置
  • 使用相同的管理员用户名和密码
  • 同步用户和权限配置
  • 确保集群通信使用安全连接
  • 考虑使用外部认证服务(如LDAP)

Q5: 如何集成InfluxDB与外部认证服务?

A5: 集成外部认证服务的方法包括:

  • 1.x 版本:使用反向代理(如Nginx)集成LDAP或OAuth
  • 2.x 版本:使用自定义认证插件或外部OAuth提供商
  • 配置JWT认证,使用外部身份提供商生成令牌

Q6: 如何安全地存储InfluxDB的API令牌?

A6: 安全存储API令牌的方法包括:

  • 使用环境变量存储API令牌
  • 使用密钥管理系统(如Vault)存储API令牌
  • 不要在代码或配置文件中明文存储API令牌
  • 为不同应用使用不同的API令牌
  • 定期轮换API令牌

Q7: 如何处理大量用户的认证管理?

A7: 处理大量用户的方法包括:

  • 使用角色管理,批量分配权限
  • 集成外部认证服务(如LDAP或Active Directory)
  • 自动化用户管理流程
  • 定期审计和清理不活跃用户
  • 使用API进行程序化用户管理

Q8: 如何配置InfluxDB的HTTPS认证?

A8: 配置HTTPS认证的方法包括:

  • 获取有效的TLS证书(自签名或CA签发)
  • 在配置文件中启用HTTPS并指定证书路径
  • 配置客户端验证(可选)
  • 重定向HTTP请求到HTTPS(推荐)
  • 定期更新TLS证书

Q9: 如何测试InfluxDB的认证配置?

A9: 测试认证配置的方法包括:

  • 使用curl测试基本认证
  • 测试API令牌认证
  • 测试不同权限用户的访问
  • 测试认证失败情况
  • 测试HTTPS连接

Q10: 如何优化InfluxDB的认证性能?

A10: 优化认证性能的方法包括:

  • 使用API令牌认证(2.x版本)
  • 配置连接池
  • 启用HTTP缓存
  • 限制认证日志的详细程度
  • 优化反向代理配置(如果使用)
  • 考虑使用外部认证服务分担认证负载