пятница, 23 мая 2025 г.

Ограничение доступа в контроллере ingress-nginx

Нередко возникает задача разрешить доступ к какому-либо приложению в Kubernetes кластере только для определённых подсетей. В случае с ingress-nginx (не путаем ingress-nginx и nginx-ingress) классический подход это использование аннотации nginx.ingress.kubernetes.io/whitelist-source-range

Например так

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: restricted-app
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.0.0/16,172.16.0.0/12,10.0.0.0/8
spec:
  ingressClassName: nginx
  rules:
  - host: restricted-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 3000

У этого подхода есть несколько недостатков:

  • аннотации нужно обновить в каждом приложении когда изменится список разрешённых подсетей
  • в ingress-nginx контроллере могут найти уязвимость которая позволит обойти ограничение доступа

Оба недостатка можно закрыть если сделать список доступа централизованным и механизм контроля доступа перенести на сторону файервола.

Например создать дополнительные ингресс классы "allow-all" (разрешает доступ для 0.0.0.0/0) и allow-whitelist (разрешает доступ только для определённых подсетей) и управлять доступом через указание конкретного класса.

В GKE для этого потребовалось выделить дополнительный внешний IP адрес и установить второй ingress-nginx контроллер, который будет обслуживать "allow-whitelist" класс.

Настройки ingress-nginx который облуживает классы nginx и allow-all (алиас класса nginx)

controller:
  ingressClass: nginx
  ingressClassResource:
    aliases:
    - allow-all
  service:
    loadBalancerSourceRanges: [0.0.0.0/0]

Настройки ingress-nginx-whitelist который облуживает класс allow-whitelist

controller:
  ingressClass: allow-whitelist
  ingressClassResource:
    name: allow-whitelist
    controllerValue: k8s.io/ingress-nginx-whitelist
  service:
    loadBalancerSourceRanges: [192.168.0.0/16,172.16.0.0/12,10.0.0.0/8]

Теперь при попытке соединиться к хостом который выставлен в сеть через "allow-whitelist" класс соединение будет блокироваться на уровне VPC (если использовать аннотацию, то соединение произойдёт, но будет запрос запрещён на уровне Nginx). А при обновлении списка сетей достаточно обновить параметры ingress-nginx-whitelist вместо обновления каждого приложения.

Комментариев нет:

Отправить комментарий