Попытка настроить вход с tls и открыть для некоторых IP только на GKE - PullRequest
0 голосов
/ 15 января 2019

У меня проблемы с настройкой входа, открытого только для некоторых определенных IP-адресов, проверил документы, перепробовал много вещей и IP-адрес из источника продолжают получать доступ.это веб-интерфейс Zabbix на alpine с nginx, настройте службу на node-port 80, затем используйте вход для настройки loadbalancer на GCP, все работает, веб-интерфейс работает нормально, но как я могу сделать его доступнымтолько для желаемых IP-адресов?мои правила брандмауэра в порядке, и он доступен только через IP балансировщика нагрузки

Кроме того, у меня есть определенное пространство имен для этого развертывания.

Кластерная версия 1.11.5-gke.5 РЕДАКТИРОВАТЬ i 'используя стандартный вход GKE GLBC

Мой шаблон настроен следующим образом, может кто-нибудь помочь мне объяснить, чего не хватает:

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: zabbix-web
      namespace: zabbix-prod
      labels:
        app: zabbix
        tier: frontend
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            name: zabbix-web
            app: zabbix
        spec:
          volumes:
          - name: cloudsql-instance-credentials
            secret:
              defaultMode: 420
              secretName: cloudsql-instance-credentials
          containers:
            - command:
              - /cloud_sql_proxy
              - -instances=<conection>
              - -credential_file=/secrets/cloudsql/credentials.json
              image: gcr.io/cloudsql-docker/gce-proxy:1.11
              imagePullPolicy: IfNotPresent
              name: cloudsql-proxy
              resources: {}
              securityContext:
                allowPrivilegeEscalation: false
                runAsUser: 2
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
              - mountPath: /secrets/cloudsql
                name: credentials
                readOnly: true
            - name: zabbix-web
              image: zabbix/zabbix-web-nginx-mysql:alpine-3.2-latest
              ports:
              - containerPort: 80
              env:
              - name: MYSQL_USER
                valueFrom:
                  secretKeyRef:
                    key: <user>
                    name: <user>
              - name: MYSQL_PASSWORD
                valueFrom:
                  secretKeyRef:
                    key: <pass>
                    name: <pass>
              - name: DB_SERVER_HOST
                value: 127.0.0.1
              - name: MYSQL_DATABASE
                value: <db>
              - name: ZBX_SERVER_HOST
                value: <db>
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /index.php
                port: 80
                scheme: HTTP
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  name: "zabbix-web-service"
  namespace: "zabbix-prod"
  labels:
    app: zabbix
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    name: "zabbix-web"
  type: "NodePort"
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: zabbix-web-ingress
  namespace: zabbix-prod
  annotations:
    ingress.kubernetes.io/service.spec.externalTrafficPolicy: local
    ingress.kubernetes.io/whitelist-source-range: <xxx.xxx.xxx.xxx/32>
spec:
  tls:
  - secretName: <tls-cert>
  backend:
    serviceName: zabbix-web-service
    servicePort: 80

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Один из лучших вариантов для достижения вашей цели - использование правил брандмауэра, поскольку вы не можете ограничивать IP-адреса через глобальный LB или сам GCP L7 LB. Однако, если вы используете Ingress в своем кластере Kubernetes , вы можете ограничить доступ к вашему приложению на основе выделенных IP-адресов.

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

Это можно сделать, указав допустимые диапазоны IP-адресов клиентов через аннотацию ingress.kubernetes.io/whitelist-source-range.

Значение представляет собой разделенный запятыми список блока CIDR.

Например:

10.0.0.0/24, 1.1.1.1/32.

Пожалуйста, получите больше информации здесь .

0 голосов
/ 22 мая 2019

Для тех, кто наткнулся на этот вопрос через Google, как я, теперь есть решение. Вы можете реализовать это через BackendConfig из cloud.google.com Kubernetes API в сочетании с политикой GCE CloudArmor.

https://cloud.google.com/kubernetes-engine/docs/how-to/cloud-armor-backendconfig

0 голосов
/ 16 января 2019

AFAIK, вы не можете ограничивать IP-адреса с помощью GLBC или на GCP L7 Load Balancer . Обратите внимание, что GLBC также находится в стадии разработки на момент написания этой статьи.

ingress.kubernetes.io/whitelist-source-range прекрасно работает, но когда вы используете что-то вроде входного контроллера nginx , потому что сам nginx может ограничивать IP-адреса .

Общий способ ограничения / белого IP-адреса - это использование Правила брандмауэра VPC (что, похоже, уже выполняется). По сути, вы можете ограничить / занести белый список IP-адресов в сеть, в которой работают ваши узлы K8.

...