用Sidecar安全代理保護Jaeger用戶界面
譯文【51CTO.com快譯】您將學習到如何使用Sidecar安全代理來提高應用程序的安全性能,并能防止諸如暴力破解等類型的攻擊。
在Jaeger的產品部署中,我們限制訪問Jaeger的查詢服務,包括用戶界面(UI),是非常有益的。例如,您可能有各種內部安全的要求,只允許某些群組能夠訪問跟蹤數據,或者您可能將Jaeger部署到了公有云之上。在真正的微服務(microservices)方式里,一種可能的方法是給Jaeger查詢服務添加一個Sidecar作為安全代理。各種入向請求都被傳遞到我們的Sidecar,而非直接到達Jaeger的查詢服務上。而Sidecar將負責執(zhí)行各種身份驗證和授權的限制。
如上圖所示:傳入的HTTP請求到達路徑(route)①,它使用內部服務②來進行解析,并與安全代理③進行通信。一旦請求通過驗證,且所有安全的限制得到了滿足,則該請求就到達Jaeger④。
出于演示的目的,我們將使用Keycloak(譯者注:Keycloak是一個為瀏覽器和RESTful Web服務提供SSO的集成)作為自己的安全解決方案,當然其他任何安全代理也都適用于這個理念。當然如果您并不修改Red Hat的SSO(Single Sign-On),這個演示也能夠運作。因此對于本次操作練習,我們需要如下:
- 一臺Keycloak(或是Red Hat的SSO)服務器的運行實例。我們定義它的位置為$ { REDHAT_SSO_URL }
- 一個OpenShift的集群,我們將用來運行Jaeger的后端組件。它就像oc cluster up一樣容易
- 一份Jaeger OpenShift產品模板的本地克隆
注意:我們并不會試圖對組件之間(比如說從代理到收集器)的通信進行安全加固。而對于此類場景,我們完全可以使用其他技術來實現,例如相互間使用證書來進行認證,采用istio(譯者注:istio是一個開源項目,提供統一的連接、安全、管理和監(jiān)控微服務),或其他類似的工具。
準備Keycloak
對于該演示,我們將直接在主機上通過Docker來運行Keycloak。這是為了強調Keycloak并不需要像我們的Jaeger后端那樣運行在同一個OpenShift集群之上。
下面的命令用來在主機上啟動一個合適的Keycloak服務器。如果你已經有了自己的Keycloak或Red Hat的SSO服務器的話,則完全跳過這一步驟。
- docker run --rm --name keycloak-server -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=password -p 8080:8080 jboss/keycloak
一旦Keycloak服務器啟動并運行,我們就可以創(chuàng)建一個Jaeger的域(realm)了:
1. 請使用用戶名:admin和密碼:password,登錄到Keycloak(http://<YOUR_IP>:8080/auth/admin/master/console)。
2. 在左上角Select realm中用鼠標點擊Add realm。將其命名為jaeger,然后點擊Create。
3. 在Clients上,點擊Create,將proxy-jaeger設置為名稱并保存它。
4. 設置Access Type為confidential,并用*代表Valid Redirect URIs,并保存之。您可能需要在生產環(huán)境中進行微調,否則可能會暴露出已知的“未驗證的重定向和轉發(fā)”(Unvalidated Redirects and Forwards,譯者注:源自OWASP TOP10 2010的A10)攻擊。
5. 打開Installation選項卡并選擇Keycloak OIDC JSON,然后復制其顯示的JSON。如下所示,不過auth-server-url和secret的值會有所不同。
- {
- "realm": "jaeger",
- "auth-server-url": "http://192.168.2.111:8080/auth",
- "ssl-required": "external",
- "resource": "proxy-jaeger",
- "credentials": {
- "secret": "7f201319-1dfd-43cc-9838-057dac439046"
- }
- }
最后,讓我們創(chuàng)建一個角色和用戶,使得我們能夠登錄Jaeger的查詢服務:
1. 在左下側菜單-Configure的下面,請打開Roles頁面,然后單擊Add role。
2. 將角色的名稱設置為user,并點擊Save。
3. 在左下側菜單-Manage的下面,請打開Users頁面,然后單擊Add user。
4. 按照您的設想去填寫該表格,并將Email verified設置為ON,在并點擊Save。
5. 為該用戶打開Credentials選項卡,并設置一個(臨時的或非臨時的)密碼。
6. 打開該用戶的Role mappings選項卡,從Available Roles列表中選擇角色為user,再點擊Add。
準備OpenShift
對于該演示,我們假設您已經有一個OpenShift集群正在運行了。如果還沒有的話,那么您可能需要參考minishift之類的工具了(譯者注:minishift是一個通過虛擬機來模擬OpenShift集群的工具)。如果您正在運行最新版本的Fedora、CentOS或Red Hat Enterprise Linux,您可能需要安裝包origin-clients,并運行oc cluster up --version=latest。這樣您就能有一個基本的、運行在本地的OpenShift集群。
為了方便演示,我們將添加cluster-admin的權限給developer用戶。同時我們創(chuàng)建如下的Jaeger命名空間:
- oc login -u system:admin
- oc new-project jaeger
- oc adm policy add-cluster-role-to-user cluster-admin developer -n jaeger
- oc login -u developer
準備Jaeger OpenShift模板
我們將使用Jaeger OpenShift產品模板(https://github.com/jaegertracing/jaeger-openshift/blob/master/production/jaeger-production-template.yml)作為開始:克隆整個存儲庫,或者得到本地版本的模板。
第一步是添加sidecar容器到query-deployment對象里。在containers列表下,我們指定了jaeger-query之后,就可以添加如下的sidecar代碼:
- - image: jboss/keycloak-proxy
- name: ${JAEGER_SERVICE_NAME}-query-security-proxy
- volumeMounts:
- - mountPath: /opt/jboss/conf
- name: security-proxy-configuration-volume
- ports:
- - containerPort: 8080
- protocol: TCP
- readinessProbe:
- httpGet:
- path: "/"
- port: 8080
注意:該容器將volumeMount的名稱指定為security-proxy-configuration-volume,我們將使用它來存儲代理的配置文件。您可以在spec/template/spec節(jié)點下為query-deployment指定容量,并同樣設定dnsPolicy的屬性(它應該是在前續(xù)的代碼片段中):
- volumes:
- - configMap:
- name: ${JAEGER_SERVICE_NAME}-configuration
- items:
- - key: proxy
- path: proxy.json
- name: security-proxy-configuration-volume
現在,我們需要來指定具有代理配置條目的ConfigMap。要做到這一點,我們應當給該模板添加一個新的頂層項目。在這里,我們建議您將其放置得越接近于其被使用之處越好。例如,就放在query-deployment的前面:
- - apiVersion: v1
- kind: ConfigMap
- metadata:
- name: ${JAEGER_SERVICE_NAME}-configuration
- labels:
- app: jaeger
- jaeger-infra: security-proxy-configuration
- data:
- proxy: |
- {
- "target-url": "http://localhost:16686",
- "bind-address": "0.0.0.0",
- "http-port": "8080",
- "applications": [
- {
- "base-path": "/",
- "adapter-config": {
- "realm": "jaeger",
- "auth-server-url": "${REDHAT_SSO_URL}",
- "ssl-required": "external",
- "resource": "proxy-jaeger",
- "credentials": {
- "secret": "THE-SECRET-FROM-INSTALLATION-FILE"
- }
- }
- ,
- "constraints": [
- {
- "pattern": "/*",
- "roles-allowed": [
- "user"
- ]
- }
- ]
- }
- ]
- }
請注意:我們只允許具有user角色的用戶登錄我們的Jaeger用戶界面。在真實的場景中,您可能想要調整之,以適應您自己的設置。例如,您的用戶數據可能來自LDAP,而您只想允許來自特定LDAP組的用戶去訪問Jaeger的用戶界面。
各個credentials中的secret應當與我們從本練習最開始的Keycloak中所獲得的secret相匹配。頗具好奇心的讀者您也許會注意到,我們在auth-server-url屬性下所提到了模板參數REDHAT_SSO_URL。改變您的Keycloak服務器,或是我們指定一個模板參數,都能允許我們在部署時對它進行設置。在該模板的parameters部分,我們可以添加以下屬性:
- - description: The URL to the Red Hat SSO / Keycloak server
- displayName: Red Hat SSO URL
- name: REDHAT_SSO_URL
- required: true
- value: http://THE-URL-FROM-THE-INSTALLATION-FILE:8080/auth
可見這個值應該是一個您的瀏覽器和sidecar都能訪問到的位置,就像您主機的局域網IP地址(192.x.10.x)一樣。顯然,使用Localhost/127.x是無法工作的。
作為最后一步,我們需要更改服務引導請求到端口8080(即為代理)上,而不是16686。你可以更改服務名為query-service的屬性targetPort,將其設置到8080:
- - apiVersion: v1
- kind: Service
- metadata:
- name: ${JAEGER_SERVICE_NAME}-query
- labels:
- app: jaeger
- jaeger-infra: query-service
- spec:
- ports:
- - name: jaeger-query
- port: 80
- protocol: TCP
- targetPort: 8080
- selector:
- jaeger-infra: query-pod
- type: LoadBalancer
作為參考,您可以在博客鏈接--https://github.com/jaegertracing/jaeger-openshift/blob/KeycloakSecuringUI/production/jaeger-production-template.yml里看到完整的模板文件。
部署
現在我們已經一切準備就緒了,那么就開始部署Jaeger到我們的OpenShift集群上吧。請您在前續(xù)步驟里存儲了YAML文件的相同目錄中,運行以下的命令。我們在此引用到的名稱是jaeger-production-template.yml:
- oc process -f jaeger-production-template.yml | oc create -n jaeger -f -
在開始運行的頭幾分鐘內,如果pod的jaeger-query和jaeger-collector出現失敗的話并無大礙,Cassandra(譯者注:Cassandra是一套開源分布式數據庫管理系統,用于儲存特別大的數據)仍將會完成啟動。最終,該服務也會啟動并運行,如下圖所示。
一旦準備好了接收服務,請點擊路徑(route)的URL(https://jaeger-query-jaeger.127.0.0.1.nip.io)。一個由Keycloak服務器所提供的登錄界面就會呈現在您眼前。請使用您在前續(xù)步驟中設置好的憑證進行登錄,之后您就可以順利到達Jaeger的用戶界面了。
結論
在這個練習中,我們了解到了如何為Jaeger的查詢pod添加一個sidecar作為安全代理。它讓所有的入向請求都傳遞到該sidecar,而Keycloak的所有特性,例如:雙因素認證、服務帳戶、單點登錄、暴力攻擊保護、LDAP支持、等都仍然是透明可用的。
原文標題:Protecting Jaeger UI With a Sidecar Security Proxy,作者:Juraci Paixao Kroehling
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】