繁体   English   中英

在 ingress-nginx 负载均衡器上阻止特定路径

[英]Block particular path on ingress-nginx Loadbalancer

我有许多域指向 Ingress Controller IP。 我想阻止所有域/站点的/特定路径。 有没有办法做到这一点。 我可以使用nginx.ingress.kubernetes.io/configuration-snippet: | 对于每个站点。 但是要立即为所有站点/域/入口资源寻找方法。

Controller 使用: https://kubernetes.github.io/ingress-nginx/

您不能阻止特定路径。 您可以做的是将 ingress 内的主机路径指向默认 backedn 应用程序,例如 404 default backedn。

有两种方法可以实现这一点:

1.第一个是使用server-snippet注释:

使用注释nginx.ingress.kubernetes.io/server-snippet可以在服务器配置块中添加自定义配置。

这是我的入口 object 清单:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
     nginx.ingress.kubernetes.io/server-snippet: |
          location ~* /admin-access {
              deny all;
              return 403;
            }
spec:
  rules:
  - host: domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web 
          servicePort: 80

请注意,使用这种方法:

每个主机只能使用此注解一次。


2. 第二个是使用ConfigMapsServer-snippet

您要做的是找到您的configMap

 kubectl get pod <nginx-ingress-controller>  -o yaml

这位于容器args

  spec:
   containers:
   - args:
     -  /nginx-ingress-controller
     - configmap=$(POD_NAMESPACE)/nginx-loadbalancer-conf

然后只需编辑它并添加server-snippet部分:

   apiVersion: v1 
   data:  
   server-snippet:  |
   location /admin-access {
   deny  all;
    }

这种方法允许您为 Ingress 资源中定义的所有主机全局定义受限位置。


请注意,使用server-snippet时,无法在入口资源 object 中定义您阻止的路径。 但是,还有另一种通过ConfigMap使用location-snippet方法:

location ~* "^/web/admin { 
        deny all; 
        }

对于入口 object 中的每个现有路径,都会有入口规则,但它会针对特定的 uri 被阻止(在上面的示例中,当admin出现在web之后时,它将被阻止)。 所有其他 uri 都将通过。


3. 这是一个测试:

➜  curl -H "Host: domain.com"  172.17.0.4/test             
...
 "path": "/test",
 "headers": {
...
 },
 "method": "GET",
 "body": "",
 "fresh": false,
 "hostname": "domain.com",
 "ip": "172.17.0.1",
 "ips": [
   "172.17.0.1"
 ],
 "protocol": "http",
 "query": {},
 "subdomains": [],
 "xhr": false,
 "os": {
   "hostname": "web-6b686fdc7d-4pxt9"
...  

这是一个路径被拒绝的测试:

➜  curl -H "Host: domain.com"  172.17.0.4/admin-access

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>

➜  curl -H "Host: domain.com"  172.17.0.4/admin-access/test
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>

附加信息:在 1.16 中删除了已弃用的 API 这是您需要知道的:

v1.22 版本将停止提供以下已弃用的 API 版本,转而支持更新和更稳定的 API 版本:

将不再提供 extensions/v1beta1 API 版本中的入口

您可以使用入口注释应用它

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: channel-dev
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: "27.110.30.45, 68.50.85.421"
  name: dev-ingress
  namespace: development
spec:
  rules:
  - host: hooks.dev.example.com
    http:
      paths:
      - backend:
          serviceName: hello-service
          servicePort: 80
        path: /incoming/message/
  tls:
  - hosts:
    - hooks.dev.example.com
    secretName: channel-dev

路径https://hooks.dev.example.com/incoming/message/只能从提到的 IP 访问,其他用户将收到403错误,并且无法访问 URL。

只需在入口中添加此注释

nginx.ingress.kubernetes.io/whitelist-source-range

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM