Я пытаюсь использовать Keycloak с Oauth2 для защиты панели управления Kubernetes. Я нашел несколько сообщений об этой ошибке, но ни одна из них не относилась к моей проблеме. может я просто пропустил простой шаг ..
до сих пор я следовал этому руководству: https://jamesveitch.com/homelab/02.idam/02.keycloak/
Keycloak устанавливается в кластере kubernetes внутри keycloak пространства имен. Kubernetes-dashboard устанавливается в пространстве имен kubernetes-dashboard.
Keycloak доступен по адресу auth.mydomain.com, а панель управления должна быть доступна по адресу dashboard.mydomain.com.
Я создал пользовательский тест и назначил группу kubernetes-admin, которую я бы использовал для предоставления доступа к панели инструментов.
Я настроил Keycloak так:
- Создан новый разработчик игрового мира
- Создал Пользовательский тест и группу kubernetes-admin
- Created a new client "dashboard"
- Access Type: confidential
- Сервисный аккаунт включен: вкл.
- Действительный URL-адрес перенаправления: https://dashboard.mydomain.com/oauth/callback
- Создал сопоставитель для групп (Тип: членство в группе, TokenClaimName: группы)
Для привязки кластера 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 и нажмите Sigin с Keycloak. Но затем я перенаправляюсь на страницу ошибки разрешения 403 .. Журналы oauth2 говорят: Ошибка при / oauth2 / callback? Error = invalid_request & error_description = Invalid + scopes
Пожалуйста, имейте в виду, что я хотел бы использовать восходящую службу панели управления kubernetes .. вот почему я пробую здесь как восходящий поток https: //kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local .. надеюсь, что это правильно ??
Как я могу это исправить ?? Любые идеи ? Keycloak настроен правильно?
Некоторые сайты говорят использовать (https: // * и http: // * в качестве действительных URL-адресов .. безуспешно)
Надеюсь, кто-то может помочь ... Я потратил много времени на эту работу до сих пор ... но пока безуспешно.