喬叔的 Elastic Stack 專業教育訓練
  • 喬叔的 Elastic Stack 專業教育訓練
  • 🧑關於喬叔 (Joe Wu)
  • Elastic 課程公開班
    • 🎯Elasticsearch 基礎實務班
      • 💯學員課後回饋
    • 🆕Elasticsearch 進階運維班
      • 💯學員課後回饋
    • Elasticsearch 進階開發班
    • Elastic Stack 基礎實務班
    • Elastic Observability 基礎實務班
    • 📩課程許願池
  • 技術分享
    • 📗喬叔帶你上手 Elastic Stack
      • 前言
      • Elastic Cloud 如何建立 Deployment
        • ES Node 的種類
        • 配置的選擇
      • Index 建立前你該知道的
        • ES Index 如何被建立
        • ES 的超前佈署 - Dynamic Mapping
        • ES 的超前佈署 - Index Template
        • ES Index 的別名 (Alias)
        • 管理你的 Index - Kibana Index
      • 管理 Index 的 Best Practices
        • Shard 的數量與 Rollover & Shrink API
        • 三溫暖架構 - Hot Warm Cold Architecture
        • Index Lifecycle Management (ILM)
        • Rollup
        • Transform
        • Snapshot Lifecycle Management (SLM)
        • 總結
      • Elastic Cloud 比免費版還多的功能
        • Elastic Stack 的方案比較與銷售方式
        • Centralized Beats Management
        • Centralized Pipeline Management
        • Watcher
        • Elasticsearch Token Service
        • Multi-stack monitoring & Automatic stack issue alerts
      • 向 App Search 學習怎麼用 Elasticsearch
        • 揭開 App Search 的面紗
        • Engine 的 Index Settings 篇
        • Engine 的 Mapping 篇
        • Engine 的 Search 基礎剖析篇
        • Engine 的 Search 進階剖析篇
      • Elasticsearch 的優化技巧
        • Indexing 索引效能優化
        • Searching 搜尋效能優化
        • Index 的儲存空間最佳化
        • Shard 的最佳化管理
      • 完賽心得
    • 📘喬叔帶你上手 Elastic Stack - 探索與實踐 Observability 系列
      • 前言 & 淺談 Observability
      • Elastic 的 Observability 解決方案
      • Uptime - 掌握系統的生命徵象
        • 我們要觀測的生命徵象是什麼?
        • 使用 Heartbeat 收集系統生命徵象數據
        • 透過 Kibana 觀看心電圖及設定警報
        • 使用合成監控 (Synthetics Monitor) 從使用者情境驗證服務的運作狀態
      • Metrics - 觀察系統的健康指標
        • Metrics 與 Metricbeat 的基本介紹
        • 使用 Metricbeat 掌握 Elastic Stack 的健康狀態
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Host 篇
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Docker 篇
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Kubernetes 篇
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 AWS 篇
      • Logs - 挖掘系統內部發生的狀況
        • Logs 與 Filebeat 的基本介紹
        • 使用 Filebeat 應該要了解的設計細節與原理
        • 透過 Filebeat 收集 Elastic Stack 中各種服務的細節資訊
        • 透過 Filebeat 收集 Infrastructure 中各種服務的細節資訊
      • Traces - 觀察應用程式的效能瓶頸
        • Elastic APM 基本介紹
        • 使用 APM-Integratoin-Testing 建立 Elastic APM 的模擬環境
        • 如何在 Kibana 使用 APM UI
        • 使用 APM Server 來收集 APM 數據
        • 透過 APM Agents 收集並傳送後端服務運作的記錄
        • 透過真實使用者監控 (RUM, Real User Monitoring) 來改善使用者體驗
      • 建立結構化的 Log
        • Elastic Common Schema 結構化 Log 的規範
        • Elasticsearch Ingest Pipeline 資料 Index 前的轉換好幫手
          • 基本介紹
          • 各種常用的 Processor
          • Enrich 資料與例外處理
      • 有效的使用 Observability 的資料
        • 透過 Machine Learning 發現異常的問題
        • 使用 Kibana Alerts 主動通知異常狀況
        • 資料的生命週期管理
        • 使用 Elastic Observability 追縱及觀察問題的心得
      • 完賽心得
    • 😀Elasticsearch 技術分享小品
      • 🤖Elastic 與 AI
        • Elasticsearch Inference API 讓我們直接在 ES 裡運用 OpenAI Completion API
    • 🎥線上分享
      • 喬叔 Elasticsearch Index 管理與效能優化技巧
      • Elastic Certification 認證經驗分享
    • 🛠️workshop
      • 如何在 Elasticsearch 實現敏捷的資料建模與管理 @ DevOpsDays 2023
        • 工作坊實作內容
      • Elastic Observability 實作體驗坊 @ DevOpsDays 2022
        • 行前準備
        • 工作坊實作內容
      • 當 Elasticsearch 搜尋引擎遇上 AI @ HelloWordDevConference 2024
        • 投影片
        • Elasticsearch 環境準備
        • Google Colab 環境準備
        • 工作坊操作說明
        • ElasticSearch Relevance Engine (ESRE)
    • ⬆️Elastic Stack 版本升級記錄
      • 🔍Elasticsearch
  • 其他專業服務
    • 👩‍🎓企業包班 | 企業內訓
    • 👨‍💼顧問服務
    • 🈺專案合作
    • 🧩Elastic 授權代理
  • 相關連結
    • Facebook 粉絲頁
