Как использовать keycloak, oauth2 и панель инструментов - Ошибка 403 недопустимый запрос - недопустимая область

Я пытаюсь использовать 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 так:

  1. Создан новый разработчик игрового мира
  2. Создал Пользовательский тест и группу kubernetes-admin
  3. 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-адресов .. безуспешно)

Надеюсь, кто-то может помочь ... Я потратил много времени на эту работу до сих пор ... но пока безуспешно.


person biohell    schedule 29.10.2020    source источник


Ответы (1)


Я только что узнал, как справиться с этой ошибкой:

  1. Во-первых, нам нужно изменить URL-адрес в keycloak на https://dashboard.mydomain.com/ *

  2. Под панелью управления - Mapper - группы деактивируют полный путь к группе. Это удаляет ведущую косую черту групп в вашем токене (вы можете проверить в Client Sope - Evaluate). Это необходимо для параметра oauth2 --keycloak-group = kubernetes-admin

  3. Создайте пользователей клиентской области в области разработки - в клиентских областях со значениями по умолчанию

  4. Теперь перейдите на вторую вкладку Default Client Scope в Client Scopes и назначьте Users как Default Client Scope.

  5. Добавьте пользователей этой клиентской области в разделе «Клиент» - ›Панель управления -« Клиентская область »

  6. Добавьте параметр -scope в разработку oauth2: --scope = users

Восходящий поток правильно настроен в приведенном выше примере для доступа к панели мониторинга непосредственно в кластере. Так что никаких изменений здесь не требуется.

После этого вы сможете без ошибок открыть панель управления. Но у меня все еще есть проблема, что токен на предъявителя отправляется, но в настоящее время не используется для автоматического входа в систему .. вам все равно нужно вставить свой токен .. Так что я все еще исследую, чтобы получить эту работу ..

person biohell    schedule 03.11.2020
comment
Вы разрешили это полностью? - person Sakar Mehra; 24.05.2021