Istio OAuth2 с Keycloak

Я использую Istio в качестве шлюза API и Service Mesh. Планируется, что поток аутентификации и авторизации (oauth2) будет управляться шлюзом Ingress Envoy Gateway в Istio. Однако использование фильтров Envoy не перенаправляет запрос URL-адреса на страницу входа, как ожидалось (приведенный ниже пример можно найти в здесь, и вход в систему не происходит. Если я попытаюсь подключиться с помощью curl (аутентифицироваться, использовать полученный токен для получения авторизации), он будет работать нормально. Но при включении Поток Oauth 2, он зависает. Эта авторизация выполняется с помощью Keycloak.

Это используемый фильтр Lua:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: authn-filter
  namespace: istio-test
spec:
  filters:
  - filterConfig:
      inlineCode: |
        function login (request_handle)
          request_handle:logInfo("logging in")
          local request_url = "http://"..request_handle:headers():get(":authority")..request_handle:headers():get(":path")
          request_handle:logInfo(request_url)
          headers, body = request_handle:httpCall(
            "outbound|3000||service-gatekeeper.istio-test.svc.cluster.local",
            {
              [":method"] = "POST",
              [":path"] = "/oauth/authorize",
              [":authority"] = request_handle:headers():get(":authority"),
              ["X-Auth-Request-Redirect"] = request_url
            },
            nil,
            5000)
          return headers, body
        end
        function envoy_on_request(request_handle)
          local path = request_handle:headers():get(":path")
          -- ignore metrics, liveness probe requests
          request_handle:logInfo("Envoy on Request")
          if path == "/" then
            return
          end
          token = request_handle:headers():get("Authorization")
          cookie = request_handle:headers():get("Cookie")
          if token == nil and cookie == nil then
             request_handle:logInfo("about to login")
             headers, body = login(request_handle)
             request_handle:respond(headers,body)
          end
          request_handle:logInfo("validating token against Certs")
          local headers, body = request_handle:httpCall(
            "outbound|8080||eseabyr-oauth2-proxy-innulic-test.svc.cluster.local",
            {
              [":method"] = "GET",
              [":path"] = "/oauth/authorize",
              [":authority"] = request_handle:headers():get(":authority"),
              ["Authorization"] = token,
              ["Cookie"] = cookie
            },
            nil,
            5000)
          local status
          for header, value in pairs(headers) do
            if header == ":status" then
               status = value
            end
          end

          request_handle:logInfo("token validation status:"..status)
          if status == "401" then
            headers, body = login(request_handle)
            request_handle:respond(headers,body)
          end
        end
        -- Called on the response path.
        function envoy_on_response(response_handle)
            local headers = response_handle:headers()
            headers:add("X-Envoy-Ingress", os.getenv("HOSTNAME"))
        end
    filterName: envoy.lua
    filterType: HTTP
    listenerMatch:
      listenerType: GATEWAY

Спасибо.


person Julia Bel    schedule 14.03.2019    source источник
comment
Вы приблизились к решению этого вопроса?   -  person xeor    schedule 24.03.2019
comment
К сожалению нет :(   -  person Julia Bel    schedule 25.03.2019


Ответы (1)


Поскольку у меня нет полной информации о вашей среде, я могу предложить следующее в качестве способа отладки проблемы:

  1. Я вижу, что у вас нет workloadLabels, что означает, что этот фильтр должен быть прикреплен ко всем модулям в вашей сетке.
  2. Убедитесь, что контейнеры istio init внедряются в ваши поды (с помощью istioctl или контроллеров доступа k8s).
  3. Проверьте журналы дополнительного прокси-сервера, прикрепленного к интересующему вас модулю. Я предполагаю, что есть какая-то синтаксическая ошибка, которая полностью отключит фильтр. В противном случае он должен сообщить вам, что не так с фильтром.
person Suman Ganta    schedule 07.05.2019