譯者 | 布加迪
審校 | 重樓
由于涉及多種多樣的大規(guī)模組件,保護(hù)分布式系統(tǒng)是一項(xiàng)復(fù)雜的挑戰(zhàn)。鑒于多個(gè)服務(wù)在可能不安全的網(wǎng)絡(luò)上交互,未經(jīng)授權(quán)的訪問和數(shù)據(jù)泄露的風(fēng)險(xiǎn)顯著增加。本文探討了一種使用開源項(xiàng)目保護(hù)分布式系統(tǒng)的實(shí)用方法,該項(xiàng)目演示了如何集成幾種安全機(jī)制和技術(shù)來應(yīng)對常見的安全挑戰(zhàn),比如身份驗(yàn)證、授權(quán)和安全通信。

理解分布式系統(tǒng)中的安全挑戰(zhàn)
分布式系統(tǒng)涉及多個(gè)服務(wù)或微服務(wù),這些服務(wù)或微服務(wù)必須通過網(wǎng)絡(luò)安全地通信。這類架構(gòu)中的主要安全挑戰(zhàn)包括:
1. 安全通信:確保服務(wù)之間傳輸?shù)臄?shù)據(jù)經(jīng)過加密、安全可靠,以免被竊聽或篡改。
2. 身份驗(yàn)證:驗(yàn)證用戶和服務(wù)的身份,防止未授權(quán)訪問。
3. 授權(quán):根據(jù)身份已驗(yàn)證的用戶和服務(wù)的角色和權(quán)限,控制允許用戶和服務(wù)執(zhí)行的操作。
4. 策略執(zhí)行:實(shí)施管理服務(wù)到服務(wù)和用戶交互的細(xì)粒度訪問控制和策略。
5. 證書管理:管理用于加密數(shù)據(jù)、建立服務(wù)之間信任的數(shù)字證書。
這個(gè)開源項(xiàng)目使用幾種集成的技術(shù)和解決方案來克服這些挑戰(zhàn)。

項(xiàng)目設(shè)置和配置
該項(xiàng)目先使用shell腳本和Docker建立一個(gè)安全的環(huán)境。設(shè)置需要提供數(shù)字證書和啟動(dòng)必要的服務(wù),以確保所有組件都準(zhǔn)備好進(jìn)行安全通信。
設(shè)置環(huán)境的步驟
1. 提供證書
該項(xiàng)目使用shell腳本(provisioning.sh)以模擬證書頒發(fā)機(jī)構(gòu)(CA),并為服務(wù)生成必要的證書。
./provisioning.sh2. 啟動(dòng)服務(wù)
Docker Compose用于啟動(dòng)項(xiàng)目中定義的所有服務(wù),確保它們被正確配置以實(shí)現(xiàn)安全運(yùn)行。
docker-compose up3. 測試服務(wù)到服務(wù)通信
為了使用證書和JWT令牌驗(yàn)證服務(wù)到服務(wù)通信,提供test_services.sh腳本。該腳本演示了不同的服務(wù)如何使用分配給它們的證書安全地交互。
解決分布式系統(tǒng)中的安全挑戰(zhàn)
該項(xiàng)目集成了幾項(xiàng)關(guān)鍵技術(shù)來解決前面提到的主要安全挑戰(zhàn)。以下是應(yīng)對每個(gè)挑戰(zhàn)的方法:
1. 使用相互TLS(mTLS)的安全通信
挑戰(zhàn)
在分布式系統(tǒng)中,服務(wù)必須安全地通信,以防止未經(jīng)授權(quán)的訪問和數(shù)據(jù)泄露。
解決方案
該項(xiàng)目使用相互TLS(mTLS)來保護(hù)服務(wù)之間的通信。mTLS確保客戶端和服務(wù)器都使用各自的證書對彼此進(jìn)行身份驗(yàn)證。這種相互驗(yàn)證可以防止未經(jīng)授權(quán)的服務(wù)與合法服務(wù)進(jìn)行通信。
實(shí)施
Nginx被配置為反向代理來處理mTLS。它需要客戶端證書和服務(wù)器證書來建立安全連接,確保服務(wù)之間傳輸?shù)臄?shù)據(jù)保持機(jī)密和防篡改。
2. 使用Keycloak的身份驗(yàn)證
挑戰(zhàn)
正確地驗(yàn)證用戶和服務(wù)的身份對于防止未經(jīng)授權(quán)的訪問至關(guān)重要。
解決方案
該項(xiàng)目利用開源身份和訪問管理解決方案Keycloak來管理身份驗(yàn)證。Keycloak支持多種身份驗(yàn)證方法,包括OpenID Connect和客戶端憑據(jù),既適合用戶身份驗(yàn)證,又適合服務(wù)身份驗(yàn)證。
- 用戶身份驗(yàn)證:
使用OpenID Connect對用戶進(jìn)行身份驗(yàn)證。Keycloak配置了客戶端(appTest-login-client),該客戶端處理用戶身份驗(yàn)證流,包括登錄、令牌頒發(fā)和回調(diào)處理。
- 服務(wù)身份驗(yàn)證:
針對服務(wù)到服務(wù)的身份驗(yàn)證,項(xiàng)目使用為客戶端憑據(jù)授予類型配置的Keycloak客戶端(client_credentials-test)。這種方法非常適合在沒有用戶干預(yù)的情況下對服務(wù)進(jìn)行身份驗(yàn)證。
身份驗(yàn)證流示例
- 用戶導(dǎo)航到登錄頁面。
- 成功登錄后,Keycloak將用戶重定向到帶有授權(quán)碼的回調(diào)頁面。
- 然后將授權(quán)碼交換為JWT令牌,用于后續(xù)請求。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. 使用開放策略代理(OPA)和JWT的用戶授權(quán)
挑戰(zhàn)
實(shí)施細(xì)粒度的訪問控制,以確保身份已驗(yàn)證的用戶和服務(wù)只能訪問授權(quán)的資源。
解決方案
該項(xiàng)目結(jié)合使用開放策略代理(OPA)和JWT令牌來執(zhí)行授權(quán)策略。該項(xiàng)目演示了三種不同的JWT驗(yàn)證策略,以確保可靠的安全性:
- 從Keycloak獲取證書:從Keycloak動(dòng)態(tài)獲取證書以驗(yàn)證令牌。
- 使用x5t(拇指紋):使用令牌中嵌入的拇指紋,從本地信任存儲中檢索公鑰。
- 嵌入式證書驗(yàn)證:使用嵌入式證書驗(yàn)證令牌,確保對照受信任的證書頒發(fā)機(jī)構(gòu)(CA)驗(yàn)證證書。
有關(guān)這些策略的詳細(xì)實(shí)施,請參閱nginx/njs/token.js文件:https://github.com/apssouza22/security-architecture/blob/main/nginx/njs/token.js。
4. 使用開放策略代理(OPA)的策略執(zhí)行
挑戰(zhàn)
為服務(wù)和用戶實(shí)施動(dòng)態(tài)靈活的訪問控制策略。
解決方案
OPA用于實(shí)施細(xì)粒度的訪問控制策略。策略用聲明性語言(Rego)加以編寫,存儲在opa/目錄中。這些策略規(guī)定了服務(wù)可以通信、用戶可以訪問資源的條件,確保在整個(gè)系統(tǒng)中一致地運(yùn)用訪問控制。
5. 證書管理
挑戰(zhàn)
管理服務(wù)的數(shù)字證書,以建立信任和安全通信。
解決方案:
該項(xiàng)目包括一個(gè)強(qiáng)大的證書管理系統(tǒng)。shell腳本(provisioning.sh)用于模擬證書頒發(fā)機(jī)構(gòu)(CA),并為每個(gè)服務(wù)生成證書。這種方法簡化了證書管理,并確保所有服務(wù)都擁有安全通信所需的憑據(jù)。
我們還添加了一個(gè)端點(diǎn)來更新服務(wù)證書,不需要重啟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í)行和證書管理。這個(gè)開源項(xiàng)目提供了一個(gè)全面的示例,表明如何集成多種安全機(jī)制來有效地應(yīng)對這些挑戰(zhàn)。
如果遵循本項(xiàng)目中演示的設(shè)置和配置,開發(fā)人員就可以利用相互TLS、Keycloak、Open Policy Agent和Nginx來構(gòu)建一套穩(wěn)健的安全架構(gòu)。這些技術(shù)結(jié)合在一起,就可以為保護(hù)分布式系統(tǒng)免受各種威脅提供堅(jiān)實(shí)的基礎(chǔ),確保數(shù)據(jù)保護(hù)和安全訪問控制。
原文標(biāo)題:Designing a Secure Architecture for Distributed Systems,作者:Alexsandro Souza



































