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