新聞中心
如何將Emissary Ingress與OPA集成
譯文
作者: 李睿 2022-08-19 08:00:00
云計算
云原生 本文將介紹如何將Emissary Ingress與OPA集成以進行外部授權(quán)。

創(chuàng)新互聯(lián)作為成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,有關(guān)企業(yè)網(wǎng)站建設(shè)方案、改版、費用等問題,行業(yè)涉及柔性防護網(wǎng)等多個領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認可。
?譯者 | 李睿
審校 | 孫淑娟
API網(wǎng)關(guān)在公開微服務(wù)時,起著至關(guān)重要的作用。它們是網(wǎng)絡(luò)中的一個附加躍點,傳入請求必須通過該躍點才能與服務(wù)通信。API網(wǎng)關(guān)在收到來自客戶端的請求之后會執(zhí)行路由、組合、協(xié)議轉(zhuǎn)換和用戶策略實施,然后將其反向代理到適當?shù)牡讓覣PI。由于API網(wǎng)關(guān)能夠執(zhí)行上述任務(wù),它們還可以配置為將傳入的客戶端請求發(fā)送到外部第三方授權(quán)(authz)服務(wù)器。然后,傳入請求的命運取決于這一外部身份驗證服務(wù)器對網(wǎng)關(guān)的響應(yīng)。這正是開放策略代理(OPA)發(fā)揮作用的地方。
有許多開源的Kubernetes原生API網(wǎng)關(guān),例如Contour、Kong Gateway、Traefik、Gloo等。以下深入了解一下Emissary Ingress。
什么是Emissary Ingress?
Emissary Ingress早期被稱為Ambassar API網(wǎng)關(guān);它是一個開源的Kubernetes原生API網(wǎng)關(guān),目前是云原生應(yīng)用計算基金會(CNCF)孵化項目。與許多其他Kubernetes網(wǎng)關(guān)一樣,Emissary也被構(gòu)建為與Envoy代理一起使用。它部署為完整的無狀態(tài)架構(gòu),并支持多個插件,例如傳統(tǒng)的SSO身份驗證協(xié)議(例如OAuth、OpenIDConnect)、速率限制、日志記錄和跟蹤服務(wù)。Emissary在AuthService資源中利用其ExtAuth協(xié)議來配置傳入請求的身份驗證和授權(quán)。ExtAuth支持兩種協(xié)議:gRPC和HTTP。對于gRPC接口,外部服務(wù)必須實現(xiàn)Envoy的external_auth.proto。
OPA
Open Policy Agent(OPA)是一個眾所周知的通用策略引擎,并已成為跨堆棧的策略執(zhí)行器,無論是API網(wǎng)關(guān)、服務(wù)網(wǎng)格、Kubernetes、微服務(wù)、CI/CD還是IAC。OPA將決策制定與策略執(zhí)行分離,這樣每當軟件需要對傳入請求做出決定時,它都會查詢OPA。OPA-Envoy使用實現(xiàn)Envoy外部授權(quán)API的gRPC服務(wù)器擴展OPA,從而使其自身與Emissary的外部authz服務(wù)器兼容。
將Emissary Ingress與OPA集成
上圖展示了Emissary和OPA集成的高層架構(gòu)。當來自客戶端的傳入請求到達Emissary時,它會向OPA發(fā)送授權(quán)請求,其中包含輸入JSON。OPA根據(jù)提供給它的Rego策略評估這個JSON并響應(yīng)Emissary;如果來自O(shè)PA的這個結(jié)果JSON允許為真,那么只有客戶端請求被進一步路由到API,否則請求被Emissary拒絕并且永遠不會到達API。將安裝Emissary Ingress并將其與OPA集成以進行外部授權(quán)。
(1)入門
首先,需要啟動一個Minikube集群。如果沒有Minikube,可以從這里安裝它。
minikube start
通過Helm將Emissary Ingress安裝到minikube。
# Add the Repo:
helm repo add datawire https://app.getambassador.io
helm repo update
# Create Namespace and Install:
kubectl create namespace emissary && \
kubectl apply -f https://app.getambassador.io/yaml/emissary/2.2.2/emissary-crds.yaml
kubectl wait --timeout=90s --for=condition=available deployment emissary-apiext -n emissary-system
helm install emissary-ingress --namespace emissary datawire/emissary-ingress && \
kubectl -n emissary wait --for condition=available --timeout=90s deploy -lapp.kubernetes.io/instance=emissary-ingress
或者參考Emissary Ingress文檔通過Kubernetes YAMLs安裝它。
(2)為演示應(yīng)用程序配置路由
不同的網(wǎng)關(guān)有自己的一組用于公開服務(wù)的配置。在Emissary中,需要通過映射和偵聽器配置路由。
映射資源只是告訴Emissary將傳入請求重定向到哪個服務(wù)。它像Ingress一樣高度可配置。將創(chuàng)建一個簡單的映射資源,它將所有傳入請求重定向到演示應(yīng)用程序的服務(wù),即demo-svc。
cat <apiVersion: getambassador.io/v3alpha1
kind: Mapping
metadata:
name: demo-app-mapping
spec:
hostname: "*"
prefix: /
service: demo-svc
EOF
偵聽器資源指示Emissary在網(wǎng)絡(luò)上偵聽傳入請求。在這里,將創(chuàng)建一個偵聽器來偵聽端口8080和HTTP協(xié)議,并與所有命名空間中的主機關(guān)聯(lián)。
cat <apiVersion: getambassador.io/v3alpha1
kind: Listener
metadata:
name: demo-app-listener-8080
namespace: emissary
spec:
port: 8080
protocol: HTTP
securityModel: XFP
hostBinding:
namespace:
from: ALL
EOF
(3)安裝echo應(yīng)用程序
安裝一個簡單的echo服務(wù)器作為演示應(yīng)用程序。
cat <apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 1
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: http-svc
image: gcr.io/google_containers/echoserver:1.8
ports:
- containerPort: 8080
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
---
apiVersion: v1
kind: Service
metadata:
name: demo-svc
labels:
app: demo-app
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo-app
EOF
通過不同的路徑與演示應(yīng)用程序通信。
minikube service emissary-ingress -n emissary
注意:上述公開方法可能不適用于macOS用戶。他們可以使用一個忙框,并將其配置為命中Emissary本地端點。
使用目標端口80復(fù)制專用URL。URL必須為IP 192.168.49.2,后跟一個節(jié)點端口,如http://192.168.49.2:30329。將NodePort值導(dǎo)出為$NodePort環(huán)境變量,并將curl導(dǎo)出為路徑處的值,如下所示:
curl http://192.168.49.2:$NODEPORT/public
curl http://192.168.49.2:$NODEPORT/secured
OPA尚未添加到設(shè)置中,并且上述curl請求直接發(fā)送到API,而無需任何策略強制。
(4)如何安裝和配置OPA?
OPA將通過configmap讀取提供給它的策略。創(chuàng)建以下configmap,其中包含一個策略,該策略只允許通過GET方法接收所有傳入請求。
cat <apiVersion: v1
kind: ConfigMap
metadata:
name: demo-policy
data:
policy.rego: |-
package envoy.authz
default allow = false
allow {
input.attributes.request.http.method == "GET"
}
EOF
通過將OPA部署為獨立部署或作為emissary-ingress的sidecar,可以將OPA配置為外部授權(quán)服務(wù)器。在這里,將其添加為sidecar。將以下YAML保存為opa-patch.yaml。
spec:
template:
spec:
containers:
- name: opa
image: openpolicyagent/opa:latest-envoy
ports:
- containerPort: 9191
args:
- "run"
- "--server"
- "--addr=0.0.0.0:8181"
- "--set=plugins.envoy_ext_authz_grpc.addr=0.0.0.0:9191"
- "--set=plugins.envoy_ext_authz_grpc.query=data.envoy.authz.allow"
- "--set=decision_logs.console=true"
- "--ignore=.*"
- "/policy/policy.rego"
volumeMounts:
- mountPath: /policy
name: demo-policy
readOnly: true
volumes:
- name: demo-policy
configMap:
name: demo-policy
修補 emissary-ingress 部署并等待所有 emissary-ingress pod 重新啟動。
kubectl patch deployment emissary-ingress -n emissary --patch-file opa-patch.yaml
等到所有的emissary-ingresspod進入帶有OPA sidecar的運行狀態(tài)。
創(chuàng)建以下AuthService。AuthService是一種資源,它配置Emissary與外部服務(wù)進行通信,以獲取傳入請求的Authn和Authz。將其配置為與localhost上的OPA通信,因為OPA被部署為sidecar。
cat <apiVersion: getambassador.io/v3alpha1
kind: AuthService
metadata:
name: opa-ext-authservice
namespace: emissary
labels:
product: aes
app: opa-ext-auth
spec:
proto: grpc
auth_service: localhost:9191
timeout_ms: 5000
tls: "false"
allow_request_body: true
protocol_version: v2
include_body:
max_bytes: 8192
allow_partial: true
status_on_error:
code: 504
failure_mode_allow: false
EOF
現(xiàn)在嘗試curl;由于該策略接受來自GET方法的請求并且對路徑?jīng)]有限制,因此兩個請求都將獲得200個OK響應(yīng)。
curl -i http://192.168.49.2:$NODEPORT/public
curl -i http://192.168.49.2:$NODEPORT/private
現(xiàn)在編輯策略以僅接受來自路徑 /public 的傳入請求,而對任何其他路徑的請求都將被拒絕。
cat <apiVersion: v1
kind: ConfigMap
metadata:
name: demo-policy
data:
policy.rego: |-
package envoy.authz
default allow = false
allow {
input.attributes.request.http.method == "GET"
input.attributes.request.http.path == "/public"
}
EOF
現(xiàn)在重新啟動使者入口部署以使策略更改生效。
kubectl rollout restart deployment emissary-ingress -n emissary
等到所有的Emissary-Ingresspod在重啟后進入Running狀態(tài)。
現(xiàn)在在路徑/public處執(zhí)行curl請求;它將被接受,但在路徑/privat,e它將被OPA拒絕并返回403響應(yīng),因此請求不會到達演示API。
curl-ihttp://192.168.49.2:$NODEPORT/public
curl-ihttp://192.168.49.2:$NODEPORT/private
關(guān)于從客戶端到公開API的傳入請求的決策可以解耦到OPA作為Emissary Ingress設(shè)置中的外部授權(quán)服務(wù)器。OPA可以作為即插即用策略執(zhí)行器添加到Emissary和任何其他支持Envoy外部授權(quán)API的網(wǎng)關(guān)。
原文標題:??How Do You Integrate Emissary Ingress With OPA???,作者:Tayyab Jamadar?
分享標題:如何將Emissary?Ingress與OPA集成
網(wǎng)站路徑:http://www.dlmjj.cn/article/ccegpjs.html


咨詢
建站咨詢
