Kuberenetes Ingress - конкретные API-интерфейсы из белого списка - PullRequest
0 голосов
/ 23 октября 2019

У нас есть целый ряд микросервисов, обслуживаемых через единую службу API-шлюза в Кубернетес, с возможностью пересылки на тот же сервер, который выглядит следующим образом ->

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: beta-https
  namespace: beta
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
    - hosts:
      - beta.xyz.com
      secretName: beta-secret
  rules:
  - host: beta.xyz.com
    http:
      paths:
      - path: /api/(.*)
        backend:
          serviceName: api-svc
          servicePort: 8443

Теперь у нас естьновое требование, в котором подмножество apis - / api / secure должно быть ограничено IP. Любые идеи о том, как этого добиться?

Я предполагаю, что я могу использовать nginx.ingress.kubernetes.io/whitelist-source-range в новой конфигурации для перенаправления трафика в / api / secure, но как я могу убедиться, что вышеупомянутая конфигурация не сервер / api/ безопасно?

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Из того, что я вижу, вы пытаетесь создать два отдельных пути, где /api/secure будет доступно только для определенных IP-адресов.

Я повторил вашу проблему, провел несколько тестов и нашел решение.

При создании двух входящих объектов, подобных вашему, которые отличаются по полю path, например, у одного есть path: /api/(.*), а у второго * path: /api/secure

nginx сгенерирует следующую конфигурацию (вывод сокращен):

server {имя_сервера beta.xyz.com;

  listen 80  ;
  listen 443  ssl http2 ;

      ...

  location ~* "^/api/secure" {
      ...
  }

  location ~* "^/api/(.*)" {
      ...
  }

и в документации nginx вы можете прочитать:

Чтобы найти подходящее местоположениеПо заданному запросу nginx сначала проверяет местоположения, определенные с помощью префиксных строк (префиксные местоположения). Среди них location with the longest matching prefix is selected and remembered. Затем проверяются регулярные выражения в порядке их появления в файле конфигурации. Поиск регулярных выражений прекращается при первом совпадении, и используется соответствующая конфигурация.

значение: NGINX всегда выполняет запросы, используя самое конкретное совпадение

На основе этой информации создаетсяДва отдельных входа, как вы упомянули, должны решить вашу проблему, потому что /api/secure всегда будет более конкретным путем, чем /api/(.*).

Дайте мне знать, помогло ли это.

0 голосов
/ 23 октября 2019

так что для кого-то, желающего сделать что-то подобное, я смог заставить это работать с помощью nginx.ingress.kubernetes.io/server-snippet, чтобы добавить фрагмент и заблокировать трафик

      location ~ "^/api/secure/(.*)" {
        deny all;
        return 403;
      }
...