对于很多的开发者来说,他们很习惯用 Postman 来测试 REST 接口。在我之前的文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 中,我也展示了如何使用 Postman 来访问我们的 Elasticsearch。对于 Postman 访问 Elasticsearch 来说,非常地直接。但是在那里有一种情况,我没有展示,那就是:当一个集群启动安全过后,我们该如何使用用户名及密码来访问我们的 Elasticsearch 集群呢?
使用 Postman 来访问 Elastic Stack
为 Elasticsearch 集群设置安全
我们可以按照我之前的文章 “Elasticsearch:设置 Elastic 账户安全” 设置用户名及密码。一旦设置好用户名及密码后,当我们使用 Postman 或各类语言的API来访问 Elasticsearch 时,我们必须使用用户名及密码来访问。
在今天的实验中,我将采用 Elastic cloud 来做实验。如果大家没有使用过 Elastic cloud,请参阅我之前的文章 “Elastic:在 Elastic 云上3分钟部署 Elastic 集群”。在默认的情况下,Elastic cloud 是带有安全设置的。
将 Elasticsearch HTTP / REST 客户端与 Shield 结合使用
首先,我们可以参考 Elastic 的官方文档。如文档所示:Elasticsearch 与标准 HTTP 基本身份验证 header 一起使用以识别请求者。 由于 Elasticsearch 是无状态的,因此此标头必须与每个请求一起发送:
Authorization: Basic <TOKEN>
在这里<TOKEN>计算为 base64(USERNAME:PASSWORD)。
我们在网上找一个计算 base64 的在线工具 Base64 Encode and Decode - Online。假设我们的用户名是 elastic,而我们的密码是123456。
我们把 elastic:123456 输入后,在点击 ENCODE 按钮,我们就可以发现被编码后的 base64 代码 ZWxhc3RpYzoxMjM0NTY=。这个将是我们在如下进行 Postman 请求时填入到 header 里的字符串。
使用 Postman 访问 Elasticsearch
有了上面的方法可以得到 base64 的 token,那么我就可以在 Postman 中进行配置了。我们打开 Postman:
如上图所示:我们填入 Elasticsearch 的访问地址,同时在 header 的 Authorization 部分填入相应的 Basic <token>。等我们填完好后,我们点击 Send 按钮。在下面我们就可以看出返回来的结果。
在我们请求时,如果有 payload 的情况下,该怎么办呢?我们可以把我们的 payload 写入到 Postman 的 body 里:
一旦我们使用 Postman 能够完成我们的 API 接口的测试,我们可以使用任何一种语言来发起对 Elasticsearch 的请求,甚至我们不需要考虑那些语言所提供的接口。
针对带有 HTTPS 连接的 Elasticsearch 集群
Basic 校验
在最新的 Elastic Stack 8.x 的部署中,带有 SSL 访问的集群是默认的配置。针对客户端的访问,我们必须使用 HTTPS 的连接,那么我们该如何通过 Postman 来进行访问呢?如果你对 Elastic Stack 8.x 的安装还不是很熟的话,请参考文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch”。特别需要指出的是,你需要阅读 “Elastic Stack 8.x 安装” 这个章节。关于如何安装 Elasticsearch 8.x,这里就不再累述了。
我们首先启动 Postman:
如果我们按照上面介绍的方法来进行连接,我们可以看到如上的错误信息。那么我们该怎么办呢?如果你的集群部署是自签名的,我们可以进行如下的设置:
我们再次请求:
显然这次是成功的。
对于一些用户,你可能并不希望关掉 SSL 检查。你可以进行如下的设置:
通常在 Elasticsearch 的安装中,我们可以找到它的安装证书如下:
$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1
$ cd config/certs/
$ ls
http.p12 http_ca.crt transport.p12
我们选择 http_ca.crt:
我们再次发送请求:
显然这次请求也是成功的。
API Key 校验
在很多的时候,我们觉得使用用户名及密码发送请求并不安全。我们可以通过 API token 的方式来进行连接。我们首先使用自己的账号登录 Kibana,并申请 API token:
上面的 Base64 值为:VEUxNWVJTUJiM19wUGcxYWRzM1Q6T2VhQmgtX3pSYlNTb0pCQl9teEs0Zw==
在上面,我们拷贝这个 API key token,并在如下的配置中进行使用:
我们选择 API Key 的安全校验。我们接着配置 Headers:
在上面的 Authorization 中,我们填入:
ApiKey VEUxNWVJTUJiM19wUGcxYWRzM1Q6T2VhQmgtX3pSYlNTb0pCQl9teEs0Zw==
我们再次发送请求:
我们发现请求也是成功的。
Bearer 校验
我们可以参考另外一篇文章 “Elasticsearch:无需基本身份验证即可创建用于访问的不记名令牌” 来创建一个访问的 token。针对这个功能,我们需要打开白金版试用功能:
我们可以在 Kibana 中打入如下的命令:
POST /_security/oauth2/token
{
"grant_type": "client_credentials"
}
上面的命令返回如下的结果:
{
"access_token": "h97qAxZQUnljQkVyQlM0V3hQSEFXcEg3NjZ3AAAAAAAAAAAA",
"type": "Bearer",
"expires_in": 1200,
"authentication": {
"username": "elastic",
"roles": [
"superuser"
],
"full_name": null,
"email": null,
"metadata": {
"_reserved": true
},
"enabled": true,
"authentication_realm": {
"name": "reserved",
"type": "reserved"
},
"lookup_realm": {
"name": "reserved",
"type": "reserved"
},
"authentication_type": "realm"
}
}
请注意上面返回的 access_token。我们将在下面的配置中使用到。接下来在 Postman 中进行如下的配置:
我们再次发送请求,我们可以看到:
很显然,我们的访问是成功的。
参考:
【1】Using Elasticsearch HTTP/REST Clients with Shield | Shield [2.4] | Elastic