Нередко возникает задача разрешить доступ к какому-либо приложению в 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 вместо обновления каждого приложения.
Комментариев нет:
Отправить комментарий