我正在设置ghost的实例,并试图通过客户端证书验证来保护/ ghost路径。
我已经启动并运行了一个初始入口,它使用指定为/的路径非常愉快地为站点提供服务。
我正在尝试为/ ghost路径添加第二个入口(大致相同)。如果我这样做并添加基本身份验证的批注,一切似乎都可以正常工作。即,如果我浏览到/ ghost,则系统会提示我输入基本身份验证密码中的凭据,如果我浏览到任何其他URL,则无需身份验证即可提供该凭据。
然后我根据以下示例切换到客户端证书验证:https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/auth/client-certs
当我尝试执行此操作时,无论是整个站点还是没有站点都是安全的,而不是基于路径的分隔,我都会使用basic-auth。从正在运行的pod中查看nginx.conf,将proxy_set_header ssl-client-verify
,proxy_set_header ssl-client-subject-dn
和proxy_set_header ssl-client-issuer-dn
元素添加到根/路径和/ ghost路径下。我试过删除这些(仅从根目录)并将配置直接复制回Pod,但也没有运气。
我通过Helm将Nginx-ingress(图表版本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
答案 0 :(得分:2)
如果您想在'*'
下安全地提供所有页面,并且只想/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,则这是nginx本身的限制,当您在nginx中使用TLS配置server {}
块并使用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;
...
}
入口控制器创建如下路径:
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 {
...
}
}
因此,当您用相同的主机名配置另一个server {}
块且没有SSL时,它将覆盖第一个。
您可以在入口中使用不同的- host:
规则来完成此操作,例如使用TLS的ghost.example.com
和不使用TLS的main.example.com
。因此,在您的nginx.conf中,您将拥有不同的server {}
块。
您始终可以使用外壳插入入口控制器窗格来检查配置,例如:
$ kubectl exec -it nginx-ingress-controller-xxxxxxxxx-xxxxx bash
www-data@nginx-ingress-controller-6bd7c597cb-8kzjh:/etc/nginx$ cat nginx.conf
答案 1 :(得分:0)
您可以添加位置片段
annotations:
nginx.ingress.kubernetes.io/location-snippet: |
if ($location ^~ ghost) {
set $ban_info = "location";
}
if ($ssl_client_s_dn !~ "CN=ok_client") {
set $ban_info = "${ban_info}+no_client";
}
if ($ban_info = "location+no_client") {
return 403;
}