Kubernetes ingress-nginx 粘性会话不适用于 spring 安全
Kubernetes ingress-nginx sticky session isn't working with spring security
我有一个有状态的 spring 应用程序,我想将它部署到 kubernetes 集群。将有多个应用程序实例,因此我需要使用 ingress-nginx 控制器启用静态会话。我做了如下配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "JSESSIONID"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/session-cookie-path: /ingress-test
# UPDATE THIS LINE ABOVE
spec:
rules:
- http:
paths:
- path: /ingress-test
backend:
serviceName: ingress-test
servicePort: 31080
如果登录成功,ingress-nginx 会将后续请求重定向到正确的 pod。但是,它有时会在 JSESSIONID 更改后立即切换到其他 pod(JSESSIONID cookie 由 spring-security after successful login 更改)并且即使用户凭据正确,前端也会重定向回登录页面。有没有人用 spring-security 尝试过 ingress-nginx?
此致
spring 更改 cookie 的原因是为了防止会话固定(更多信息可在此处找到:https://www.owasp.org/index.php/Session_fixation)。
在您的情况下,您对 spring 用于会话处理的粘性路由策略使用相同的 cookie。
我建议使用不同的 cookie 名称 - 它将由 nginx 创建,不需要使用应用程序使用的 cookie。
以下更改解决了问题。如果规则中没有主机定义,ingress-nginx 不会设置会话 cookie。
有一个未解决的问题:https://github.com/kubernetes/ingress-nginx/issues/3989
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/session-cookie-path: /ingress-test
# UPDATE THIS LINE ABOVE
spec:
rules:
- host: www.domainname.com
http:
paths:
- path: /ingress-test
backend:
serviceName: ingress-test
servicePort: 31080
我有一个有状态的 spring 应用程序,我想将它部署到 kubernetes 集群。将有多个应用程序实例,因此我需要使用 ingress-nginx 控制器启用静态会话。我做了如下配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "JSESSIONID"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/session-cookie-path: /ingress-test
# UPDATE THIS LINE ABOVE
spec:
rules:
- http:
paths:
- path: /ingress-test
backend:
serviceName: ingress-test
servicePort: 31080
如果登录成功,ingress-nginx 会将后续请求重定向到正确的 pod。但是,它有时会在 JSESSIONID 更改后立即切换到其他 pod(JSESSIONID cookie 由 spring-security after successful login 更改)并且即使用户凭据正确,前端也会重定向回登录页面。有没有人用 spring-security 尝试过 ingress-nginx?
此致
spring 更改 cookie 的原因是为了防止会话固定(更多信息可在此处找到:https://www.owasp.org/index.php/Session_fixation)。 在您的情况下,您对 spring 用于会话处理的粘性路由策略使用相同的 cookie。
我建议使用不同的 cookie 名称 - 它将由 nginx 创建,不需要使用应用程序使用的 cookie。
以下更改解决了问题。如果规则中没有主机定义,ingress-nginx 不会设置会话 cookie。
有一个未解决的问题:https://github.com/kubernetes/ingress-nginx/issues/3989
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/session-cookie-path: /ingress-test
# UPDATE THIS LINE ABOVE
spec:
rules:
- host: www.domainname.com
http:
paths:
- path: /ingress-test
backend:
serviceName: ingress-test
servicePort: 31080