Powered by GitBook
On this page
  • 前言
  • 進入此章節的先備知識
  • 此章節的重點學習
  • Elasticsearch Token Service
  • 基本介紹
  • 啟用 Token Service
  • Get Token API
  • Token Service Settings
  • Invalidate Token API
  • 結語
  • 參考資料
  1. 技術分享
  2. 喬叔帶你上手 Elastic Stack
  3. Elastic Cloud 比免費版還多的功能

Elasticsearch Token Service

PreviousWatcherNextMulti-stack monitoring & Automatic stack issue alerts

Last updated 2 years ago

前言

Elasticsearch 的 X-Pack Security 機制中,Token Based Authentication services 包含了兩種方式, token-service 與 api-key-service ,而 api-key-service 是 Basic License 就能使用的服務,不過 token-service 是必需要 Gold License 或是 Elastic Cloud service Standard 以上的授權才能使用的功能,這篇文章主要會介紹 token-service 的用法。

進入此章節的先備知識

  • OAuth2 的運作方式。(可參考這篇:)

此章節的重點學習

  • 如何使用 Elasticsearch Token Service,也就是 Get token API。


Elasticsearch Token Service

進到這篇文章時,已經假設讀者了解 OAuth2 的運作方式、也知道 OAuth2 的好處,而 Elastic Stack 在 X-Pack Security 的套件中,是以 token-service 的機制來實作 OAuth2 的 token 核發與更新機制。

基本介紹

在 Elastic Stack 中 token-service 的運作,主要就是以 來產生 access token 和 refresh token ,這個 access token 是個短時效性的 token,預設是 20分鐘 過期,最長可以設到 1小時 過期,而核發 access token 時會同時提供一個 refresh token ,這個 refresh token 是當 access token 過期時,換發新的 access token 用的,預設是 24小時 有效。

啟用 Token Service

Elasticsearch 的架設上,如果有開啟 TLS (HTTPS) 的話,預設就會啟用 token-service ,或是可以手動在 elasticsearch.yml 的 config 中開啟:

xpack.security.authc.token.enabled: true

這邊要注意, 因為安全性的考量, Elasticsearch 在 production 環境提供的 bootstrap 啟動檢查時,會特別檢查如果有開啟 token-service 的話,必須要啟用 TLS ,否則 token 在不安全的傳輸過程中,是非常危險的。

如先前提到的,這個 token-service 必須是

  • Gold License Subscription

  • Elastic Cloud service Standard version

這兩種或是以上的授權等級,才能使用這項服務,如果是自架的 Basic License ,在使用 get token API 時,會得到以下的錯誤訊息:

Get Token API

get token API 提供四種的 grant_type,分別的使用情境如下:

  • client_credentials: 這是實作了 OAuth2 中的 Client Credentials Grant 的機制,主要是用在 machine to machine 的使用情境中,並不是提供給一般使用者操作的情境使用的,而簽發這個 token 時,會依照本來的 credential 的權限,產生一組 token 並付予完全一樣的權限,而這個機制只會提供 access token 不會提供 refresh token。

  • password: 這是實作 Oauth2 中的 Resource Owner Password Credentials Grant 的機制,這個機制是用在某一個已授權的用戶代表另一個授權的用戶來產生 access token,白話一點的說法就是,你要 call 這個 get token API 必須是已授權的某個使用者,但你帶入的 username 和 password 會是另一個人的帳號,並且是為了這個帳號來產生適合他權限的 access token,這個機制產生的 access token 會同時包含 refresh token,適合長時間的使用。

  • refresh_token: 這是使用 refresh_token 來取的新的 access token 及 refresh_token 的時候所使用的。

