我想创建一个nginx入口,它只允许用户连接和休息几个路径,或者提供403错误。有什么办法做到这一点吗?
我只希望用户允许连接"/代码细化器/"/v1/unsubscribed/*和rest都应该被阻止。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: code-refiner-service-ingress-external
namespace: backend
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: nginx-external
spec:
rules:
- host: code-refiner.example.com
http:
paths:
- backend:
service:
name: code-refiner-service
port:
number: 80
path: /
pathType: Prefix
我需要实现这样的
location /* {
deny all;
}
location /code-refiner/ or /v1/unsubscribed/{
allow all;
}
根据这个git链接,您可以创建两个入口,并且只将注释添加到具有要保护的路径的入口
- 对于您的问题,默认情况下首先创建两个入口,没有任何限制
- 然后,如文档中所述,为auth创建一个秘密。(创建htpasswd和secret(
创建htpasswd
$ htpasswd -c auth foo
New password: <bar>
New password:
Re-type new password:
Adding password for user foo
创建秘密:
kubectl create secret generic basic-auth --from-file=auth secret
3.对需要限制的路径使用auth的第二个入口。
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/rewrite-target: /
kubernetes.io/tls-acme: true
# type of authentication
ingress.kubernetes.io/auth-type: basic
# name of the secret that contains the user/password definitions
ingress.kubernetes.io/auth-secret: basic-auth
# message to display with an appropiate context why the authentication is required
ingress.kubernetes.io/auth-realm: "Authentication Required - foo"
# Below configuration-snippet is to pass on the authenticated user-name to serviceB
ingress.kubernetes.io/configuration-snippet: |
proxy_set_header X-AUTH-USER $remote_user;
name: my-nginx-ingress-auth
spec:
tls:
hosts:
myhost
secretName: mysecret
rules:
host: myhost
http:
paths:
path: /serviceB/
backend:
serviceName: serviceB-service
servicePort: 7070
添加这些堆栈链接[1][2]供您参考。
第二个是使用ConfigMaps和服务器片段:
您要做的是定位您的configMap:
kubectl get pod <nginx-ingress-controller> -o yaml
这是位于容器args:
spec:
containers:
- args:
- /nginx-ingress-controller
- configmap=$(POD_NAMESPACE)/nginx-loadbalancer-conf
然后只需编辑它并放置添加服务器片段部分
apiVersion: v1
data: server-snippet: |
location /admin-access {
deny all;
}
这种方法允许您为Ingress资源中定义的所有主机全局定义受限位置。
请注意,使用服务器片段时,无法在ingress资源对象中定义您正在阻止的路径。然而,通过ConfigMap获取位置片段还有另一种方法:
location ~* "^/web/admin {
deny all;
}
对于ingress对象中的每个现有路径,都会有ingress规则,但对于特定的uri,它会被阻止(在上面的例子中,当admin出现在web之后时,它会受到阻止(。所有其他uri都将通过。