使用 Istio 保護(hù)您的微服務(wù)
本文轉(zhuǎn)載自微信公眾號「新鈦云服」,作者祝祥 。轉(zhuǎn)載本文請聯(lián)系新鈦云服公眾號。
介紹
Istio 是一個開源項目,旨在管理云上微服務(wù)之間的通信。它獨(dú)立于平臺,但通常且主要與 Kubernetes 一起使用。Istio 提供了多項關(guān)鍵功能,例如流量管理、安全性和可觀察性。
在本文中,我們將重點(diǎn)介紹 Istio 的安全能力,包括增強(qiáng)認(rèn)證、透明 TLS 加密、身份驗證和授權(quán)。我們將 Istio 部署在 Kubernetes 集群上,并逐步介紹 Istio 安全功能,討論這些功能如何保護(hù)您的服務(wù)。
示例
我們使用 Istio 提供的示例應(yīng)用 Bookinfo[1] 來演示本文中 Istio 的功能。讓我們來看看 Istio 安全和 Bookinfo 的架構(gòu)。
ISTIO 安全架構(gòu)
Istio 安全涉及多個組件;下圖顯示了該架構(gòu)。在控制平面的 Istiod 組件中,我們有一個 CA(Certificate Authority)來管理證書,相關(guān)配置通過 API 服務(wù)器發(fā)送到數(shù)據(jù)平面(Envoy)。Envoy 作為策略執(zhí)行點(diǎn) (PEP) 來保護(hù)網(wǎng)格中客戶端和服務(wù)器之間或網(wǎng)格外部和內(nèi)部之間的通信安全。
Bookinfo應(yīng)用架構(gòu)
Bookinfo 應(yīng)用程序分為四個獨(dú)立的微服務(wù):
- productpage:調(diào)用詳細(xì)信息和評論微服務(wù)
- details:包含書籍詳細(xì)信息
- eviews:調(diào)用 ratings 微服務(wù)生成書評
- ratings:包含伴隨書評的排名信息
評論微服務(wù)共有三個版本;productpage 以循環(huán)方式訪問這些版本:
· 版本 v1 不調(diào)用ratings服務(wù)。
· 版本 v2 調(diào)用ratings服務(wù)并將每個評級顯示為 1 到 5 顆黑星。
· 版本 v3 調(diào)用ratings服務(wù)并將每個評級顯示為 1 到 5 顆紅星。
該應(yīng)用程序的端到端架構(gòu)如下所示。這些是沒有 Istio sidecar 部署的原始純服務(wù)。
ISTIO 認(rèn)證
如果您已經(jīng)安裝了 Istio,則無需對應(yīng)用程序進(jìn)行任何更改即可運(yùn)行示例?;蛘?,您可以簡單地在支持 Istio 的環(huán)境中配置和運(yùn)行服務(wù),并在每個服務(wù)旁邊注入 Envoy sidecar。生成的部署如下所示:
這里我們特意部署了沒有 sidecar 的 review-v2 和其他有 sidecar 的服務(wù)。這可以通過設(shè)置 Kubernetes 命名空間標(biāo)簽“istio-injection=enabled/disabled”輕松控制。一旦我們?yōu)?Pod 注入一個 sidecar 或者只是設(shè)置一個單一的邊緣代理作為入口網(wǎng)關(guān),Istio 身份就會生效。
Istio 身份模型使用一流的服務(wù)身份來確定請求來源的身份。在 Kubernetes 上,Istio 使用 Kubernetes 服務(wù)帳戶作為身份。下圖展示了 Istio 的身份配置工作流程。
- 啟動一個注入了 Istio 的 Pod,它還會啟動一個 Envoy 實例作為 Pod 的 sidecar。
- 當(dāng)工作負(fù)載啟動時,Envoy 通過 Envoy secret發(fā)現(xiàn)服務(wù) (SDS) API 從 Istio 代理請求證書。
- Istio 代理將證書簽名請求 (CSR) 及其憑據(jù) (JWT) 發(fā)送到 istiod 進(jìn)行簽名。
- Istio 代理將從 istiod 收到的以 SPIFFE 格式簽名的證書通過 Envoy SDS API 發(fā)送給 Envoy。
這里的證書是x.509,SPIFFE格式的URL作為x.509證書的擴(kuò)展字段進(jìn)行識別。SPIFFE 是開源的;k8s環(huán)境下Istio身份的格式類似于“spiffe://
雙向 TLS
Istio 支持雙向 TLS 來加密服務(wù)之間傳輸?shù)臄?shù)據(jù)。在 Bookinfo 應(yīng)用程序中,所有服務(wù)最初都是基于純 HTTP 協(xié)議相互通信的,其中數(shù)據(jù)沒有加密。當(dāng)一個工作負(fù)載使用雙向 TLS 認(rèn)證策略向另一個工作負(fù)載發(fā)送請求時,工作負(fù)載和 sidecar 之間的數(shù)據(jù)仍然是純文本的,而客戶端 Envoy 和服務(wù)器端 Envoy 建立雙向 TLS 連接。
對等認(rèn)證
應(yīng)用對等身份驗證策略(如上所示)后,Istio 會自動將兩個 PEP 之間的所有流量升級為雙向 TLS。由于默認(rèn)情況下啟用了 Istio 的自動 mTLS,因此仍然可以通過 HTTP 訪問 Reviews-v2。Istio 中的 Auto-mTLS 有助于確定客戶端 Sidecar 可以發(fā)送的流量類型:
如果配置了 DestinationRule,則信任它
如果服務(wù)器有 sidecar 并允許 mTLS,發(fā)送 mTLS – review-v1 & v3
否則,發(fā)送純文本 – review-v2
對等身份驗證僅定義服務(wù)器sidecar可以接收哪種類型的流量。Reviews-v2 沒有 sidecar,所以客戶端向它發(fā)送純文本。服務(wù)器端默認(rèn)處于 PERMISSIVE 模式,這意味著服務(wù)器端可以接受純文本和 mTLS。這在開始將集群與服務(wù)網(wǎng)格集成時非常有用,因為操作員通常無法同時為所有客戶端安裝 Istio sidecar,或者甚至沒有權(quán)限在某些客戶端上這樣做。
目的規(guī)則
與對等身份驗證相比,目標(biāo)規(guī)則定義了客戶端 Sidecar 可以發(fā)送的流量類型。應(yīng)用目標(biāo)規(guī)則策略(如上所示)后,review-v2 無法再訪問,因為目標(biāo)規(guī)則限制 productpage sidecar 發(fā)送 mTLS 流量,而 review-v2 只能接收純文本。
保護(hù)入口流量
Istio 支持通過入口網(wǎng)關(guān)將安全的 HTTPS 服務(wù)暴露給外部流量,因此無需更改內(nèi)部協(xié)議。它總共支持四種模式來在入口啟用 TLS。SIMPLE/MUTUAL 和 ISTIO_MUTUAL 對傳入的請求執(zhí)行 TLS 終止;它們用于配置對 HTTP 服務(wù)的
HTTPS 入口訪問。PASSTHROUGH 和 AUTO_PASSTHROUGH 僅按原樣傳遞入口流量,而不是使用 TLS 終止。
授權(quán)入口流量
添加要求最終用戶 JWT 用于入口網(wǎng)關(guān)的請求身份驗證策略。如果您在授權(quán)標(biāo)頭中提供令牌(其隱式默認(rèn)位置),則 Istio 將使用公鑰集驗證令牌,并在不記名令牌無效時拒絕請求。但是,接受沒有令牌的請求。
要拒絕沒有有效令牌的請求,請?zhí)砑右粋€ AuthorizationPolicy 規(guī)則,為具有請求主體的請求指定 ALLOW 操作,在上面的示例中顯示為 requestPrincipals。requestPrincipals 僅在提供有效的 JWT 令牌時可用。因此,該規(guī)則只允許具有有效令牌的請求。
應(yīng)用RequestAuthentication,如上圖:
- 使用有效的 JWT 令牌請求 √
- 請求沒有 JWT 令牌 √
- 使用無效的 JWT 令牌請求 ×
應(yīng)用AuthorizationPolicy,如上圖
- 使用有效的 JWT 令牌請求 √
- 沒有 JWT 令牌的請求 ×
- 使用無效的 JWT 令牌請求 ×
網(wǎng)格流量中的授權(quán)
AuthorizationPolicy 不僅可以應(yīng)用于入口網(wǎng)關(guān),還可以用于控制網(wǎng)格內(nèi)部的訪問。授權(quán)策略規(guī)范包括選擇器、操作和規(guī)則列表:
· 選擇器字段指定策略的目標(biāo)
· action 字段指定是允許還是拒絕請求;默認(rèn)值為“允許”
· 規(guī)則指定何時觸發(fā)動作
- 規(guī)則中的 from 字段指定請求的來源
- 規(guī)則中的 to 字段指定請求的操作
- when 字段指定應(yīng)用規(guī)則所需的條件
如果應(yīng)用拒絕所有 AuthorizationPolicy,則默認(rèn)命名空間下的服務(wù)之間的所有請求都將被拒絕。如果您隨后應(yīng)用 productpage-viewer 如下例所示,它允許對 productpage 服務(wù)進(jìn)行“GET”操作。
與productpage-viewer AuthorizationPolicy相比,reviews-viewer在spec規(guī)則的source字段多了一項配置;它指定只允許具有“[“cluster.local/ns/default/sa/bookinfo-productpage”]”服務(wù)帳戶的服務(wù)發(fā)送“GET”請求。一一應(yīng)用其他 AuthorizationPolicy 并測試產(chǎn)品頁面。Bookinfo 服務(wù)提供的不同信息都會再次出現(xiàn)在您的網(wǎng)頁上。圖片
概括:Istio 自動提供強(qiáng)大的識別功能。它還具有雙向 TLS,可對流量進(jìn)行加密以抵御中間人攻擊。Auto-mTLS 幫助您加入 Istio,PeerAuthentication 和 DestinationRule 簡化了對配置進(jìn)行細(xì)微調(diào)整的過程。此外,Istio 提供了靈活的服務(wù)訪問控制,因此您可以使用 RequestAuthentication、AuthorizationPolicy 等來設(shè)置細(xì)粒度的訪問策略。
參考
· Istio 官方文檔:https ://istio.io/latest/docs/
· https://istio.io/latest/docs/examples/bookinfo/
原文
https://01.org/blogs/luyaozhong/2021/secure-your-microservices-istio