來到了第四天,既然已經完成了中間層 Kong API Gateway的設計,是時候來思考,要如何辨識API 的使用者了。如果讀者曾經寫過需要登入 的Web Site,不妨與筆者一起先來思考一下,撰寫這類型網站的一些特點是不是如下:
帳號
與密碼
,可能透過session
或是前後端分離採取token的方式辨識。筆者在企業中,每當提到API 或是Web Service要注意的一些事項時,許多人常常暈頭轉向陷入原有Web Site的設計思維而感到困惑,舉幾個常被問的例子如下:
(order?id=1)
。上面的例子是真實發生的,也的確有企業在這樣的設計下活下來。只要能夠有效管理,當然都是種作法,不過筆者比較囉嗦,所以喜歡優雅的且有效的設計與管理。因此這個系列文將會好好的與讀者一起思考,怎麼做在實務上才是比較好的做法。
雖然這些做法在企業內部曾經「運作正常」,甚至支撐了多年業務,但若用 OWASP API Security Top 10 來檢視,會發現它們正好踩中多個常見 API 弱點。
API1:2023 – Broken Object Level Authorization
透過 order?id=1 讓使用者自行輸入 ID,若缺乏嚴格授權檢查,等於把「別人家的訂單」送上門。
API2:2023 – Broken Authentication
靠 IP 鎖定或防火牆白名單來辨識客戶,忽略了使用者層級的身分驗證,一旦 IP 被濫用,系統無法分辨真正的呼叫者。
API8:2023 – Security Misconfiguration
複製多份 API 給不同廠商、各自配專線,雖然直觀,但帶來維護成本與一致性風險,一旦設定錯誤,可能讓資料暴露。
這些案例的共通點,是「沒有標準化的 API 身分與授權管理」,導致每個 API 實作都要重新解題,安全與維護的成本居高不下。
OWASP API Security Top 10 是由 OWASP 制定的十大常見 API 安全風險清單,涵蓋從身分驗證、授權缺陷到錯誤設定等問題,協助開發者與企業識別並優先修補 API 的安全弱點,降低資料外洩與濫用風險。
參考來源:OWASP Top 10 API Security Risks – 2023
為了在單一 API Gateway 中統一管理使用者身分,Kong API Gateway的 Consumer 提供了可擴展多種驗證方式供使用。Consumer 是 Kong 內部對「API 使用者」的抽象化表示,不論他是第三方廠商、行動 App、內部系統,都能夠精準辨識。
圖 4-1
Day 3的時候有提及到Route
與Service
的觀念,這張圖4-1 則精準地描繪出,在每一個Request的時候,Kong會從Consumer
的角度先判斷呼叫方。接下來才會進入到Route
以及後續的Service
。今天就來透過最簡單的API Key,來做來源認證辨識示範。
首先先關注到示範專案中ironman2025\case_2_consumer_apikey\1.Kong_declarative\kong.yml
這個檔案,與case1差異簡略顯示如下:
// ...上略...
- name: file-log
config:
path: /tmp/kong-file.log
- name: key-auth
config:
key_names:
- apikey
hide_credentials: false
consumers:
- username: user1@user.com
custom_id: user1
keyauth_credentials:
- key: user1-api-key
上面這段新增的設定,是用於 Kong API Gateway 的 key-auth plugin,目的是為 API 請求加入 API 金鑰驗證機制。
接下來的 consumers 區塊定義了 API 使用者。這裡有一個使用者,簡述如下:
好,來驗證Kong 是不是有把未經認證的API Request 阻擋起來,首先先在示範專案ironman2025\case_2_consumer_apikey
路徑下執行 docker compose up -d
,應該會看到圖4-1的結果。
圖4-2 docker compose 啟動成功
服務正常啟動後,開啟瀏覽器來驗證,url:http://localhost:8000/my-service/weatherforecast
。
圖4-3 401錯誤
圖4-3很清楚的表示,原本在Case 可以成功呼叫的API,由於Kong API Gateway 已經將key-auth
認證plugin 設定在route上。因此需要提供apikey經過認證後,才可以合法的呼叫。
接下來開啟postman
來接續實驗,除了前面提到url:http://localhost:8000/my-service/weatherforecast
外,請在headers加入apikey=user1-api-key
,並按下Send
。
圖4-4 成功的Postman
太棒了,成功!
這表示當 API 請求帶有 apikey=user1-api-key
時,Kong 會認定這是 user1 的合法請求。這初步完成了在Kong API Gateway 上面做到須先經過認證,才能存取後端API安全性設定。
在這種設計下,營運單位就可以透過Kong 上面Consumer 的設定,來辨識存取來源。
今天的任務也順利完成,讓工程師明天繼續面臨新的挑戰。