Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:OPA motorunu giriş ağ geçidiyle entegre etme

Son Güncelleme:Oct 07, 2026

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

1. Adım: OPA'yı Dağıtma

ASM örneğinize eklediğiniz kümede merkezi bir OPA yetkilendirme hizmeti dağıtın.

  1. Aşağıdaki içeriğe sahip asm-opa.yaml dosyası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-hangzhou kı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 health değerine eşittir.

    • İstek yöntemi HEAD değerine eşittir.

    • Kullanıcı adı alice değerine eşittir.

      Not

      Kullanı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), ":")
        }
    Not

    Bu örnekteki resources.limits değerleri yer tutucudur. cpu ve memory değerlerini ortamınıza uygun olacak şekilde ayarlayın.

  2. 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
  3. Devam etmeden önce OPA yetkilendirme hizmetinin kullanılabilir olduğunu onaylayın. opa Dağıtımı hazır durumda olmalı ve asm-opa Hizmeti gRPC için 9191 bağlantı noktasını, HTTP için 8181 bağ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

  1. ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneklerini seçin.

  2. Mesh Management sayfasında ASM örneğinin adına tıklayın. Sol gezinme bölmesinde ASM Gateways > Ingress Gateway seçeneklerini seçin.

  3. Ingress Gateway sayfasında, OPA ile entegre etmek istediğiniz ağ geçidini bulun ve Gateway Security seçeneğine tıklayın.

  4. Ağ geçidinin sol gezinme bölmesinde Gateway Security > External Authorization Service seçeneklerini seçin.

  5. Özel bir yetkilendirme hizmeti yapılandırın.

    1. 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.

    2. 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.

  1. / 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 OK yanı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.

  2. Geçerli kimlik bilgileri olmadan /status/201 yoluna 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 Forbidden yanıtı, istekte geçerli kimlik bilgisi bulunmadığından reddedildiğini gösterir.

  3. Geçerli kimlik bilgileriyle /status/201 yoluna 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 Created yanıtı, alice kullanıcısı için geçerli kimlik bilgisi taşıdığından isteğin izin verildiğini onaylar. Bu istek de 403 Forbidden dö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.

  1. Yalnızca bob kullanıcısının uygulamaya erişmesine izin verecek ve önceki alice kullanı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), ":")
    }'
  2. bob kullanı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 Created yanıtı, güncellenen ilke altında bob kullanıcısının uygulamaya başarıyla eriştiğini gösterir.

  3. alice kullanı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 Forbidden yanıtı, alice kullanıcısından gelen erişimin reddedildiğini gösterir.