尝试使用tls设置入口并仅在GKE上开放某些IP

时间:2019-01-15 20:04:07

标签: kubernetes google-cloud-platform containers google-kubernetes-engine kubernetes-ingress

我在设置仅对某些特定IP开放的入口时遇到麻烦,检查了文档,尝试了很多工作,并且源外的IP仍在访问。那是使用nginx的阿尔卑斯山上的Zabbix Web界面,在节点端口80上设置服务,然后使用入口在GCP上设置负载均衡器,一切正常,Web界面运行良好,但是如何使它可访问仅适用于所需的IP? 我的防火墙规则还可以,并且只能通过负载均衡器IP访问

此外,我有一个用于此部署的特定名称空间。

集群版本1.11.5-gke.5 编辑,我正在使用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

4 个答案:

答案 0 :(得分:0)

AFAIK,您不能通过GLBCGCP L7 Load Balancer itself来限制IP地址。请注意,在撰写本文时,GLBC也在进行中。

ingress.kubernetes.io/whitelist-source-range很好用,但是当您使用类似nginx ingress controller之类的东西时,因为nginx本身是can restrict IP addresses

限制/将IP地址列入白名单的一般方法是使用VPC Firewall Rules(似乎您已经在做)。本质上,您可以将IP地址限制/添加到运行K8s节点的网络的白名单中。

答案 1 :(得分:0)

实现目标的最佳选择之一是使用防火墙规则,因为您不能通过Global LB或GCP L7 LB本身来限制IP地址。但是,如果您在 Kubernetes 群集上使用 Ingress ,则可以采用另一种选择,即可以基于专用IP地址限制对应用程序的访问。

一个可能的用例是您具有开发设置,并且不想让所有人都可以使用所有精美的新功能,尤其是竞争对手。在这种情况下,可以使用 IP白名单 来限制访问。

这可以通过通过ingress.kubernetes.io/whitelist-source-range注释指定允许的客户端IP源范围来完成。

该值为逗号分隔的CIDR块列表。

例如:

10.0.0.0/24, 1.1.1.1/32.

请获取更多信息here

答案 2 :(得分:0)

对于像我一样通过Google偶然发现此问题的任何人,现在都有解决方案。您可以通过BackendConfig Kubernetes API中的cloud.google.com结合GCE CloudArmor策略来实现。

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

答案 3 :(得分:0)

您可以通过configuring Ingress and Cloud Armour将IP列入白名单:

切换到项目:

gcloud config set project $PROJECT

创建策略:

gcloud compute security-policies create $POLICY_NAME --description "whitelisting"

将默认策略更改为拒绝:

gcloud compute security-policies rules update 2147483647 --action=deny-403 \ 
  --security-policy $POLICY_NAME

要以比默认白名单低的优先级将要白名单的所有IP:

gcloud compute security-policies rules create 2 \
  --action allow \
  --security-policy $POLICY_NAME \
  --description "allow friends" \
  --src-ip-ranges "93.184.17.0/24,151.101.1.69/32"

每个范围最多十个。

请注意,您需要有效的CIDR范围,为此您可以使用CIDR to IP Range -> IP Range to CIDR

按以下方式查看策略:

gcloud compute security-policies describe $POLICY_NAME

要丢弃条目:

gcloud compute security-policies rules delete $PRIORITY --security-policy $POLICY_NAME

或完整的政策:

gcloud compute security-policies delete $POLICY_NAME

为此策略创建一个BackendConfig

# File backendconfig.yaml:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  namespace: <namespace>
  name: <name>
spec:
  securityPolicy:
    name: $POLICY_NAME

$ kubectl apply -f backendconfig.yaml
backendconfig.cloud.google.com/backendconfig-name created

将BackendConfig添加到Service

metadata:
  namespace: <namespace>
  name: <service-name>
  labels:
    app: my-app
  annotations:
    cloud.google.com/backend-config: '{"ports": {"80":"backendconfig-name"}}'
spec:
  type: NodePort
  selector:
    app: hello-app
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080

使用正确的选择器,并将服务的接收端口指向之前创建的BackendConfig。

现在,Cloud Armor会将策略添加到GKE服务中。

https://console.cloud.google.com/net-security/securitypolicies中可见(选择$PROJECT后)。