Citrix ADC Ingress Controller

Open Policy Agent-Unterstützung für Kubernetes mit Citrix ADC

Open Policy Agent (OPA) ist eine Open-Source-Allzweck-Richtlinien-Engine, die die Durchsetzung von Richtlinien über verschiedene Technologien und Systeme hinweg vereinheitlicht. OPA bietet eine deklarative Sprache auf hoher Ebene, mit der Sie Richtlinien als Code angeben können, und einfache APIs, um die Entscheidungsfindung von Richtlinien aus Ihrer Software auszulagern. Mit OPA können Sie politische Entscheidungen von der Durchsetzung von Richtlinien entkoppeln. Sie können OPA verwenden, um Richtlinien über Citrix ADC in einer Kubernetes-Umgebung durchzusetzen.

Mit OPA können Sie ein zentralisiertes Richtlinienentscheidungssystem für eine Umgebung erstellen, in der mehrere Citrix ADCs oder mehrere verteilte Geräte beteiligt sind. Der Vorteil dieses Ansatzes besteht darin, dass Sie Änderungen nur auf dem OPA-Server vornehmen müssen, um entscheidungsspezifische Änderungen vorzunehmen, die für mehrere Geräte gelten.

Weitere Informationen zu OPA finden Sie in der OPA-Dokumentation.

Die OPA-Integration auf Citrix ADC kann über HTTP-Callout unterstützt werden, wobei OPA mit oder ohne Authentifizierung verwendet werden kann. Ein HTTP-Callout ist eine HTTP- oder HTTPS-Anforderung, die die Citrix ADC Appliance generiert und im Rahmen der Richtlinienauswertung an eine externe Anwendung sendet.

Weitere Informationen zur Unterstützung von HTTP-Callouts finden Sie in der HTTP-Callout-Dokumentation.

Weitere Informationen zur Authentifizierungsunterstützung finden Sie in den Authentifizierungs- und Autorisierungsrichtlinien für Kubernetes mit Citrix ADC.

Das folgende Diagramm bietet einen Überblick über die Integration von OPA in die native Citrix ADC Cloud-Lösung.

OPA-Integration

Im OPA-Integrationsdiagramm repräsentiert jede Zahl die entsprechende Aufgabe in der folgenden Liste:

  1. Erstellen der erforderlichen Kubernetes-Objekte mithilfe von Kubernetes-Befehlen. Dieser Schritt sollte das Erstellen der CRD beinhalten, um den HTTP-Callout an den OPA-Server zu senden.

  2. Konfiguration von Citrix ADC. Citrix ADC wird automatisch vom Citrix ADC Ingress Controller basierend auf den erstellten Kubernetes-Objekten konfiguriert.

  3. Senden einer Benutzeranfrage nach Ressourcen vom Client. Der Benutzer wird möglicherweise authentifiziert, wenn Authentifizierungs-CRDs erstellt werden.

  4. Senden eines HTTP-Callouts an den OPA-Server im JSON-Format von Citrix ADC mit Autorisierungsparametern

  5. Senden der Autorisierungsentscheidung vom OPA-Server basierend auf den Regeln, die in REGO, der Richtliniensprache für OPA, definiert sind.

  6. Senden einer Antwort an den Client basierend auf der Autorisierungsentscheidung.

Anwendungsfälle

Beispiel 1: Erlauben oder Verweigern des Zugriffs auf Ressourcen basierend auf der IP-Adresse der Client-Quelle

Es folgt ein Beispiel für eine HTTP-Callout-Richtlinie für den OPA-Server, bei der die Rewrite-Richtlinien-CRD verwendet wird, um den Zugriff auf Ressourcen basierend auf der IP-Adresse der Clientquelle und den entsprechenden OPA-Regeln zu ermöglichen oder zu verweigern.

Im Beispiel antwortet der OPA-Server mit "result": true, wenn die IP-Adresse der Clientquelle 192.2.162.0/24 lautet, andernfalls antwortet er mit "result":false.


apiVersion: citrix.com/v1
kind: rewritepolicy
metadata:
  name: calloutexample
spec:
  responder-policies:
    - servicenames:
        - frontend
      responder-policy:
        respondwith:
          http-payload-string: '"HTTP/1.1 401 Access denied\r\n\r\n"' #Access is denied if the respose from OPA server contains false.
        respond-criteria: 'sys.http_callout("callout_name").CONTAINS("false")'
        comment: 'Invalid access'
  httpcallout_policy:
    - name: callout_name
      server_ip: "192.2.156.160" #OPA Server IP
      server_port: 8181 #OPA Server Port
      http_method: 'POST'
      host_expr: "\"192.2.156.160\""
      url_stem_expr: "\"/v1/data/example/allow\"" #URL stem expression to be used
      body_expr: '"{\"input\": {\"clientinfo\": [{\"id\": \"ci\", \"ip\": [\""+ CLIENT.IP.SRC +"\"]}]}}"' #JSON to OPA server carrying client IP
      headers:
      - name: Content-Type
        expr: '"application/json"'
      return_type: TEXT
      result_expr: "HTTP.RES.BODY(100)"

<!--NeedCopy-->

Im Folgenden sind die Regeln aufgeführt, die durch die Rego-Richtliniensprache auf dem OPA-Server für die HTTP-Callout-Richtlinie für dieses Beispiel definiert wurden:

    package example

    default allow = false                               # unless otherwise defined, allow is false

    allow = true {                                      # allow is true if...
        count(violation) != 0                           # the ip matches regex.
    }

    violation[client.id] {                              # a client is in the violation set if...
        client := input.clientinfo[_]
        regex.match("192.2.162.", client.ip[_])         # the client is not part of 192.2.162.0/24 network.
    }

Beispiel 2: Zugriff basierend auf Benutzergruppe nach Authentifizierung zulassen oder verweigern

Im Folgenden finden Sie ein Beispiel für eine HTTP-Callout-Richtlinie für den OPA-Server, die die Umschreibungsrichtlinie CRD verwendet, um den Zugriff auf Ressourcen basierend auf der Benutzergruppe nach der Authentifizierung und den entsprechenden OPA-Regeln zu ermöglichen oder zu verweigern

In diesem Beispiel antwortet der OPA-Server mit "result":true, wenn der Benutzer Teil der Gruppe beverages ist, andernfalls antwortet er mit "result":false.

Im Folgenden finden Sie die HTTP-Callout-Richtlinie für den OPA-Server über die Rewrite-Richtlinien-CRD.

apiVersion: citrix.com/v1
kind: rewritepolicy
metadata:
  name: calloutexample
spec:
  responder-policies:
    - servicenames:
        - frontend
      responder-policy:
        respondwith:
          http-payload-string: '"HTTP/1.1 401 Access denied\r\n\r\n"' #Access is denied if the respose from OPA server contains false.
        respond-criteria: 'sys.http_callout("callout_name").CONTAINS("false")'
        comment: 'Invalid access'

  httpcallout_policy:
    - name: callout_name
      server_ip: "192.2.156.160" #OPA Server IP
      server_port: 8181 #OPA Server Port
      http_method: 'POST'
      host_expr: "\"192.2.156.160\""
      url_stem_expr: "\"/v1/data/example/allow\"" #URL stem expression to be used
      body_expr: '"{\"input\": {\"users\": [{\"name\": \""+ AAA.USER.NAME +"\", \"group\": [\""+ AAA.USER.GROUPS +"\"]}]}}"' #JSON to OPA server carrying username and group information
      headers:
      - name: Content-Type
        expr: '"application/json"'
      return_type: TEXT
      result_expr: "HTTP.RES.BODY(100)"
<!--NeedCopy-->

Im Folgenden sind die Regeln aufgeführt, die durch die Sprache Rego auf dem OPA-Server für dieses Beispiel definiert wurden:

    package example

    default allow = false                               # unless otherwise defined, allow is false

    allow = true {                                      # allow is true if...
        count(isbeveragesuser) != 0                     # the user is part of beverages group.
    }

    isbeveragesuser[user.name] {                        # a user is beverages user...
        user := input.users[_]
        user.group[_] == "beverages"                    # if it is part of beverages group.
    }

Sie können die Authentifizierung mithilfe des Anforderungsheaders (401-basiert) oder über formularbasierte Benutzer durchführen.

Im Folgenden finden Sie eine Beispielauthentifizierungsrichtlinie, die die Header-basierte Authentifizierung verwendet. In dieser Richtlinie wird die lokale Authentifizierung verwendet.

apiVersion: citrix.com/v1beta1
kind: authpolicy
metadata:
  name: localauth
spec:
    servicenames:
    - frontend

    authentication_mechanism:
      using_request_header: 'ON'

    authentication_providers:

        - name: "local-auth-provider"
          basic_local_db:
              use_local_auth: 'YES'

    authentication_policies:

        - resource:
            path: []
            method: []
          provider: ["local-auth-provider"]

    authorization_policies:

        - resource:
            path: []
            method: []
            claims: []
<!--NeedCopy-->

Es folgt ein Beispiel für eine Authentifizierungsrichtlinie mit formularbasierter Authentifizierung. In dieser Richtlinie wird die lokale Authentifizierung verwendet.


apiVersion: citrix.com/v1beta1
kind: authpolicy
metadata:
  name: localauth
spec:
    servicenames:
    - frontend

    authentication_mechanism:
      using_forms:
        authentication_host: "fqdn_authenticaton_host"
        authentication_host_cert:
          tls_secret: authhost-tls-cert-secret
        vip: "192.2.156.156"

    authentication_providers:

        - name: "local-auth-provider"
          basic_local_db:
              use_local_auth: 'YES'

    authentication_policies:

        - resource:
            path: []
            method: []
          provider: ["local-auth-provider"]


    authorization_policies:

        - resource:
            path: []
            method: []
            claims: []

<!--NeedCopy-->

Beispiel 3: Zugriff basierend auf Authentifizierungsattributen erlauben oder verweigern, die während der Authentifizierung abgerufen wurden

Es folgt ein Beispiel für eine HTTP-Callout-Richtlinie für den OPA-Server, die die Rewrite-Richtlinien-CRD verwendet, um den Zugriff basierend auf Authentifizierungsattributen, die während der Authentifizierung erhalten wurden, und den entsprechenden OPA-Regeln zu

Im Beispiel antwortet der OPA-Server mit "result":true', wenn das Benutzerattribut memberof Folgendes enthält: grp1. Andernfalls antwortet er mit "result":false.

Im Folgenden finden Sie die Beispiel-HTTP-Callout-Richtlinie für den OPA-Server über die Rewrite-Richtlinien-CRD:

apiVersion: citrix.com/v1
kind: rewritepolicy
metadata:
  name: calloutexample
spec:
  responder-policies:
    - servicenames:
        - frontend
      responder-policy:
        respondwith:
          http-payload-string: '"HTTP/1.1 401 Access denied\r\n\r\n"' #Access is denied if the respose from OPA server contains false.
        respond-criteria: 'sys.http_callout("callout_name").CONTAINS("false")'
        comment: 'Invalid access'

  httpcallout_policy:
    - name: callout_name
      server_ip: "192.2.156.160" #OPA Server IP
      server_port: 8181 #OPA Server Port
      http_method: 'POST'
      host_expr: "\"192.2.156.160\""
      url_stem_expr: "\"/v1/data/example/allow\"" #URL stem expression to be used
      body_expr: '"{\"input\": {\"users\": [{\"name\": \""+ AAA.USER.NAME +"\", \"attr\": [\""+ aaa.user.attribute("memberof") +"\"]}]}}"' #JSON to OPA server carrying username and "memberof" attribute information
      headers:
      - name: Content-Type
        expr: '"application/json"'
      return_type: TEXT
      result_expr: "HTTP.RES.BODY(100)"
<!--NeedCopy-->

Im Folgenden sind die Regeln aufgeführt, die durch die Sprache Rego auf dem OPA-Server für dieses Beispiel definiert wurden:

    package example

    default allow = false                               # unless otherwise defined, allow is false

    allow = true {                                      # allow is true if...
        count(isbeveragesuser) != 0                     # the user is part of grp1.
    }

    isbeveragesuser[user.name] {                        # a user is part of allow group...
        user := input.users[_]
        regex.match("CN=grp1", user.attr[_])            # if it is part of grp1 group. }

Sie können die Authentifizierung mithilfe des Anforderungsheaders (401-basiert) oder mithilfe von Formularen durchführen. In diesem Beispiel wird die LDAP-Authentifizierung verwendet, wobei das Benutzerattribut memberof während der Authentifizierung vom LDAP-Server abgerufen wird.

Im Folgenden finden Sie eine Beispielauthentifizierungsrichtlinie, die die Header-basierte Authentifizierung verwendet.

apiVersion: citrix.com/v1beta1
kind: authpolicy
metadata:
  name: ldapauth
spec:
    servicenames:
    - frontend

    authentication_mechanism:
      using_request_header: 'ON'

    authentication_providers:
        - name: "ldap-auth-provider"
          ldap:
              server_ip: "192.2.156.160"
              base: 'dc=aaa,dc=local'
              login_name: accountname
              sub_attribute_name: CN
              server_login_credentials: ldapcredential
              attributes_to_save: memberof #memberof attribute to be obtained from LDAP server for user

    authentication_policies:
        - resource:
            path: []
            method: []
          provider: ["ldap-auth-provider"]

    authorization_policies:
        - resource:
             path: []
             method: []
             claims: []
<!--NeedCopy-->

Es folgt ein Beispiel für eine Authentifizierungsrichtlinie mit formularbasierter Authentifizierung.


apiVersion: citrix.com/v1beta1
kind: authpolicy
metadata:
  name: authhotdrinks
spec:
    servicenames:
    - frontend

    authentication_mechanism:
      using_forms:
        authentication_host: "fqdn_authenticaton_host"
        authentication_host_cert:
          tls_secret: authhost-tls-cert-secret
        vip: "192.2.156.156"

    authentication_providers:
        - name: "ldap-auth-provider"
          ldap:
              server_ip: "192.2.156.160"
              base: 'dc=aaa,dc=local'
              login_name: accountname
              sub_attribute_name: CN
              server_login_credentials: ldapcredential
              attributes_to_save: memberof #memberof attribute to be obtained from LDAP server for user

    authentication_policies:

        - resource:
            path: []
            method: []
          provider: ["ldap-auth-provider"]
<!--NeedCopy-->
Open Policy Agent-Unterstützung für Kubernetes mit Citrix ADC

In diesem Artikel