以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦!
1、InfluxDB启动后,会向外提供一套HTTP API。外部程序可以也仅能通过HTTP API与InfluxDB进行通信。我们后面要讲到的influx命令行、Web UI 和各编程语言的客户端库,其内部都是封装的对HTTP API的调用。
2、所以各种客户端同InfluxDB交互时,都离不开API TOKEN。因为HTTP是一种支持官方且简单的协议,这也方便了用户进行二次开发。
1、InfluxDB提供了丰富的API和客户端库,可以随时和你的应用程序集成。你也可以随时使用curl和ApiPost、Postman这类程序来测试API接口。
2、本文章会先带大家看一些最常用的API,然后再告诉大家如何使用API文档。但本文中不会对InfluxDB的全部API进行讲解。
1、在你想尝试使用HTTP API与InfluxDB进行交互时,首先应该用账号和密码登到WebUI上选择或创建一个对应的API TOKEN。课程中,我们使用tony’s Token,这是一个具有全部权限的API Token,实际开发时应谨慎使用,防止Token被劫持出现安全问题。
2、在后面的操作中,你每次发出HTTP请求时都需要在请求头上携带token。
1、在shell中你可以使用curl测试接口,不过带图形界面的程序终归是更易用一些。本文选用ApiPost这一专门的接口测试软件进行演示。ApiPost是一款国产软件,对标的是google的postman,截至视频课录制时,ApiPost的最新版本是 6 ,易用性比上一个
版本有大幅提升,用起来很顺手。
1、大家可以直接访问ApiPost的官网下载对应系统的安装包 https://www.apipost.cn/
1、在左侧的目录栏上有一个文件夹 按钮,点一下,创建一个新的目录。
2、给目录命名,同时为这个目录添加一个公用header。这样这个目录下的所有接口都会自动带上这个header,不需要我们再一个个地手动设置了。我们之前提到过,要想使用InfluxDB的API,请求头上必须要加上token。所以,我们就把token设为公用header。
1、现在我们先来看一下授权是否是成功的。
1、我们也可以看一下授权失败是什么效果。
1、登录授权其实是留给Web UI用的,但是你也可以尝试用这种方式获取授权。InfluxDB服务端会判断你的cookie是否合法、以及是否过期。符合要求的话就能调用接口实现一系列操作。
2、进行接下来的操作前,记得关闭目录下的公用请求头。
1、在InlfluxDB api v2 目录下创建一个新的接口
2、给接口自定义一个名称
3、请求的类型选择POST,填写目标的URL
4、配置登录信息
5、点击发送。
1、 什么是Basic auth认证
你常见的认证方式可能是将用户名和密码放到post请求的请求体中,再发送给服务端进行认证。不过我们刚才并没有在请求体里放用户名和密码,而是配置了一个叫Basic auth认证的东西。这个功能叫做http基本认证,是http协议的一部分。
基本认证的默认实现是:
( 1 )把用户名和密码用英文冒号拼起来,也就成了tony:11111111
( 2 )再将拼起来的字符串用 Base64算法编码。(tony:11111111的Base64编码为
dG9ueToxMTExMTExMQ==)
( 3 )给编码结果 dG9ueToxMTExMTExMQ==,添加一个前缀Basic所以最后的结果
就是。
Basic dG9ueToxMTExMTExMQ==
( 4 )把这个字符串放到一个key为authorization 的请求头中,发送给服务端。
2、查看请求头
3、所以,你可以在页面下方查看这次请求的请求头,如图所示,它就是我们基本认证的结晶。在众多的编程语言中,base 64 算法都会作为标准库的一部分存在。你可以在python中验证tony:11111111的base64编码结果。
4、查看响应头,我们还可以看一下这次请求的响应头,你可以看到响应头上有一个key为set-cookie的键值对。set-cookie键其实会向浏览器,或者编程语言中的 Session对象添加一个全局 cookie。
5、以后每次的请求就会自动携带这个cookie,以后InfluxDB的接口服务就会依据这个cookie来判断请求方是否有权限进行相关操作。ApiPost也有记录cookie的功能,你可以在ApiPost的Cookie管理器中,查看已经设置的全局cookie。
6、查看Cookie管理器
1、接下来,我们会到之前的列出所有 token的接口里去,在目录共享请求头关闭的前提下,调用api。
3、响应码为 200 ,且成功出现了数据,说明我们现在是有权限的,可以点击下面的请求头按钮,看一下这次请的请求头。
1、接下来我们关闭全局cookie再查看效果。
1、这一节,我们了解用登录的方式获取授权。但是,大家还要注意两点
我们前面讲过,http基本认证其实就是把tony:11111111的Base64编码放在的请求头上,但是Base64只是一种数据的编码方式,它不是加密算法也不是信息摘要算法。这也就是说,一旦我的请求被拦截,那对方就能看到我的用户名和密码,对我实施中间人攻击。
2、如图所示,Base64编码的字符串也可以被解码为明文。
3、所以,从安全角度考虑,不应当在开发时将Web UI暴露在公网上。而且集成应用时,授权也千万不可以用登录方式,应该全部使用token。
4、Cookie有过期时间
当你和别的应用进行集成时,也不应该使用登录的方式,登录授予的cookie是有过期时间的,大概半小时,cookie就会过期。用户必须重新登录拿到新的 cookie 才能和InfluxDB继续交互。授权的内容就说到这了。
5、大家进行后面操作的时候,记得恢复目录的公用请求头,并关闭Cookie。这样,我们就还是使用token授权的方式完成后面的一系列操作。
1、HTTP是一种纯文本通信协议。早期很多互联网协议都是使用明文的方式来传输数据的。这样,最大的问题就是如果我们的网络请求被劫持,那么劫持的一方可以看到我们请求中的所有数据(包括Token),这样就算是使用Token进行授权比user:password安全一些,但泄漏Token也会带来很多麻烦事。所以,InfluxDB官方强烈建议我们开启HTTPS。
1、下面是官方给出的命令模板。
sudo openssl req -x509 -nodes -newkey rsa:2048 \
- keyout /etc/ssl/influxdb-selfsigned.key \
- out /etc/ssl/influxdb-selfsigned.crt \
- days <NUMBER_OF_DAYS>
2、自己跑的时候可以参考做一下调整命令解释:
3、现在,我们执行下面的命令:
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
4、执行这个命令后,会让你输入更多信息。你可以直接全部敲回车,将这些字段留空。不影响生成我们有效的证书文件。执行完这个命令后,/opt/module/influxdb2_linux_amd/ 目录下会产生两个文件,一个是 selfsigned.crt(证书文件)另一个是selfsigned.key(密钥文件)。而且他们的有效期是 60 天
5、至此,你的密钥文件就成功生成了!
1、使用influxd命令启动InfluxDB服务时,记得指定一下整数的密钥的路径。
./influxd
--tls-cert="/opt/module/influxdb2_linux_amd64/selfsigned.crt" \
- -tls-key="/opt/module/influxdb2_linux_amd64/selfsigned.key"
1、回到我们的ApiPost6,再次向http:/localhost:8086/api/v2/authorizations发送GET请求。
2、可以看到,我们使用http的协议头再进行访问,响应的状态码为 400 ,并提示我们向HTTPS服务器发送了一个HTTP请求。现在我们将URL前面的http改成https再试一下。
3、如果你也能达到这个效果,说明influxd的ssl/tls认证已经开启,服务端和客户端传递的将会是加密数据而非明文数据。
1、我们之前在WebUI中配置过Telegraf配置和指标的抓取任务,当时我们配的是http协议的URL ,现在也需要全部换成https。
1、HTPS是InfluxDB开发时,最基础也是最该考虑的安全措施,除此之外InfluxDB在设计时还为用户考虑了其他的安全措施,这里给大家简单地介绍一下,不再进行操作演示。
1、可以参考: https://docs.influxdata.com/influxdb/v2.4/security/enable-hardening/这个IP白名单并不是限制谁可以访问我的。
而是限制,我InfluxDB的查询可以访问谁的。因为FLUX语言具有发送网络请求的能力,你可以使用InfluxDB的相关配置限定,FLUX脚本可以向哪些地址发送请求。
1、这一块的内容可以参考:https://docs.influxdata.com/influxdb/v2.4/security/secrets/
2、假如,我们的自己的应用程序和InfluxDB集成,而用到的一段FLUX脚本刚好需要使用某个第三方服务的用户名和密码(比如查询mysql)。
3、比如:
import "influxdata/influxdb/secrets"
import "sql"
sql.from(
driverName: "postgres",
dataSourceName: "postgresql://tony:11111111@localhost",
query:"SELECT * FROM example-table",
)
4、应用和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",
)
这样,我们Mysql的用户名和密码,就没有在网络上泄漏的风险了。
1、可以参考:https://docs.influxdata.com/influxdb/v2.4/security/tokens/
2、我们之前讲过在Web上去创建token。这里再给大家补充一下Token的类型。
3、由于操作者Token对InfluxDB中所有的组织具有完全的读写访问权限。因此InfluxDB建议为每个组织创建一个全权限Token,并用这些Token来管理InfluxDB。这有助于防止组织间不小心误操作对方资源。
1、可以参考:https://docs.influxdata.com/influxdb/v2.4/security/disable-devel/
2、nfluxDB的API中,有一部分是为了方便外部系统去监控和观测InfluxDB的状态和性能的。如果你觉得这部分可能影响安全,那么你可以随时把它们禁了。
3、比如:
1、可以直接在浏览器上访问 http(s)/localhost:8086/docs ,这样可以直接看到对应当前InfluxDB版本对应的API文档。
2、另外也可以在InfluxDB官网上查看在线文档 https://docs.influxdata.com/influxdb/v2.4/api/
1、如果你访问的是本地部署的 InfluxDB,那么访问http://localhost:8086还能下载相应的 OpenAPI文档。
2、访问http://localhost:8086/doc 页面的顶部有一个Download按钮,点一下。浏览器里会
说下载了一个json文件。
可以打开看一下,这其实是一个符合 OpenApi 3 .0格式的API文档定义文件。现在的ApiPost和Postman对这一格式都能自动生成接口测试。此处我们拿postman作为演示。
1、在postman的左侧目录上方,有一个import按钮,点一下,会弹出一个对话框。
2、可以看到,这里他说支持上传OpenApi格式的文件。点击Upload Files按钮,选择刚才下载的swagger(2).json。
3、最后点击右下角的Import按钮。
1、可以看到,InfluxDB 中的全部API已经导入到postman中了。
2、但是这里没有文档中的说明性文字了。找回他们的方法是在postman的左边找到draft,点击一下,再点击右方的
Documentation。如下图所示: