Основанная на пути авторизация для микросервисов в Куберне - PullRequest
0 голосов
/ 18 февраля 2020

Мне поручено перенести AWS лямбда-микросервисы в Kubernetes. Для простоты, есть две конечные точки службы: /admin и /user, где вы можете получить или отправить запрос, чтобы что-то сделать.

Вы должны быть в группе admin (определенной во внешней аутентификации). провайдер), чтобы достичь /admin конечной точки, или иначе, вы получите 401. Вы должны быть в группе user, чтобы иметь доступ к /user конечной точке.

Я получу каждую конечную точку как работающую службу в docker контейнере. Вопрос в том, как правильно добавить маршрутизацию и авторизацию на основе пути в Kubernetes?

Например, если я go до /admin в браузере, мне нужно Kubernetes, чтобы проверить, нахожусь ли я в admin группа, а затем направить меня к admin службе; в противном случае он должен вернуть 401.

Я могу написать этот маршрутизатор самостоятельно, но я хочу проверить, есть ли для этого в Kubernetes встроенное решение.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

проверить, есть ли в Kubernetes встроенное решение

Нет, встроенного решения для сетевых политик L7 нет. Сетевые политики в Kubernetes находятся на уровне L4, поэтому такие вещи, как ограничение скорости, правила брандмауэра на основе пути и т. Д. c невозможны. Хотя вы можете посмотреть на Service Me sh, например Linkerd , Istio , или даже использовать другой плагин CNI на основе eBPF, например Cilium .

Cilium имеет CRD CiliumNetworkPolicy, который поможет вам в вашем случае использования. Вы можете установить любой прокси-сервер, например Nginx / Caddy / HAProxy, или API-шлюз, например Kong, если хотите разгрузить процесс аутентификации / авторизации. Вы можете применить следующую сетевую политику, которая будет ограничивать конечную точку /admin на любом модуле с меткой app: customapp и будет разрешать его только для модуля с меткой app: proxyapp.

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "allow-from-proxy"
specs:
  - endpointSelector:
      matchLabels:
        app: customapp
    ingress:
    - fromEndpoints:
      - matchLabels:
          app: proxyapp
      toPorts:
      - ports:
        - port: "8080"
          protocol: "TCP"
        rules:
          http:
          - method: "GET"
            path: "/admin"
0 голосов
/ 18 февраля 2020

Вы можете изучить управление трафиком istio c. Они обеспечивают маршрутизацию на основе идентификатора пользователя (https://istio.io/docs/tasks/traffic-management/request-routing/#route на основе идентификатора пользователя ). Но они делают это, находя пользователя из заголовка запроса. Если у вас есть группа администраторов, то вы не уверены, можно ли ее использовать как есть.

Пример виртуальной службы:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

Доступ к вышеуказанной службе можно получить за пределами кластера с помощью шлюза istio.

...