赞
踩
InfluxDB 启动后,会向外提供一套HTTP API。外部程序可以也仅能通过 HTTP API 与InfluxDB 进行通信。我们后面要讲到的 influx 命令行、Web UI 和各编程语言的客户端库, 其内部都是封装的对HTTP API 的调用。
所以各种客户端同 InfluxDB 交互时,都离不开 API TOKEN。因为 HTTP 是一种支持官方且简单的协议,这也方便了用户进行二次开发。
InfluxDB 提供了丰富的 API 和客户端库,可以随时和你的应用程序集成。你也可以随时使用 curl 和 ApiPost、Postman 这类程序来测试API 接口。
在你想尝试使用 HTTP API 与 InfluxDB 进行交互时,首先应该用账号和密码登到 Web UI 上选择或创建一个对应的 API TOKEN。我们使用 tony’s Token,这是一个具有全部权限的API Token,实际开发时应谨慎使用,防止 Token 被劫持出现安全问题。
在后面的操作中,你每次发出HTTP 请求时都需要在请求头上携带 token。
在 shell 中你可以使用 curl 测试接口,不过带图形界面的程序终归是更易用一些。
这里选用 ApiPost 这一专门的接口测试软件进行演示。ApiPost 是一款国产软件,对标的是 google 的 postman,
(1)安装 ApiPost
可以直接访问 ApiPost 的官网下载对应系统的安装包 https://www.apipost.cn/
(2)准备调试环境
在左侧的目录栏上有一个文件夹按钮,点一下,创建一个新的目录。
给目录命名,同时为这个目录添加一个公用 header。这样这个目录下的所有接口都会自动带上这个 header,不需要我们再一个个地手动设置了。我们之前提到过,要想使用 InfluxDB 的API,请求头上必须要加上 token。所以,我们就把 token 设为公用 header。
现在我们先来看一下授权是否是成功的。
首先,点击左侧的目录名称,右键会弹出一个菜单栏。点击新建接口:
首先你可以自定义一个接口的名称, 然后在接下来的 URL 栏里, 填写http://localhost:8086/api/v2/authorizations 点击发送。
接下来我们可以看到页面的下方弹出了返回的数据。这个接口返回的数据我们InfluxDB 上目前所有的Token 信息,包括他们拥有什么权限。
成功看到数据,说明我们的 Token 是有效的。
最后记得点击保存,或者使用 Ctrl+S 快捷键。这样,我们目录下面才会真正留下一个接口。方便你日后访问。
登录授权其实是留给 Web UI 用的,但是你也可以尝试用这种方式获取授权。InfluxDB 服务端会判断你的 cookie 是否合法、以及是否过期。符合要求的话就能调用接口实现一系列操作。
进行接下来的操作前,记得关闭目录下的公用请求头。
(1)创建登录会话
在 InlfluxDB api v2 目录下创建一个新的接口
给接口自定义一个名称
请求的类型选择 POST
填写目标的 URL
配置登录信息
在请求连接的下方点击一下“认证”按钮
在认证方式上选择Basic auth 认证
在下方的输入框上输入 InfluxDB 的用户名和密码,这里是 tony, 11111111。
点击发送。
(2)登录原理
1)什么是 Basic auth 认证?
你常见的认证方式可能是将用户名和密码放到 post 请求的请求体中,再发送给服务端进行认证。不过我们刚才并没有在请求体里放用户名和密码,而是配置了一个叫Basic auth 认证的东西。这个功能叫做 http 基本认证,是http 协议的一部分。
基本认证的默认实现是:
把用户名和密码用英文冒号拼起来,也就成了 tony:11111111
再将拼起来的字符串用 Base64 算法编码。( tony:11111111 的 Base64 编码为dG9ueToxMTExMTExMQ==)
给编码结果 dG9ueToxMTExMTExMQ==,添加一个前缀 Basic 所以最后的结果就是。
Basic dG9ueToxMTExMTExMQ==
把这个字符串放到一个 key 为 authorization 的请求头中,发送给服务端。
2)查看请求头
所以,你可以在页面下方查看这次请求的请求头,如图所示,它就是我们基本认证的结晶。
在众多的编程语言中,base64 算法都会作为标准库的一部分存在。你可以在 python 中验证 tony:11111111 的 base64 编码结果。
3)查看响应头
我们还可以看一下这次请求的响应头,你可以看到响应头上有一个 key 为 set-cookie 的键值对。set-cookie 键其实会向浏览器,或者编程语言中的 Session 对象添加一个全局cookie。
以后每次的请求就会自动携带这个 cookie,以后 InfluxDB 的接口服务就会依据这个cookie 来判断请求方是否有权限进行相关操作。ApiPost 也有记录 cookie 的功能,你可以在ApiPost 的Cookie 管理器中,查看已经设置的全局 cookie。
4)查看 Cookie 管理器
ApiPost 的Cookie 管理器在页面的最上方。
弹出的窗口就是 Cookie 管理器。下面首先会列出你的域名或者 host,这里是 localhost,点一下,可以看到它下面的全部 cookie。
再点一下 influxdb-oss-seesion,就可以看到这个 cookie 的内容可,可以看到它跟刚才响应头的set-cookie 内容一模一样。
(3)验证授权效果
接下来,我们会到之前的列出所有 token 的接口里去,在目录共享请求头关闭的前提下,调用 api。
1)直接点击发送按钮
2)响应码为 200,且成功出现了数据,说明我们现在是有权限的,可以点击下面的请求头按钮,看一下这次请的请求头。
这里大家还要注意两点:
http 基本认证默认实现的安全问题。我们前面讲过,http 基本认证其实就是把 tony:11111111 的 Base64 编码放在的请求头上, 但是 Base64 只是一种数据的编码方式,它不是加密算法也不是信息摘要算法。这也就是说, 一旦我的请求被拦截,那对方就能看到我的用户名和密码,对我实施中间人攻击。所以,从安全角度考虑,不应当在开发时将 Web UI 暴露在公网上。而且集成应用时, 授权也千万不可以用登录方式,应该全部使用 token。
Cookie 有过期时间。当你和别的应用进行集成时,也不应该使用登录的方式,登录授予的 cookie 是有过期时间的, 大概半小时, cookie 就会过期。用户必须重新登录拿到新的 cookie 才能和InfluxDB 继续交互。
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>
自己跑的时候可以参考做一下调整命令解释:
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
执行这个命令后,会让你输入更多信息。你可以直接全部敲回车,将这些字段留空。不影响生成我们有效的证书文件。
执行完这个命令后,/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"
(4)验证 HTTPS 协议是否生效
回到我们的 ApiPost6,再次向 http:/localhost:8086/api/v2/authorizations 发送GET 请求。
可以看到,我们使用 http 的协议头再进行访问,响应的状态码为 400,并提示我们向HTTPS 服务器发送了一个HTTP 请求。现在我们将URL 前面的 http 改成 https 再试一下。
如果你也能达到这个效果,说明 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",
)
应用和 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 的用户名和密码,就没有在网络上泄漏的风险了。
(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 语言程序的运行时指标,比如堆内存用了多少, 有多少线程数等等。
可以直接在浏览器上访问 http(s)声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。