当前位置:   article > 正文

InfluxDB-与IndluxDB进行交互、InfluxDB命令行工具、JAVA操作InfluxDB_influxdb 连接工具

influxdb 连接工具

如何与 InfluxDB 交互

InfluxDB 启动后,会向外提供一套HTTP API。外部程序可以也仅能通过 HTTP API 与InfluxDB 进行通信。我们后面要讲到的 influx 命令行、Web UI 和各编程语言的客户端库, 其内部都是封装的对HTTP API 的调用。

MMSIZE

所以各种客户端同 InfluxDB 交互时,都离不开 API TOKEN。因为 HTTP 是一种支持官方且简单的协议,这也方便了用户进行二次开发

InfluxDB HTTP API

InfluxDB 提供了丰富的 API 和客户端库,可以随时和你的应用程序集成。你也可以随时使用 curl 和 ApiPost、Postman 这类程序来测试API 接口。

准备token

在你想尝试使用 HTTP API 与 InfluxDB 进行交互时,首先应该用账号和密码登到 Web UI 上选择或创建一个对应的 API TOKEN。我们使用 tony’s Token,这是一个具有全部权限的API Token,实际开发时应谨慎使用,防止 Token 被劫持出现安全问题。

MMSIZE

在后面的操作中,你每次发出HTTP 请求时都需要在请求头上携带 token。

准备接口测试工具

在 shell 中你可以使用 curl 测试接口,不过带图形界面的程序终归是更易用一些。

这里选用 ApiPost 这一专门的接口测试软件进行演示。ApiPost 是一款国产软件,对标的是 google 的 postman,

(1)安装 ApiPost

可以直接访问 ApiPost 的官网下载对应系统的安装包 https://www.apipost.cn/

(2)准备调试环境

在左侧的目录栏上有一个文件夹按钮,点一下,创建一个新的目录。

MMSIZE

给目录命名,同时为这个目录添加一个公用 header。这样这个目录下的所有接口都会自动带上这个 header,不需要我们再一个个地手动设置了。我们之前提到过,要想使用 InfluxDB 的API,请求头上必须要加上 token。所以,我们就把 token 设为公用 header。

MMSIZE

接口的授权

Token 授权方式

现在我们先来看一下授权是否是成功的。

  • 首先,点击左侧的目录名称,右键会弹出一个菜单栏。点击新建接口:

    MMSIZE

  • 首先你可以自定义一个接口的名称, 然后在接下来的 URL 栏里, 填写http://localhost:8086/api/v2/authorizations 点击发送。

    MMSIZE

  • 接下来我们可以看到页面的下方弹出了返回的数据。这个接口返回的数据我们InfluxDB 上目前所有的Token 信息,包括他们拥有什么权限。

    MMSIZE

    成功看到数据,说明我们的 Token 是有效的。

  • 最后记得点击保存,或者使用 Ctrl+S 快捷键。这样,我们目录下面才会真正留下一个接口。方便你日后访问。

登录授权方式

登录授权其实是留给 Web UI 用的,但是你也可以尝试用这种方式获取授权。InfluxDB 服务端会判断你的 cookie 是否合法、以及是否过期。符合要求的话就能调用接口实现一系列操作。

进行接下来的操作前,记得关闭目录下的公用请求头。

(1)创建登录会话

  • 在 InlfluxDB api v2 目录下创建一个新的接口

  • 给接口自定义一个名称

    MMSIZE

  • 请求的类型选择 POST

  • 填写目标的 URL

  • 配置登录信息

    在请求连接的下方点击一下“认证”按钮

    在认证方式上选择Basic auth 认证

    在下方的输入框上输入 InfluxDB 的用户名和密码,这里是 tony, 11111111。

  • 点击发送。

(2)登录原理

1)什么是 Basic auth 认证?

你常见的认证方式可能是将用户名和密码放到 post 请求的请求体中,再发送给服务端进行认证。不过我们刚才并没有在请求体里放用户名和密码,而是配置了一个叫Basic auth 认证的东西。这个功能叫做 http 基本认证,是http 协议的一部分。

基本认证的默认实现是:

  1. 把用户名和密码用英文冒号拼起来,也就成了 tony:11111111

  2. 再将拼起来的字符串用 Base64 算法编码。( tony:11111111 的 Base64 编码为dG9ueToxMTExMTExMQ==)

  3. 给编码结果 dG9ueToxMTExMTExMQ==,添加一个前缀 Basic 所以最后的结果就是。

     Basic dG9ueToxMTExMTExMQ==
    
    • 1
  4. 把这个字符串放到一个 key 为 authorization 的请求头中,发送给服务端。 

2)查看请求头

所以,你可以在页面下方查看这次请求的请求头,如图所示,它就是我们基本认证的结晶。

MMSIZE

在众多的编程语言中,base64 算法都会作为标准库的一部分存在。你可以在 python 中验证 tony:11111111 的 base64 编码结果。

MMSIZE

3)查看响应头

我们还可以看一下这次请求的响应头,你可以看到响应头上有一个 key 为 set-cookie 的键值对。set-cookie 键其实会向浏览器,或者编程语言中的 Session 对象添加一个全局cookie。

MMSIZE

以后每次的请求就会自动携带这个 cookie,以后 InfluxDB 的接口服务就会依据这个cookie 来判断请求方是否有权限进行相关操作。ApiPost 也有记录 cookie 的功能,你可以在ApiPost 的Cookie 管理器中,查看已经设置的全局 cookie。

4)查看 Cookie 管理器

  1. ApiPost 的Cookie 管理器在页面的最上方。

    MMSIZE

  2. 弹出的窗口就是 Cookie 管理器。下面首先会列出你的域名或者 host,这里是 localhost,点一下,可以看到它下面的全部 cookie。

    MMSIZE

  3. 再点一下 influxdb-oss-seesion,就可以看到这个 cookie 的内容可,可以看到它跟刚才响应头的set-cookie 内容一模一样。

(3)验证授权效果

接下来,我们会到之前的列出所有 token 的接口里去,在目录共享请求头关闭的前提下,调用 api。

1)直接点击发送按钮

MMSIZE

2)响应码为 200,且成功出现了数据,说明我们现在是有权限的,可以点击下面的请求头按钮,看一下这次请的请求头。

MMSIZE

这里大家还要注意两点:

  • http 基本认证默认实现的安全问题。我们前面讲过,http 基本认证其实就是把 tony:11111111 的 Base64 编码放在的请求头上, 但是 Base64 只是一种数据的编码方式,它不是加密算法也不是信息摘要算法。这也就是说, 一旦我的请求被拦截,那对方就能看到我的用户名和密码,对我实施中间人攻击。所以,从安全角度考虑,不应当在开发时将 Web UI 暴露在公网上。而且集成应用时, 授权也千万不可以用登录方式,应该全部使用 token。

  • Cookie 有过期时间。当你和别的应用进行集成时,也不应该使用登录的方式,登录授予的 cookie 是有过期时间的, 大概半小时, cookie 就会过期。用户必须重新登录拿到新的 cookie 才能和InfluxDB 继续交互。

接口安全:配置 HTTPS

HTTP 是一种纯文本通信协议。早期很多互联网协议都是使用明文的方式来传输数据的。这样,最大的问题就是如果我们的网络请求被劫持,那么劫持的一方可以看到我们请 求中的所有数据(包括 Token),这样就算是使用 Token 进行授权比 user:password 安全一些, 但泄漏 Token 也会带来很多麻烦事。所以,InfluxDB 官方强烈建议我们开启HTTPS。

(1)使用 openssl 生成证书

下面是官方给出的命令模板:

sudo openssl req -x509 -nodes -newkey rsa:2048 \
 -keyout /etc/ssl/influxdb-selfsigned.key \
 -out /etc/ssl/influxdb-selfsigned.crt \
 -days <NUMBER_OF_DAYS>
  • 1
  • 2
  • 3
  • 4

自己跑的时候可以参考做一下调整命令解释:

  • req -x509,指定生成自签名证书的格式。

  • -newkey rsa:2048,生成证书请求或者自签名整数时自动生成密钥,然后生成的密钥名称由 keyout 指定。rsa:2048 意思是产生rsa 密钥,位数是 2048。

  • -keyout,指定生成的密钥名称。

  • -out,证书的保存路径

  • -days,证书的有效期限,单位是 day(天),默认是 365 天。

现在,我们执行下面的命令:

openssl req -x509 -nodes -newkey rsa:2048 \
 -keyout /opt/module/influxdb2_linux_amd64/selfsigned.key \
 -out /opt/module/influxdb2_linux_amd64/selfsigned.crt \
 -days 60
  • 1
  • 2
  • 3
  • 4

执行这个命令后,会让你输入更多信息。你可以直接全部敲回车,将这些字段留空。不影响生成我们有效的证书文件。

执行完这个命令后,/opt/module/influxdb2_linux_amd/ 目录下会产生两个文件,一个是selfsigned.crt(证书文件)另一个是 selfsigned.key(密钥文件)。而且他们的有效期是 60 天至此,你的密钥文件就成功生成了!

(2)确保启动 influxd 的用户对密钥整数文件有读取权限

(3)启动 influxd 服务时指定证书和密钥路径

使用 influxd 命令启动 InfluxDB 服务时,记得指定一下整数的密钥的路径。

