gpt4 book ai didi

ssl - 通过客户端证书验证保护特定的 nginx-ingress 位置

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:10 31 4
gpt4 key购买 nike

我正在设置一个 ghost 实例,并尝试通过客户端证书验证来保护/ghost 路径。

我已经启动并运行了一个初始入口,它使用指定为/的路径非常愉快地为站点提供服务。

我正在尝试为/ghost 路径添加第二个入口(基本相同)。如果我这样做并添加基本身份验证的注释,一切似乎都有效。即,如果我浏览到/ghost,系统会提示我输入 basic-auth secret 中的凭据,如果我浏览到任何其他 URL,则它会在没有身份验证的情况下提供。

然后我根据这个例子切换到客户端证书验证:https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/auth/client-certs

当我尝试这个时,要么整个站点都受到保护,要么没有站点是安全的,而不是基于路径的分离,我得到了基本身份验证。从正在运行的 pod 中查看 nginx.conf proxy_set_header ssl-client-verifyproxy_set_header ssl-client-subject-dn & proxy_set_header ssl-client-issuer -dn 元素添加到根/路径和/ghost 路径下。我试过删除那些(仅从根目录)并将配置直接复制回 pod,但也没有运气。

我正在通过 Helm 将 nginx-ingress(Chart 版本 0.23.0)作为依赖项拉入

/ 位置的入口定义 - 这个有效

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
certmanager.k8s.io/cluster-issuer: letsencrypt-staging
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
labels:
app: my-app
chart: my-app-0.1.1
heritage: Tiller
release: my-app
name: my-app
namespace: default
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: my-app
servicePort: http
path: /
tls:
- hosts:
- example.com
secretName: mysite-tls

/ghost 位置的入口定义 - 这个不起作用

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/auth-tls-chain"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/auth-tls-error-page: "http://www.example.com/error-cert.html"
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "false"
kubernetes.io/ingress.class: "nginx"
labels:
app: my-app
chart: my-app-0.1.1
heritage: Tiller
release: my-app
name: my-app-secure
namespace: default
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: my-app
servicePort: http
path: /ghost
tls:
- hosts:
- example.com
secretName: mysite-tls

最佳答案

如果你想在 /ghost 下安全地提供所有页面并且你只想 ,你需要在你的第二个入口路径上有一个 '*'/ghost 你需要另一个规则。像这样:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/auth-tls-chain"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/auth-tls-error-page: "http://www.example.com/error-cert.html"
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "false"
kubernetes.io/ingress.class: "nginx"
labels:
app: my-app
chart: my-app-0.1.1
heritage: Tiller
release: my-app
name: my-app-secure
namespace: default
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: my-app
servicePort: http
path: /ghost
- backend:
serviceName: my-app
servicePort: http
path: /ghost/*
tls:
- hosts:
- example.com
secretName: mysite-tls

但是,如果你想要像 / 不安全和 /ghost 安全的东西,我相信你将无法做到。例如,如果您使用的是 nginx,那么当您配置 server {} 时,这是 nginx 本身的限制。在 nginx 中使用 TLS 阻止它看起来像这样:

server {
listen 443 ssl;
server_name example.com;
ssl_certificate example.com.crt;
ssl_certificate_key example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}

入口 Controller 创建这样的路径:

server {
listen 443 ssl;
server_name example.com;
ssl_certificate example.com.crt;
ssl_certificate_key example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...

location / {
...
}

location /ghost {
...
}

}

因此,当您配置另一个具有相同主机名且没有 SSL 的 server {} block 时,它将覆盖第一个。

您可以在入口中使用不同的 -host: 规则来做到这一点,例如使用 TLS 的 ghost.example.commain.example.com 没有 TLS。所以在你的 nginx.conf 中你会有不同的 server {} block 。

您始终可以通过 shell 进入入口 Controller pod 来检查配置,例如:

$ kubectl exec -it nginx-ingress-controller-xxxxxxxxx-xxxxx bash
www-data@nginx-ingress-controller-6bd7c597cb-8kzjh:/etc/nginx$ cat nginx.conf

关于ssl - 通过客户端证书验证保护特定的 nginx-ingress 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52953815/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com