譯者 | 布加迪
審校 | 重樓
由于涉及多種多樣的大規(guī)模組件,保護(hù)分布式系統(tǒng)是一項(xiàng)復(fù)雜的挑戰(zhàn)。鑒于多個(gè)服務(wù)在可能不安全的網(wǎng)絡(luò)上交互,未經(jīng)授權(quán)的訪問(wèn)和數(shù)據(jù)泄露的風(fēng)險(xiǎn)顯著增加。本文探討了一種使用開(kāi)源項(xiàng)目保護(hù)分布式系統(tǒng)的實(shí)用方法,該項(xiàng)目演示了如何集成幾種安全機(jī)制和技術(shù)來(lái)應(yīng)對(duì)常見(jiàn)的安全挑戰(zhàn),比如身份驗(yàn)證、授權(quán)和安全通信。
理解分布式系統(tǒng)中的安全挑戰(zhàn)
分布式系統(tǒng)涉及多個(gè)服務(wù)或微服務(wù),這些服務(wù)或微服務(wù)必須通過(guò)網(wǎng)絡(luò)安全地通信。這類架構(gòu)中的主要安全挑戰(zhàn)包括:
1. 安全通信:確保服務(wù)之間傳輸?shù)臄?shù)據(jù)經(jīng)過(guò)加密、安全可靠,以免被竊聽(tīng)或篡改。
2. 身份驗(yàn)證:驗(yàn)證用戶和服務(wù)的身份,防止未授權(quán)訪問(wèn)。
3. 授權(quán):根據(jù)身份已驗(yàn)證的用戶和服務(wù)的角色和權(quán)限,控制允許用戶和服務(wù)執(zhí)行的操作。
4. 策略執(zhí)行:實(shí)施管理服務(wù)到服務(wù)和用戶交互的細(xì)粒度訪問(wèn)控制和策略。
5. 證書(shū)管理:管理用于加密數(shù)據(jù)、建立服務(wù)之間信任的數(shù)字證書(shū)。
這個(gè)開(kāi)源項(xiàng)目使用幾種集成的技術(shù)和解決方案來(lái)克服這些挑戰(zhàn)。
項(xiàng)目設(shè)置和配置
該項(xiàng)目先使用shell腳本和Docker建立一個(gè)安全的環(huán)境。設(shè)置需要提供數(shù)字證書(shū)和啟動(dòng)必要的服務(wù),以確保所有組件都準(zhǔn)備好進(jìn)行安全通信。
設(shè)置環(huán)境的步驟
1. 提供證書(shū)
該項(xiàng)目使用shell腳本(provisioning.sh)以模擬證書(shū)頒發(fā)機(jī)構(gòu)(CA),并為服務(wù)生成必要的證書(shū)。
./provisioning.sh
2. 啟動(dòng)服務(wù)
Docker Compose用于啟動(dòng)項(xiàng)目中定義的所有服務(wù),確保它們被正確配置以實(shí)現(xiàn)安全運(yùn)行。
docker-compose up
3. 測(cè)試服務(wù)到服務(wù)通信
為了使用證書(shū)和JWT令牌驗(yàn)證服務(wù)到服務(wù)通信,提供test_services.sh腳本。該腳本演示了不同的服務(wù)如何使用分配給它們的證書(shū)安全地交互。
解決分布式系統(tǒng)中的安全挑戰(zhàn)
該項(xiàng)目集成了幾項(xiàng)關(guān)鍵技術(shù)來(lái)解決前面提到的主要安全挑戰(zhàn)。以下是應(yīng)對(duì)每個(gè)挑戰(zhàn)的方法:
1. 使用相互TLS(mTLS)的安全通信
挑戰(zhàn)
在分布式系統(tǒng)中,服務(wù)必須安全地通信,以防止未經(jīng)授權(quán)的訪問(wèn)和數(shù)據(jù)泄露。
解決方案
該項(xiàng)目使用相互TLS(mTLS)來(lái)保護(hù)服務(wù)之間的通信。mTLS確保客戶端和服務(wù)器都使用各自的證書(shū)對(duì)彼此進(jìn)行身份驗(yàn)證。這種相互驗(yàn)證可以防止未經(jīng)授權(quán)的服務(wù)與合法服務(wù)進(jìn)行通信。
實(shí)施
Nginx被配置為反向代理來(lái)處理mTLS。它需要客戶端證書(shū)和服務(wù)器證書(shū)來(lái)建立安全連接,確保服務(wù)之間傳輸?shù)臄?shù)據(jù)保持機(jī)密和防篡改。
2. 使用Keycloak的身份驗(yàn)證
挑戰(zhàn)
正確地驗(yàn)證用戶和服務(wù)的身份對(duì)于防止未經(jīng)授權(quán)的訪問(wèn)至關(guān)重要。
解決方案
該項(xiàng)目利用開(kāi)源身份和訪問(wèn)管理解決方案Keycloak來(lái)管理身份驗(yàn)證。Keycloak支持多種身份驗(yàn)證方法,包括OpenID Connect和客戶端憑據(jù),既適合用戶身份驗(yàn)證,又適合服務(wù)身份驗(yàn)證。
- 用戶身份驗(yàn)證:
使用OpenID Connect對(duì)用戶進(jìn)行身份驗(yàn)證。Keycloak配置了客戶端(appTest-login-client),該客戶端處理用戶身份驗(yàn)證流,包括登錄、令牌頒發(fā)和回調(diào)處理。
- 服務(wù)身份驗(yàn)證:
針對(duì)服務(wù)到服務(wù)的身份驗(yàn)證,項(xiàng)目使用為客戶端憑據(jù)授予類型配置的Keycloak客戶端(client_credentials-test)。這種方法非常適合在沒(méi)有用戶干預(yù)的情況下對(duì)服務(wù)進(jìn)行身份驗(yàn)證。
身份驗(yàn)證流示例
- 用戶導(dǎo)航到登錄頁(yè)面。
- 成功登錄后,Keycloak將用戶重定向到帶有授權(quán)碼的回調(diào)頁(yè)面。
- 然后將授權(quán)碼交換為JWT令牌,用于后續(xù)請(qǐng)求。nginx/njs目錄中的authn.js文件提供了該流程的詳細(xì)實(shí)施。
使用客戶端憑據(jù)的服務(wù)身份驗(yàn)證示例
curl -X POST "http://localhost:9000/realms/tenantA/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=client_credentials-test" \
-d "client_secret=your-client-secret-here"
3. 使用開(kāi)放策略代理(OPA)和JWT的用戶授權(quán)
挑戰(zhàn)
實(shí)施細(xì)粒度的訪問(wèn)控制,以確保身份已驗(yàn)證的用戶和服務(wù)只能訪問(wèn)授權(quán)的資源。
解決方案
該項(xiàng)目結(jié)合使用開(kāi)放策略代理(OPA)和JWT令牌來(lái)執(zhí)行授權(quán)策略。該項(xiàng)目演示了三種不同的JWT驗(yàn)證策略,以確保可靠的安全性:
- 從Keycloak獲取證書(shū):從Keycloak動(dòng)態(tài)獲取證書(shū)以驗(yàn)證令牌。
- 使用x5t(拇指紋):使用令牌中嵌入的拇指紋,從本地信任存儲(chǔ)中檢索公鑰。
- 嵌入式證書(shū)驗(yàn)證:使用嵌入式證書(shū)驗(yàn)證令牌,確保對(duì)照受信任的證書(shū)頒發(fā)機(jī)構(gòu)(CA)驗(yàn)證證書(shū)。
有關(guān)這些策略的詳細(xì)實(shí)施,請(qǐng)參閱nginx/njs/token.js文件:https://github.com/apssouza22/security-architecture/blob/main/nginx/njs/token.js。
4. 使用開(kāi)放策略代理(OPA)的策略執(zhí)行
挑戰(zhàn)
為服務(wù)和用戶實(shí)施動(dòng)態(tài)靈活的訪問(wèn)控制策略。
解決方案
OPA用于實(shí)施細(xì)粒度的訪問(wèn)控制策略。策略用聲明性語(yǔ)言(Rego)加以編寫(xiě),存儲(chǔ)在opa/目錄中。這些策略規(guī)定了服務(wù)可以通信、用戶可以訪問(wèn)資源的條件,確保在整個(gè)系統(tǒng)中一致地運(yùn)用訪問(wèn)控制。
5. 證書(shū)管理
挑戰(zhàn)
管理服務(wù)的數(shù)字證書(shū),以建立信任和安全通信。
解決方案:
該項(xiàng)目包括一個(gè)強(qiáng)大的證書(shū)管理系統(tǒng)。shell腳本(provisioning.sh)用于模擬證書(shū)頒發(fā)機(jī)構(gòu)(CA),并為每個(gè)服務(wù)生成證書(shū)。這種方法簡(jiǎn)化了證書(shū)管理,并確保所有服務(wù)都擁有安全通信所需的憑據(jù)。
我們還添加了一個(gè)端點(diǎn)來(lái)更新服務(wù)證書(shū),不需要重啟nginx。
curl --insecure https://localhost/certs --cert certificates/gen/serviceA/client.crt --key certificates/gen/serviceA/client.key -F cert=@certificates/gen/serviceA/client.crt -F key=@certificates/gen/serviceA/client.key
結(jié)論
構(gòu)建安全的分布式系統(tǒng)需要仔細(xì)考慮各個(gè)安全方面,包括安全通信、身份驗(yàn)證、授權(quán)、策略執(zhí)行和證書(shū)管理。這個(gè)開(kāi)源項(xiàng)目提供了一個(gè)全面的示例,表明如何集成多種安全機(jī)制來(lái)有效地應(yīng)對(duì)這些挑戰(zhàn)。
如果遵循本項(xiàng)目中演示的設(shè)置和配置,開(kāi)發(fā)人員就可以利用相互TLS、Keycloak、Open Policy Agent和Nginx來(lái)構(gòu)建一套穩(wěn)健的安全架構(gòu)。這些技術(shù)結(jié)合在一起,就可以為保護(hù)分布式系統(tǒng)免受各種威脅提供堅(jiān)實(shí)的基礎(chǔ),確保數(shù)據(jù)保護(hù)和安全訪問(wèn)控制。
原文標(biāo)題:Designing a Secure Architecture for Distributed Systems,作者:Alexsandro Souza