Elasticsearch:創建 API key 接口訪問 Elasticsearch


轉載自:https://blog.csdn.net/UbuntuTouch/article/details/107181440

在之前我的文章 “Elastic:使用Postman來訪問Elastic Stack” 中我介紹了如何在應用中訪問 Elasticsearch。在那里,我們使用了最基本的 Basic authentication 的方法來訪問 Elasticsearch。這種方法不好的地方就是每個用戶所有的請求的驗證都是一樣的:使用的是同樣的一個用戶名及密碼的 Base64 編碼。在今天的文章中,我們將介紹如何創建 API key 來提供對 Elasticsearch 的訪問。通過這個方法,一個用戶可以動態生成無數個 API Key 的訪問。 官方文檔,可以在鏈接找到。

接口

它的接口非常簡單:

POST /_security/api_key
PUT /_security/api_key

API Key 由 Elasticsearch API key 服務創建,當您在 HTTP 接口上配置TLS時,該服務會自動啟用。 請參閱加密HTTP客戶端通信。 或者,你可以顯式啟用 xpack.security.authc.api_key.enabled 設置。 在生產模式下運行時,引導檢查會阻止您啟用 API key 服務,除非你還在 HTTP 接口上啟用了TLS。

成功創建 API key API 調用將返回一個JSON結構,其中包含API 密鑰,其唯一 ID 和名稱。 如果適用,它還以毫秒為單位返回API密鑰的到期信息。

有點是需要注意的是:默認情況下,AP I密鑰永不過期。 你可以在創建API密鑰時指定到期信息。

請求例子

以下示例創建一個 API 密鑰:

POST /_security/api_key
{
  "name": "my-api-key",
  "expiration": "1d", 
  "role_descriptors": { 
    "role-a": {
      "cluster": ["all"],
      "index": [
        {
          "names": ["index-a*"],
          "privileges": ["read"]
        }
      ]
    },
    "role-b": {
      "cluster": ["all"],
      "index": [
        {
          "names": ["index-b*"],
          "privileges": ["all"]
        }
      ]
    }
  }
}

請注意:在上面的 expiration 和 role_descriptors 這兩個字段是可選的。如果你不選則意味着永遠有效,並對所有的 role 都起作用。

接下來,我們來用一個具體的例子來展示這項功能。

安裝

針對這個測試,由於要求我們啟用 TLS 的配置,請參閱我之前的文章 “Elastic:為Elasticsearch啟動https訪問” 。在那篇文章中,我詳述了如何配置啟用 TLS。如果你的配置是成功的話,那么我們的 Elasticsearch 將會運行於 https://localhost:9200 的端口上。在這里,我就不再累述了。

測試

我們首先來打開 Kibana,並輸入如下的命令:

POST /_security/api_key
{
  "name": "liuxg-api-key",
  "expiration": "1d"
}

在這里,我們設置 API key 的有效期是1天。我們同時也給了一個名稱 liuxg-api-key。執行完上面的指令后,我們可以看到如下的響應:

{
  "id" : "gBcXKHMB53qZFLAQ52-j",
  "name" : "liuxg-api-key",
  "expiration" : 1594191922072,
  "api_key" : "sJYv3VMLRaaeaoUec2XfsA"
}

在這里,expiration 使用一個數值來表示的。它表示是從 1970-01-01 00:00:00 UTC 算起的秒。具體描述可以參閱文章

我們可以使用兩種方法來生產這個 ApiKey:

方法一:

我們最關心的就是返回來的 id 及 api_key。這兩個數值並不能直接為我們所使用。我們打開網站:https://www.base64encode.org/,並把上面的 id 及 api_key 用分號分開:

請注意返回的值 Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==。這個將是我們訪問 Elasticsearch 所需要的最終的 ApiKey。

方法二:

我們打開一個 terminal 並創建如下的一個 叫做 response 文件,它的內容如下:

{
  "id" : "gBcXKHMB53qZFLAQ52-j",
  "name" : "liuxg-api-key",
  "expiration" : 1594191922072,
  "api_key" : "sJYv3VMLRaaeaoUec2XfsA"
}

$ cat response 
{
    "id" : "gBcXKHMB53qZFLAQ52-j",
    "name" : "liuxg-api-key",
    "expiration" : 1594191922072,
    "api_key" : "sJYv3VMLRaaeaoUec2XfsA"
}

接着我們在 response 文件所在的路徑下打入如下的命令:

$ echo -n $(cat response | jq -r .id):$(cat response | jq -r .api_key) | base64

上面的命令顯示的結果:

$ ls response 
response
liuxg:tmp liuxg$ echo -n $(cat response | jq -r .id):$(cat response | jq -r .api_key) | base64Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==

通過這個方法,我們可以看到和方法一一樣的效果。

使用 ApiKey

我們訪問 Elasticsearch 所使用的 接口例子為:

curl -k -H "Authorization: ApiKey Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==" https://localhost:9200/_cluster/health

運行上面的命令:

我們再來運行一個例子:

curl -k -H "Authorization: ApiKey Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==" https://localhost:9200/_cat/indices?pretty


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM