iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
Software Development

微服務導入:從觀念到落地的架構實戰地圖系列 第 25

微服務導入 – Day 25 微服務的安全性與存取控制

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20251002/20178262lsDoVIPN7d.png

在單體式應用裡,系統常倚賴「內外網邊界」與單一登入機制;然而到了微服務世界,每一次呼叫都是跨網路、每一個服務都是潛在邊界。因此,安全與存取控制不再是附加功能,而是系統設計的第一性原則。本篇聚焦四個核心觀念與做法:零信任(Zero Trust)、mTLS、OAuth2 與 OpenID Connect (OIDC),並說明在微服務環境下如何落地、何時選用,以及常見誤區與最佳實務。


關鍵名詞與心智模型

零信任(Zero Trust)

定義:不預設信任任何請求,無論來源在「內」或「外」。每次存取都需明確驗證身份、最小權限授權、持續性評估(使用者、裝置、環境)。
核心原則:
• 永不信任、持續驗證(Never trust, always verify)
• 最小權限(Least privilege)
• 偵測與回應(Assume breach)

mTLS(Mutual TLS)

定義:雙向 TLS。客戶端與伺服器端互相出示憑證並驗證,確保「你是你、我也是我」,且傳輸加密。
微服務價值:保護東西向流量(服務對服務),避免內網被動手腳時資料外洩。

OAuth2

定義:一個授權框架,讓資源擁有者在不交出密碼的情況下,授權第三方應用存取其資源(以 Access Token 為票據)。
常見流程:Authorization Code(含 PKCE)、Client Credentials、Device Code 等。

OpenID Connect(OIDC)

定義:建立在 OAuth2 之上的身份層協定,提供標準化的登入流程與 ID Token(JWT),讓服務端能驗證使用者身份、取得基本宣告(claims)。


威脅情境到控制對策:為什麼微服務更需要它們?

• 攻擊面爆炸:服務從 1 變成 10、100,入口、出口與相依數量倍增。
• 環境多樣:多雲、混合雲、邊緣、容器與 VM 夾雜。
• 人與機器雙身份:人(User-to-Service)與服務(Service-to-Service)同時需要身份與授權治理。
• 網路不可信:即便在「內網」,也要假設已有入侵者。

對策映射:

• 零信任 → 提供整體安全策略與治理框架。
• mTLS → 解決東西向密通與實體身份驗證(Workload Identity)。
• OAuth2 / OIDC → 解決邊界與應用層的授權 / 身份問題(人與應用雙場景)。


實作與工具盤點(可直接列為專案待辦)

A. 零信任實作藍圖

  1. 強化身份:人員導入 MFA、裝置姿態(Device Posture)檢查、風險評分。
  2. 微服務邊界:以服務為單位做網段隔離與存取控制(K8s NetworkPolicy、Service Mesh AuthorizationPolicy)。
  3. 持續驗證:每次請求驗證憑證 / Token,有效期短、可撤銷。
  4. 集中治理:以政策為中心(Policy-as-Code),統一審核與稽核。

常見工具:BeyondCorp 模型、Azure Zero Trust、OPA/Gatekeeper、Kyverno、HashiCorp Vault(憑證/密鑰生命週期)。

B. mTLS:把「你是誰」刻在連線上
如何落地:

  • Service Mesh(推薦):Istio、Linkerd、Consul Connect 以 sidecar / proxy 自動施行 mTLS。
  • PKI 佈建:內部 CA、憑證輪替(可用 cert-manager、SPIFFE/SPIRE)。
  • 模式:PERMISSIVE→觀察期、STRICT→強制期。
    【注意事項】:
  • 邊界終止(TLS termination):在 Gateway/Ingress 終止後,入網必須再以 mTLS 保護內部跳點。
  • Bypass 風險:避免繞過 sidecar 的直連(需網路層強制導流)。
  • 憑證輪替演練:短生命週期 + 自動輪轉,預防過期事故。

工具:Istio/Envoy、Linkerd、Consul、cert-manager、SPIRE(Workload Identity)。

C. OAuth2 與 OIDC:人與應用的「身份與授權語言」
• 典型架構:
Authorization Server(AS):Keycloak、Auth0、Okta、Azure AD、Cognito。
Resource Server(RS):你的微服務,用於驗證 Access Token、檢查 scope/audience。
Client:Web、Mobile、API Gateway、BFF。

• 流程選擇:
Authorization Code + PKCE:瀏覽器與行動裝置首選。
Client Credentials:服務到服務(B2B / 機器對機器)。
Device Code:無鍵盤裝置。

• Token 治理:
短時效 Access Token + 可撤銷 Refresh Token。
使用 audience、scope、resource indicators 做最小權限。
JWT 驗簽(JWKS)、時鐘漂移(clock skew)容錯。

• OIDC 要點:
ID Token 只為「身份」,不要用來授權資源;授權靠 Access Token。
Nonce、防重放、單點登出(Front/Back-channel Logout)策略。

工具:Keycloak、Auth0、Okta、Spring Security、OPA/Envoy ext-authz。


