【问题标题】:Kuberenetes Ingress - Whitelist particular APIsKubernetes Ingress - 将特定 API 列入白名单
【发布时间】:2019-10-23 08:42:15
【问题描述】:

在 Kubernetes 中,我们有许多微服务都通过单个 api-gateway 服务提供服务,并有一个入口转发到相同的服务,如下所示 ->

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

现在我们有一个新要求,其中 api 的一个子集 - /api/secure 必须是 IP 限制的。关于如何实现这一点的任何想法?

我假设我可以在新配置中使用 nginx.ingress.kubernetes.io/whitelist-source-range 将流量转发到 /api/secure,但是如何确保上述配置不服务于 /api/secure?

【问题讨论】:

    标签: kubernetes-ingress whitelist


    【解决方案1】:

    所以对于想要做类似事情的人来说,我可以通过使用 nginx.ingress.kubernetes.io/server-snippet 添加一个 sn-p 并阻止流量来完成这项工作

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

    【讨论】:

      【解决方案2】:

      据我所知,您正在尝试创建两个单独的路径,其中 /api/secure 只能用于特定的 IP 地址。

      我已经复制了您的问题,进行了一些测试并找到了解决方案。

      当创建两个像你这样的入口对象时,它们在 path 字段上有所不同,例如 一个有path: /api/(.*),第二个有path: /api/secure

      nginx会生成如下配置(输出缩短):

      服务器{ server_name beta.xyz.com ;

        listen 80  ;
        listen 443  ssl http2 ;
      
            ...
      
        location ~* "^/api/secure" {
            ...
        }
      
        location ~* "^/api/(.*)" {
            ...
        }
      

      您可以在nginx documentation 阅读:

      为了找到匹配给定请求的位置,nginx首先检查位置 使用前缀字符串(前缀位置)定义。其中,location with the longest matching prefix is selected and remembered。然后是正则表达式 按照它们在配置文件中出现的顺序进行检查。的搜索 正则表达式在第一次匹配时终止,并使用相应的配置。

      含义:NGINX 总是使用最具体的匹配来满足请求

      根据这些信息,创建两个单独的入口,就像您提到的那样, 应该可以解决您的问题,因为/api/secure 总是比/api/(.*) 更具体的路径。

      如果有帮助,请告诉我。

      【讨论】:

        【解决方案3】:

        在我的情况下,我有一个多子域主机平台,我正在尝试诸如

        之类的配置
        nginx.ingress.kubernetes.io/server-snippet: |
          location ~* "^/api/architect/(.*)" {
              allow  all;
          }
        
          location ~* "^/(.*)" {
              deny  all;
              allow 149.74.110.92;
              allow 85.138.230.206;
          }
        

        但到目前为止似乎没有用。我想阻止主 url 并且只访问某个端点...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-27
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          • 2021-12-08
          • 1970-01-01
          • 2023-03-23
          相关资源
          最近更新 更多