以下有幾個例子:

Grant Type: client_credentials

這時因為在 call 這個 get token API 時,本身就會是以登入的身份 (或是帶某個 token 在 header 中),所以只要帶這個 grant_type ,就會直接以當下使用者的身份權限,來產生出 access token。

POST /_security/oauth2/token
{
  "grant_type" : "client_credentials"
}

以下是回傳的結果,包含了 access_token 以及過期的時間,這種 grant_type 是不會有 refresh_token 的。

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200
}

取得這個 access token 後,要使用的時候,在 HTTP Authroization 中帶入這個 Bearer 的 token 即可:

curl -H "Authorization: Bearer dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==" http://localhost:9200/_cluster/health

Grant Type: password

下面是使用 password grant type 的例子,需帶入 username 與 pasword:

POST /_security/oauth2/token
{
  "grant_type" : "password",
  "username" : "test_admin",
  "password" : "x-pack-test-password"
}

回傳的結果如下:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS"
}

可以看到這種 grant type 包含了 refresh_token,這個 refresh_token 的有效時間是 24小時,在這時限內,若 access token 過期,都能使用 refresh_token 來取得新的 access_token。

Grant Type: refresh_token

當 access token 過期時,若還在 refresh_token 有效的 24小時 之內,可以直接使用這種方式來取得新的 access token 和 refresh token。

POST /_security/oauth2/token
{
  "grant_type": "refresh_token",
  "refresh_token": "vLBPvmAB6KvwvJZr27cS"
}

以下是回傳結果:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS"
}

Token Service Settings

上面的例子的 expires_in 都是 1200 ,如果我們要改變 access token 的有效時間,可以到 elasticsearch.yml 來改變這個時間的設定:

xpack.security.authc.token.timeout: 20m

預設是 20m ,最大可以設定的值是 1小時。

Invalidate Token API

基本上 access_token 和 refresh_token 都有各自的過期時限,過期之後就無法再繼續使用。

如果要立即讓某個 token 失效、或某個使用者所有的 token 都失效時,就可以使用 invalidate Token API。

讓某個 access token 立刻失效

DELETE /_security/oauth2/token
{
  "token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ=="
}

讓某個 refresh token 立刻失效

DELETE /_security/oauth2/token
{
  "refresh_token" : "vLBPvmAB6KvwvJZr27cS"
}

讓某個使用者的 tokens 立刻失效

DELETE /_security/oauth2/token
{
  "username" : "myuser"
}

依照官方的範例,回傳結果如下,會告訴我們總共 invalidate 多少個 tokens,以及若遇到錯誤各自的原因為何:

{
  "invalidated_tokens":9, 
  "previously_invalidated_tokens":15, 
  "error_count":2, 
  "error_details":[ 
    {
      "type":"exception",
      "reason":"Elasticsearch exception [type=exception, reason=foo]",
      "caused_by":{
        "type":"exception",
        "reason":"Elasticsearch exception [type=illegal_argument_exception, reason=bar]"
      }
    },
    {
      "type":"exception",
      "reason":"Elasticsearch exception [type=exception, reason=boo]",
      "caused_by":{
        "type":"exception",
        "reason":"Elasticsearch exception [type=illegal_argument_exception, reason=far]"
      }
    }
  ]
}

**小插曲:**我在 Elastic Cloud service 試用這個 invlidate by username 時,發生以下的錯誤,看來是踩到某個 bug 了,看到 Github 上好像已經有類似的 issues,相信在不久後的 release 應該就會修掉了吧。

結語

參考資料

self-managed elasticsearch - basic license

_kerberos: 這是實作 SPNEGO Kerberos 機制,要使用的話,需要在 Elasticsearch 中設定好 。

以上是 Elasticsearch Token Service 的介紹,在 Micro-services 的架構之下,若是將 Elasticsearch 當成其中一個微服務來使用時,透過 Token based 的方式來整合與使用其資源,是個蠻好的資源管理方式,這個機制只要在 Elastic Cloud 中就能直接使用,若是 Self-managed 的版本,會需要購買 Gold License 才能使用,或是要走向其他 了。

📗
簡單易懂的 OAuth 2.0
get token API
Kerberos realm 的配置
Open Source 的 solution
官方文件 - Token-based authentcation services
官方文件 - Get token API
官方文件 - Invalidate token API
官方文件 - Security Settings - Token service settings
image-20201005054248853