如何使用 keycloak、oauth2 和仪表板 - 错误 403 无效请求 - 无效范围
Howto use keycloak, oauth2 and dashboard - Error 403 invalid request - invalid scope
我正在尝试将 Keycloak 与 Oauth2 结合使用来保护 kubernetes-dashboard。我发现了几个关于此错误的 post,但 none 是针对我的问题的。也许我只是错过了一个简单的步骤..
到目前为止我遵循了这个指南:https://jamesveitch.com/homelab/02.idam/02.keycloak/
Keycloak 安装在命名空间 keycloak 内的 kubernetes 集群中。
Kubernetes-dashboard 安装在命名空间 kubernetes-dashboard 中。
Keycloak 在 auth.mydomain.com 下可以访问,仪表板应该在 dashboard.mydomain.com 下可以访问。
我创建了一个用户“test”并分配了一个组 kubernetes-admin,我将使用它来授予对仪表板的访问权限。
我这样配置了 Keycloak:
- 创建了一个新领域“dev”
- 创建了一个用户测试和一个组 kubernetes-admin
- 创建了一个新的客户端“仪表板”
- 访问类型:机密
- 已启用服务帐户:开
- 有效重定向 Url:https://dashboard.mydomain.com/oauth/callback
- 为组创建映射器(类型:组成员,TokenClaimName:groups)
对于 kubernetes-admin 的集群绑定,我使用这个 yaml:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: keycloak-admin-group
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
# NOTE: This is a super administrator and can do everything.
# Consider a dedicated role in your actual operation.
name: cluster-admin
subjects:
- kind: Group
name: kubernetes-admin
对于 OAuth2 和 Ingress 的配置,我使用:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/use-port-in-redirects: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
name: dashboard
namespace: kubernetes-dashboard
spec:
tls:
- hosts:
- dashboard.mydomain.com
secretName: dashboard.mydomain.com-tls
rules:
- host: dashboard.mydomain.com
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 443
path: /
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: oauth2-proxy
namespace: kubernetes-dashboard
spec:
rules:
- host: dashboard.mydomain.com
http:
paths:
- backend:
serviceName: oauth2-proxy
servicePort: 4180
path: /oauth2
tls:
- hosts:
- dashboard.mydomain.com
secretName: dashboard.mydomain.com-tls
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: oauth2-proxy
name: oauth2-proxy
namespace: kubernetes-dashboard
spec:
replicas: 1
selector:
matchLabels:
k8s-app: oauth2-proxy
template:
metadata:
labels:
k8s-app: oauth2-proxy
spec:
containers:
- args:
- --provider=keycloak
- --client-id=dashboard
- --client-secret=a27b97fb-eafc-420c-88ba-8017beb54180
- --login-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/auth
- --redeem-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/token
- --validate-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/userinfo
- --keycloak-group=kubernetes-admin
- --email-domain=*
- --http-address=0.0.0.0:4180
- --reverse-proxy=true
- --pass-access-token=true
- --set-xauthrequest=true
- --ssl-insecure-skip-verify=true
- --ssl-upstream-insecure-skip-verify=true
- --cookie-domain=.mydomain.com
- --whitelist-domain=.mydomain.com
- --upstream=https://kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local
# Register a new application
# https://github.com/settings/applications/new
env:
# docker run -ti --rm python:3-alpine python -c 'import secrets,base64; print(base64.b64encode(base64.b64encode(secrets.token_bytes(16))));'
- name: OAUTH2_PROXY_COOKIE_SECRET
value: ekNsWlN6MkphVVVmTnNZUTBEZnZVQT09
image: quay.io/oauth2-proxy/oauth2-proxy
imagePullPolicy: Always
name: oauth2-proxy
ports:
- containerPort: 4180
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: oauth2-proxy
name: oauth2-proxy
namespace: kubernetes-dashboard
spec:
ports:
- name: http
port: 4180
protocol: TCP
targetPort: 4180
selector:
k8s-app: oauth2-proxy
此 yaml 文件用于带 letsencrypt-staging 的开发环境,应忽略 ssl 错误。
有效的是,我可以打开 https://dashboard.mydomain.com/oauth2/signin 并使用 Keycloak 按 Sigin。但接下来我重定向到 403 权限错误页面..
oauth2 日志显示:/oauth2/callback 错误?error=invalid_request&error_description=Invalid+scopes
请记住,我想使用 kubernetes 仪表板服务的上游。这就是为什么我在这里尝试作为上游 https://kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local.. 希望这是对的??
我该如何解决这个问题??有任何想法吗 ?
Keycloak 配置是否正确?
一些网站说要使用(https://* 和 http://* 作为有效的 url.. 试过但没有成功)
希望有人能提供帮助..到目前为止我确实花了很多时间来完成这项工作..但到目前为止运气不好。
我刚刚知道如何处理这个错误:
首先,我们需要将keycloak中的URL改为https://dashboard.mydomain.com/*
在仪表板下 - 映射器 - 组停用完整的组路径..
这会删除令牌中组的前导斜线(您可以在 Client Sope - Evaluate 中查看)
这是 oauth2 参数所需要的 --keycloak-group=kubernetes-admin
在开发领域下创建客户端范围“用户”- 在具有默认值的客户端范围
现在切换到“客户端范围”下的第二个选项卡“默认客户端范围”,并将“用户”指定为默认客户端范围
在客户端 -> 仪表板 - 客户端范围下添加此客户端范围“用户”
在oauth2开发中添加-scope参数:--scope=users
上游在上面的示例中是正确的分配器,可以直接在集群内访问仪表板。所以那里不需要改变。
在此之后,您应该能够无错误地打开仪表板。
但是我仍然有一个问题,即发送了不记名令牌,但目前还没有用于自动登录..你仍然需要粘贴你的令牌..所以我仍在调查以完成这项工作..
我正在尝试将 Keycloak 与 Oauth2 结合使用来保护 kubernetes-dashboard。我发现了几个关于此错误的 post,但 none 是针对我的问题的。也许我只是错过了一个简单的步骤..
到目前为止我遵循了这个指南:https://jamesveitch.com/homelab/02.idam/02.keycloak/
Keycloak 安装在命名空间 keycloak 内的 kubernetes 集群中。 Kubernetes-dashboard 安装在命名空间 kubernetes-dashboard 中。
Keycloak 在 auth.mydomain.com 下可以访问,仪表板应该在 dashboard.mydomain.com 下可以访问。
我创建了一个用户“test”并分配了一个组 kubernetes-admin,我将使用它来授予对仪表板的访问权限。
我这样配置了 Keycloak:
- 创建了一个新领域“dev”
- 创建了一个用户测试和一个组 kubernetes-admin
- 创建了一个新的客户端“仪表板”
- 访问类型:机密
- 已启用服务帐户:开
- 有效重定向 Url:https://dashboard.mydomain.com/oauth/callback
- 为组创建映射器(类型:组成员,TokenClaimName:groups)
对于 kubernetes-admin 的集群绑定,我使用这个 yaml:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: keycloak-admin-group
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
# NOTE: This is a super administrator and can do everything.
# Consider a dedicated role in your actual operation.
name: cluster-admin
subjects:
- kind: Group
name: kubernetes-admin
对于 OAuth2 和 Ingress 的配置,我使用:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/use-port-in-redirects: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
name: dashboard
namespace: kubernetes-dashboard
spec:
tls:
- hosts:
- dashboard.mydomain.com
secretName: dashboard.mydomain.com-tls
rules:
- host: dashboard.mydomain.com
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 443
path: /
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: oauth2-proxy
namespace: kubernetes-dashboard
spec:
rules:
- host: dashboard.mydomain.com
http:
paths:
- backend:
serviceName: oauth2-proxy
servicePort: 4180
path: /oauth2
tls:
- hosts:
- dashboard.mydomain.com
secretName: dashboard.mydomain.com-tls
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: oauth2-proxy
name: oauth2-proxy
namespace: kubernetes-dashboard
spec:
replicas: 1
selector:
matchLabels:
k8s-app: oauth2-proxy
template:
metadata:
labels:
k8s-app: oauth2-proxy
spec:
containers:
- args:
- --provider=keycloak
- --client-id=dashboard
- --client-secret=a27b97fb-eafc-420c-88ba-8017beb54180
- --login-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/auth
- --redeem-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/token
- --validate-url=https://auth.mydomain.com/auth/realms/dev/protocol/openid-connect/userinfo
- --keycloak-group=kubernetes-admin
- --email-domain=*
- --http-address=0.0.0.0:4180
- --reverse-proxy=true
- --pass-access-token=true
- --set-xauthrequest=true
- --ssl-insecure-skip-verify=true
- --ssl-upstream-insecure-skip-verify=true
- --cookie-domain=.mydomain.com
- --whitelist-domain=.mydomain.com
- --upstream=https://kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local
# Register a new application
# https://github.com/settings/applications/new
env:
# docker run -ti --rm python:3-alpine python -c 'import secrets,base64; print(base64.b64encode(base64.b64encode(secrets.token_bytes(16))));'
- name: OAUTH2_PROXY_COOKIE_SECRET
value: ekNsWlN6MkphVVVmTnNZUTBEZnZVQT09
image: quay.io/oauth2-proxy/oauth2-proxy
imagePullPolicy: Always
name: oauth2-proxy
ports:
- containerPort: 4180
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: oauth2-proxy
name: oauth2-proxy
namespace: kubernetes-dashboard
spec:
ports:
- name: http
port: 4180
protocol: TCP
targetPort: 4180
selector:
k8s-app: oauth2-proxy
此 yaml 文件用于带 letsencrypt-staging 的开发环境,应忽略 ssl 错误。
有效的是,我可以打开 https://dashboard.mydomain.com/oauth2/signin 并使用 Keycloak 按 Sigin。但接下来我重定向到 403 权限错误页面.. oauth2 日志显示:/oauth2/callback 错误?error=invalid_request&error_description=Invalid+scopes
请记住,我想使用 kubernetes 仪表板服务的上游。这就是为什么我在这里尝试作为上游 https://kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local.. 希望这是对的??
我该如何解决这个问题??有任何想法吗 ? Keycloak 配置是否正确?
一些网站说要使用(https://* 和 http://* 作为有效的 url.. 试过但没有成功)
希望有人能提供帮助..到目前为止我确实花了很多时间来完成这项工作..但到目前为止运气不好。
我刚刚知道如何处理这个错误:
首先,我们需要将keycloak中的URL改为https://dashboard.mydomain.com/*
在仪表板下 - 映射器 - 组停用完整的组路径.. 这会删除令牌中组的前导斜线(您可以在 Client Sope - Evaluate 中查看) 这是 oauth2 参数所需要的 --keycloak-group=kubernetes-admin
在开发领域下创建客户端范围“用户”- 在具有默认值的客户端范围
现在切换到“客户端范围”下的第二个选项卡“默认客户端范围”,并将“用户”指定为默认客户端范围
在客户端 -> 仪表板 - 客户端范围下添加此客户端范围“用户”
在oauth2开发中添加-scope参数:--scope=users
上游在上面的示例中是正确的分配器,可以直接在集群内访问仪表板。所以那里不需要改变。
在此之后,您应该能够无错误地打开仪表板。 但是我仍然有一个问题,即发送了不记名令牌,但目前还没有用于自动登录..你仍然需要粘贴你的令牌..所以我仍在调查以完成这项工作..