./influxd \
	--tls-cert="/opt/module/influxdb2_linux_amd64/selfsigned.crt" \ 
	--tls-key="/opt/module/influxdb2_linux_amd64/selfsigned.key"
  • 1
  • 2
  • 3

(4)验证 HTTPS 协议是否生效

回到我们的 ApiPost6,再次向 http:/localhost:8086/api/v2/authorizations 发送GET 请求。

可以看到,我们使用 http 的协议头再进行访问,响应的状态码为 400,并提示我们向HTTPS 服务器发送了一个HTTP 请求。现在我们将URL 前面的 http 改成 https 再试一下。

MMSIZE

如果你也能达到这个效果,说明 influxd 的 ssl/tls 认证已经开启,服务端和客户端传递的将会是加密数据而非明文数据。

(5)记得更改已存在的 telegraf 配置和 Scrapers

我们之前在 WebUI 中配置过 Telegraf 配置和指标的抓取任务,当时我们配的是 http 协议的URL ,现在也需要全部换成 https。

其他生产安全考虑

HTPS 是 InfluxDB 开发时,最基础也是最该考虑的安全措施,除此之外 InfluxDB 在设计时还为用户考虑了其他的安全措施,这里给大家简单地介绍一下,不再进行操作演示。

(1)IP 白名单

可以参考: https://docs.influxdata.com/influxdb/v2.4/security/enable-hardening/

这个 IP 白名单并不是限制谁可以访问我的。

而是限制,我 InfluxDB 的查询可以访问谁的。因为 FLUX 语言具有发送网络请求的能力,你可以使用InfluxDB 的相关配置限定,FLUX 脚本可以向哪些地址发送请求。

(2)机密管理

这一块的内容可以参考:https://docs.influxdata.com/influxdb/v2.4/security/secrets/

假如,我们的自己的应用程序和 InfluxDB 集成,而用到的一段 FLUX 脚本刚好需要使用某个第三方服务的用户名和密码(比如查询 mysql)。

比如:

import "influxdata/influxdb/secrets"
import "sql"
sql.from(
    driverName: "postgres",
    dataSourceName: "postgresql://tony:11111111@localhost",
    query:"SELECT * FROM example-table",
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

应用和 InfluxDB 服务之间走的也是 HTTP 通信,那么写在脚本中的用户名和密码是有可能泄漏的。这个时候,你可以把用户名和密码用键值的方式放到 InfluxDB 管理起来,

然后,你就可以在脚本里用 key 的方式在 InfluxDB 里获取 tony 的用户名和密码了。

import "influxdata/influxdb/secrets"
import "sql"
username = secrets.get(key: "POSTGRES_USERNAME")
password = secrets.get(key: "POSTGRES_PASSWORD")
sql.from(
    driverName: "postgres",
    dataSourceName: "mysql://${username}:${password}@localhost",
    query:"SELECT * FROM example-table",
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这样,我们 Mysql 的用户名和密码,就没有在网络上泄漏的风险了。

(3)token 管理

可以参考:https://docs.influxdata.com/influxdb/v2.4/security/tokens/

我们之前讲过在Web 上去创建 token。这里再给大家补充一下Token 的类型。

  • 操作者 Token。操作者令牌有跨越组织的管理权限,它对 InfluxDB OSS 2.x 上的所有组织和资源有完全的读写访问权限。某些操作必须需要操作员权限(比如 查看服务器配置)。操作者 Token 是在 InfluxDB 初始化设置的过程中创建的。要想再创建一个操作者Token,就必须使用先有的操作者 Token。

    由于操作者 Token 对 InfluxDB 中所有的组织具有完全的读写访问权限。因此 InfluxDB 建议为每个组织创建一个全权限 Token,并用这些 Token 来管理 InfluxDB。这有助于防止组织间不小心误操作对方资源。

  • 全权限 Token。对单个组织中所有资源的完全读取和写入访问权限

  • 读**/**写 Token。对组织中特定的存储桶进行读取和写入。

(4)禁用部分开发功能

可以参考:https://docs.influxdata.com/influxdb/v2.4/security/disable-devel/

InfluxDB 的 API 中,有一部分是为了方便外部系统去监控和观测 InfluxDB 的状态和性能的。如果你觉得这部分可能影响安全,那么你可以随时把它们禁了。

比如:

  • /metrics,上文给大家演示过,这里面有各种监控 InfluxDB 运行的指标

  • Web UI,用户的图形界面交互。

  • /debug/pprof,这个接口里面是 Go 语言程序的运行时指标,比如堆内存用了多少, 有多少线程数等等。

如何使用API 文档

可以直接在浏览器上访问 http(s)声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】

推荐阅读
相关标签