Dinamik erişim kontrolü gerektiğinde, bir giriş ağ geçidine Open Policy Agent (OPA) motoru entegre edebilirsiniz. Bu sayede kullanıcı kimliklerine veya istek içeriğine dayalı olarak yetkilendirme ilkelerini özelleştirir ve hizmetler arasındaki iletişimi gerçek zamanlı olarak denetlersiniz. Bu yaklaşım, yetkisiz erişimi etkili bir şekilde önler, veri ihlali risklerini azaltır ve Service Mesh (ASM) örneğindeki uygulamaların güvenliğini artırır. Bu konuda, bir giriş ağ geçidinin aldığı isteklerin OPA motoru kullanılarak nasıl kimlik doğrulamasının yapılacağı ve yetkilendirileceği açıklanmaktadır. Bu örnekte, istekler giriş ağ geçidi üzerinden HTTPBin uygulamasına erişmek için yönlendirilir.
Önkoşullar
Sürümü 1.15.3.25 veya üzeri olan bir ASM örneğine yönetilen bir Kubernetes kümesi eklenmiş olmalıdır. Talimatlar için bkz. Bir kümeyi ASM örneğine ekleme ve ASM örneğini yükseltme.
httpbin uygulaması dağıtılmış ve bir ASM giriş ağ geçidi üzerinden erişilebilir durumda olmalıdır. Bu eğitimdeki test komutları, söz konusu ağ geçidinin IP adresini temsil eden
${ASM_GATEWAY_IP}değişkenine istek gönderir. Talimatlar için bkz. httpbin uygulamasını dağıtma.defaultad alanı için otomatik sidecar enjeksiyonu etkinleştirilmiş olmalıdır. Talimatlar için bkz. Sidecar enjeksiyon ilkesi yapılandırma.
1. Adım: OPA'yı Dağıtma
ASM örneğinize eklediğiniz kümede merkezi bir OPA yetkilendirme hizmeti dağıtın.
-
Aşağıdaki içeriğe sahip
asm-opa.yamldosyasını oluşturun. Bu YAML dosyası bir OPA Hizmeti, bir OPA Dağıtımı ve bir Secret kaynağı dağıtır.Dosyayı dağıtmadan önce, görüntü adındaki
cn-hangzhoukısmını kümenizin bulunduğu bölgeyle değiştirin:registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static.Dağıtımdaki OPA motoru, hata ayıklamayı kolaylaştırmak amacıyla varsayılan olarak günlük kaydını etkinleştirir (
--set=decision_logs.console=true).Secret kaynağı, aşağıdaki durumlardan herhangi biri geçerli olduğunda isteğe izin veren OPA ilkesini tanımlar:
İstek yolu
healthdeğerine eşittir.İstek yöntemi
HEADdeğerine eşittir.-
Kullanıcı adı
alicedeğerine eşittir.NotKullanıcı adı, istekteki
Authorizationüstbilgisinden alınır. Format şöyledir:Authorization: Basic ${kullanıcıadı:şifre dizesinin Base64 kodlaması}.
asm-opa.yaml
apiVersion: v1 kind: Service metadata: name: asm-opa labels: app: opa spec: ports: - name: grpc port: 9191 targetPort: 9191 protocol: TCP - name: http port: 8181 targetPort: 8181 protocol: TCP selector: app: opa --- kind: Deployment apiVersion: apps/v1 metadata: name: opa labels: app: opa spec: replicas: 1 selector: matchLabels: app: opa template: metadata: labels: app: opa annotations: sidecar.istio.io/inject: "false" spec: containers: - name: opa image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static securityContext: runAsUser: 1111 volumeMounts: - readOnly: true mountPath: /policy name: opa-policy args: - "run" - "--server" - "--addr=0.0.0.0:8181" - "--diagnostic-addr=0.0.0.0:8282" - "--set=plugins.envoy_ext_authz_grpc.addr=:9191" - "--set=plugins.envoy_ext_authz_grpc.path=asm/authz/allow" - "--set=decision_logs.console=true" - "--ignore=.*" - "/policy/policy.rego" ports: - containerPort: 9191 protocol: TCP resources: limits: cpu: "0" memory: "0" volumes: - name: opa-policy secret: secretName: opa-policy --- apiVersion: v1 kind: Secret metadata: name: opa-policy type: Opaque stringData: policy.rego: | package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "alice" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }NotBu örnekteki
resources.limitsdeğerleri yer tutucudur.cpuvememorydeğerlerini ortamınıza uygun olacak şekilde ayarlayın. -
Container Service for Kubernetes (ACK) kümesinin kubeconfig dosyasını kullanarak OPA'yı dağıtmak için aşağıdaki komutu çalıştırın.
kubectl apply -f asm-opa.yaml Devam etmeden önce OPA yetkilendirme hizmetinin kullanılabilir olduğunu onaylayın.
opaDağıtımı hazır durumda olmalı veasm-opaHizmeti gRPC için9191bağlantı noktasını, HTTP için8181bağlantı noktasını açmalıdır.
2. Adım: Giriş ağ geçidinin harici yetkilendirme özelliğini kullanarak OPA motorunu giriş ağ geçidiyle entegre etme
ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde seçeneklerini seçin.
Mesh Management sayfasında ASM örneğinin adına tıklayın. Sol gezinme bölmesinde seçeneklerini seçin.
Ingress Gateway sayfasında, OPA ile entegre etmek istediğiniz ağ geçidini bulun ve Gateway Security seçeneğine tıklayın.
Ağ geçidinin sol gezinme bölmesinde seçeneklerini seçin.
-
Özel bir yetkilendirme hizmeti yapılandırın.
-
Custom Authorization Service Configuration sihirbazında, OPA'yı ağ geçidi için özel yetkilendirme hizmeti olarak yapılandırın ve ardından Next düğmesine tıklayın.
Enable Gateway Custom Authorization Service anahtarını açın, Custom authorization service based on envoy.ext_authz (HTTP or gRPC) sekmesini seçin, Protocol değerini GRPC, service address değerini
asm-opa.default.svc.cluster.local, service port değerini 9191 ve timeout değerini 10 saniye olarak ayarlayın. -
Matching Rules sihirbazında, hangi isteklerin OPA yetkilendirmesi gerektirdiğini belirtmek için eşleşme kurallarını yapılandırın ve ardından Submit düğmesine tıklayın.
Matching Mode değerini Selected requests must be authorized olarak ayarlayın, Custom matching rules seçeneğini belirleyin, HTTP Path (Path) anahtarını açın ve
/status/*değerini girin.Gateway Custom Authorization Service was created successfully mesajı görünür ve oluşturulan yerel Istio kaynakları listelenir: bir ASMExtensionProvider (kaynak adı:
grpcextauth-asmsecuritypolicy-ingressgateway-extauthz) ve bir AuthorizationPolicy (kaynak adı:ingressgateway-extauthz-ap-wg-gateway-istio-system-gateway-ingressgateway). Kaynak yapılandırmasını görüntülemek için View YAML seçeneğine veya yetkilendirme hizmetini değiştirmek için Edit seçeneğine tıklayabilirsiniz.
-
3. Adım: httpbin Erişimini Test Etme
Aşağıdaki komutlarda ${ASM_GATEWAY_IP} , httpbin'i açığa çıkaran ASM giriş ağ geçidinin IP adresidir. Her komut, yalnızca yanıt üstbilgilerini döndürmek için -I ve GET yöntemini zorlamak için -X GET parametresini kullanır; çünkü OPA ilkesi her türlü HEAD isteğine izin verir. Bu testler, OPA ilkesinin kullanıcı adı kuralını sınar.
-
/yoluna erişmek için aşağıdaki komutu çalıştırın.curl ${ASM_GATEWAY_IP}/ -I -X GET
HTTP/1.1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2
200 OKyanıtı, isteğin izin verildiğini gösterir./yolu, 2. Adımda yapılandırdığınız/status/*eşleşme kuralıyla eşleşmez; bu nedenle istek yetkilendirme için OPA'ya gönderilmez. -
Geçerli kimlik bilgileri olmadan
/status/201yoluna erişmek için aşağıdaki komutu çalıştırın.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1
403 Forbiddenyanıtı, istekte geçerli kimlik bilgisi bulunmadığından reddedildiğini gösterir. -
Geçerli kimlik bilgileriyle
/status/201yoluna erişmek için aşağıdaki komutu çalıştırın.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3
201 Createdyanıtı,alicekullanıcısı için geçerli kimlik bilgisi taşıdığından isteğin izin verildiğini onaylar. Bu istek de403 Forbiddendöndürürse, 1. Adımdaki OPA dağıtımını ve 2. Adımdaki ASM güvenlik ilkesi yapılandırmasını gözden geçirin.
4. Adım: OPA İlkesini Güncelleme ve Erişimi Yeniden Test Etme
OPA ilkesini çalışma zamanında güncellemek için OPA motorunun HTTP API'sini çağırın. 1. Adımda oluşturduğunuz opa-policy Secret kaynağı değiştirilmez ve orijinal ilkeyi içermeye devam eder.
-
Yalnızca
bobkullanıcısının uygulamaya erişmesine izin verecek ve öncekialicekullanıcısını reddedecek şekilde ilkeyi güncellemek için aşağıdaki komutu çalıştırın.kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }' -
bobkullanıcısı olarak httpbin'e erişmek için aşağıdaki komutu çalıştırın.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user bob:testpassword
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3
201 Createdyanıtı, güncellenen ilke altındabobkullanıcısının uygulamaya başarıyla eriştiğini gösterir. -
alicekullanıcısı olarak httpbin'e erişmek için aşağıdaki komutu çalıştırın.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1
403 Forbiddenyanıtı,alicekullanıcısından gelen erişimin reddedildiğini gösterir.