如何把它們拼成一張「微服務安全藍圖」

  1. 邊界(North-South)
    由 API Gateway / Ingress 統一入口:TLS、WAF、DDoS 防護、Rate Limit。
    使用 OIDC 完成使用者登入、取得 ID Token 與 Access Token。
    Gateway 驗 Token(包括簽章、時效、audience、scope),通過後轉發至後端。

  2. 東西向(East-West)
    服務間以 mTLS 建立信道安全與實體身份。
    針對使用者情境需要「權限傳遞」時,使用 Token 轉換 / 下游再授權(Token Exchange、Propagate JWT with least scope)。
    搭配 OPA/Envoy AuthorizationPolicy 在 proxy 層做細緻授權(ABAC/RBAC/REBAC)。

  3. 密鑰管理
    秘密集中管理與審核:Vault 或 KMS;禁止把秘密寫進 image / repo。
    自動輪替:TLS 憑證、JWT 簽章金鑰(JWKS 旋轉)。

  4. 可觀測與稽核
    稽核日誌:登入、授權決策、策略變更。
    分散式追蹤:把 user id / session id / trace id 串起來。
    政策即程式:Rego 規則版本化、PR 審查與回溯。


適用時機與真實案例

• 零信任:多雲/多區/遠端混合辦公;大量外包人員或供應商接入;醫療、金融、政府等高敏產業。
• mTLS:任何需要保護服務間通訊與實體身份的內部調用;特別是包含敏感資料(病歷、支付)。
• OAuth2/OIDC:對外 API、行動 App、第三方整合、企業 SSO、多租戶平台。

案例拼圖(醫療場景示意):
• 民眾端 App/院所端 Web 皆走 OIDC + OAuth2。
• 內部微服務以 mTLS + SPIFFE ID 互認,並在 Service Mesh 做授權策略。
• API Gateway 依客戶端型態(BFF)發不同細緻 API,並實作流量治理。
• Keycloak 管控使用者身份、角色與同意(consent);Vault 管控密鑰;OPA 管控細粒度授權。


常見誤區與防呆清單

• 把 JWT 當 Session:ID Token 不是用來授權資源;Access Token 要短效且可撤銷。
• 長壽命 Token:高風險。建議短效(數分鐘)+ Refresh Token(可撤銷)。
• 只在邊界 TLS:內部通訊未加密、未驗證身份 → 必須導入 mTLS。
• 繞過 Gateway:內部服務直接暴露;應強制內外分層與零信任網路策略。
• 共享「超級金鑰」:所有服務共用同一組憑證或 client secret;要改為每服務一把鑰(最小權限)。
• 憑證輪替沒演練:到期才驚覺會停機;把輪替做成定期演練。
• Scope 設計過粗:導致權限擴散;以 audience + scope + resource 精準劃分。
• 忽略稽核軌跡:沒有誰在何時做了什麼的證據;開啟審計日誌與變更記錄。


測試與驗證:把安全變成「可以被 CI 驗證的規格」

• 安全單元測試:Token 驗簽、期限、scope、audience、拒絕清單(revocation)。
• 整合測試:BFF/Gateway ↔ AS ↔ Service 的串接流程;Token 轉換、逾時、重試。
• 政策測試:OPA Rego 規則以單元測試覆蓋(授權通過/拒絕的邊界案例)。
• 掃描與壓測:ZAP/DAST 漏洞掃描、mTLS 壓測、WAF 規則調校。
• 演練:金鑰輪替、憑證過期、AS 停機降級方案(本地快取、只讀模式)。


工具與組件速查表

類別 推薦工具 作用
身份/授權 Keycloak, Auth0, Okta, Azure AD, Cognito OIDC/OAuth2 AS、金鑰輪替、同意管理
Service Mesh Istio, Linkerd, Consul Connect mTLS、自動 sidecar、L7 授權
憑證/身分 cert-manager, SPIFFE/SPIRE, Vault 憑證簽發與輪替、Workload Identity、秘密管理
政策治理 OPA/Gatekeeper, Kyverno Policy-as-Code、K8s 准入控制
Gateway Envoy, Kong, APISIX, NGINX, Spring Cloud Gateway 邊界控制、驗證、流量治理
可觀測 Prometheus, Grafana, Loki/ELK, Jaeger/Zipkin 指標、日誌、追蹤、警示

採用路線圖(30/60/90 天)

• 前 30 天:
選定 AS(如 Keycloak),實作 OIDC 登入(Authorization Code + PKCE)。
API Gateway 端到端 TLS;存取日誌與審計打底。
• 60 天:
導入 Service Mesh,內部流量切到 mTLS PERMISSIVE → 觀察 → 切 STRICT。
引入 OPA/AuthorizationPolicy 針對敏感路徑做細權限。
• 90 天:
憑證與金鑰輪替自動化、演練。
Token 生命週期收斂(短效化 + 轉換策略)。
安全測試/政策測試進 CI/CD,定期 DAST/SAST。


結語

微服務的價值在於獨立演進與快速交付,而要讓這個價值可持續,安全機制必須「預設即存在」。
• 零信任提供了宏觀框架;
• mTLS確保服務實體間的真實身份與通道安全;
• OAuth2 / OIDC則讓「誰是誰、能做什麼」有了標準語言與治理手段。

把這四塊拼好,你的微服務才真正站上「安全可運營」的地基,進而放心地擴張、調整與創新。


上一篇
微服務導入 – Day 24 CI/CD 與 DevOps:微服務環境下的持續交付與無中斷上版策略
下一篇
微服務導入 - Day 26 移轉到微服務架構
系列文
微服務導入:從觀念到落地的架構實戰地圖30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言