Fixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Acest articol a fost scris cu scopul de a extinde deja existent, dar vorbește despre caracteristicile conexiunii în mod specific cu Microsoft ActiveDirectory și, de asemenea, o completează.

În acest articol vă voi spune cum să instalați și să configurați:

  • Mantaua cheii este un proiect open source. Care oferă un singur punct de intrare pentru aplicații. Funcționează cu multe protocoale, inclusiv LDAP și OpenID, care ne interesează.
  • Gardianul cheii — o aplicație proxy inversă care vă permite să integrați autorizarea prin Keycloak.
  • Pasarelă — o aplicație care generează o configurație pentru kubectl cu care vă puteți conecta prin OpenID și vă puteți conecta la API-ul Kubernetes.

Cum funcționează permisiunile în Kubernetes.

Putem gestiona drepturile de utilizator/grup folosind RBAC, au fost deja create o grămadă de articole despre asta, nu mă voi opri în detaliu. Problema este că puteți folosi RBAC pentru a restricționa drepturile utilizatorilor, dar Kubernetes nu știe nimic despre utilizatori. Se pare că avem nevoie de un mecanism de livrare a utilizatorilor în Kubernetes. Pentru a face acest lucru, vom adăuga un furnizor la Kuberntes OpenID, care va indica că un astfel de utilizator există cu adevărat, iar Kubernetes însuși îi va acorda drepturi.

Pregătire

  • Veți avea nevoie de un cluster Kubernetes sau minikube
  • Active Directory
  • Domenii:
    keycloak.example.org
    kubernetes-dashboard.example.org
    pasarela.example.org
  • Certificat pentru domenii sau certificat autosemnat

Nu voi intra în detalii despre cum să creez un certificat autosemnat; trebuie să creați 2 certificate, aceasta este rădăcina (Autoritatea de Certificare) și caracterul metalic al clientului pentru domeniul *.example.org

După ce primiți/scrieți certificatele, trebuie să adăugați certificatul client la Kubernetes; pentru a face acest lucru, creați un secret pentru acesta:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

În continuare îl vom folosi pentru controlerul nostru Ingress

Instalare Keycloak

Am decis că cea mai ușoară cale a fost să folosesc soluții gata făcute pentru asta, și anume graficele de conducere.

Instalați depozitul și actualizați-l:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

Creați un fișier keycloak.yml cu următorul conținut:

keycloak.yml

keycloak:
  # Имя администратора
  username: "test_admin"
  # Пароль администратор  
  password: "admin"
  # Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам 
  понадобиться что бы починить один баг, о котором ниже.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
  ingress:
    enabled: true 
    path: /
    annotations:
      kubernetes.io/ingress.class: nginx
      ingress.kubernetes.io/affinity: cookie
    hosts:
      - keycloak.example.org
    tls:
    - hosts:
        - keycloak.example.org
      secretName: tls-keycloak
  # Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

Configurarea federației

Apoi, accesați interfața web keycloak.example.org

În colțul din stânga faceți clic Adăugați tărâm

Cheie
Valoare

Nume si Prenume
Kubernetes

Numele afisat
Kubernetes

Dezactivați verificarea confirmării e-mailului utilizatorului:
Domeniile client —> E-mail —> Mappers —> E-mail verificat (Ștergere)

Înființăm o federație pentru a importa utilizatori din ActiveDirectory, voi lăsa capturi de ecran mai jos, cred că va fi mai clar.

Federație de utilizatori —> Adăugați furnizor... —> ldap

Configurarea federațieiFixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak
Fixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Dacă totul este bine, atunci după apăsarea butonului Sincronizați toți utilizatorii Veți vedea un mesaj care indică importarea cu succes a utilizatorilor.

În continuare trebuie să ne mapam grupurile

Federație de utilizatori -> ldap_localhost -> Mappers -> Creați

Crearea unui mapperFixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Configurarea clientului

Trebuie să creați un client, în ceea ce privește Keycloak aceasta este o aplicație care va fi autorizată de acesta. Voi evidenția punctele importante cu roșu în captură de ecran.

Clienți -> Creați

Configurarea clientuluiFixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Să creăm un scoupe pentru grupuri:

Domenii client -> Creare

Crearea unui domeniuFixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Și configurați un mapper pentru ei:

Client Scopes -> grupuri -> Mappers -> Create

CartografFixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Adăugăm maparea grupurilor noastre la domeniile client implicite:

Clienți -> kubernetes -> Domenii client -> Domenii client implicite
selecta Grupuri в Domenii disponibile pentru clienți, presa Adăugați selectat

Obținem secretul (și îl notăm undeva) pe care îl vom folosi pentru autorizare în Keycloak:

Clienți -> kubernetes -> Acreditări -> Secret
Aceasta completează configurarea, dar am avut o eroare când, după autorizarea cu succes, am primit o eroare 403. Raport de eroare.

Remediere:

Client Scopes -> Roluri -> Mappers -> Create

CartografFixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Cod script

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

Configurarea Kubernetes

Trebuie să indicăm unde se află certificatul nostru rădăcină de pe site și unde se află furnizorul OIDC.
Pentru a face acest lucru, editați fișierul /etc/kubernetes/manifests/kube-apiserver.yaml

kube-apiserver.yaml


...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

Actualizați configurația kubeadm în cluster:

kubeadm config

kubectl edit -n kube-system configmaps kubeadm-config


...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

Setarea auth-proxy

Pentru a vă proteja aplicația web, puteți utiliza keycloak gatekeeper. Pe lângă faptul că acest proxy invers va autoriza utilizatorul înainte de a afișa pagina, va transmite și informații despre tine în anteturi către aplicația finală. Astfel, dacă aplicația dumneavoastră acceptă OpenID, utilizatorul este imediat autorizat. Să ne uităm la exemplul Kubernetes Dashboard

Instalarea tabloului de bord Kubernetes


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

values_dashboard.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Setarea drepturilor de acces:

Să creăm un ClusterRoleBinding care va acorda drepturi de administrator al clusterului (standard ClusterRole cluster-admin) pentru utilizatorii din grupul DataOPS.


kubectl apply -f rbac.yaml

rbac.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dataops_group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: DataOPS

Instalarea keycloak gatekeeper:


helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

values_proxy.yaml



# Включаем ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  path: /
  hosts:
    - kubernetes-dashboard.example.org
  tls:
   - secretName: tls-keycloak
     hosts:
       - kubernetes-dashboard.example.org

# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
  - "uri=/*|groups=DataOPS"

După aceea, când încercați să vă conectați la kubernetes-dashboard.example.org, va avea loc o redirecționare către Keycloak și, dacă autorizarea are succes, vom fi direcționați către Tabloul de bord deja autentificat.

Instalare pasarelă

Pentru comoditate, puteți adăuga o pasarelă care va genera un fișier de configurare pentru kubectl, cu ajutorul căruia vom intra în Kubernetes sub utilizatorul nostru.


helm install --name gangway stable/gangway -f values_gangway.yaml

values_gangway.yaml


gangway:
  # Произвольное имя кластера
  clusterName: "my-k8s"
  # Где у нас OIDC провайдер
  authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
  tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
  audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
  # Теоритически сюда можно добавить groups которые мы замапили
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Имя клиента
  clientID: "kubernetes"
  # Секрет
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
  usernameClaim: "sub"
  # Доменное имя или IP адресс API сервера
  apiServerURL: "https://192.168.99.111:8443"

# Включаем Ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
  path: /
  hosts:
  - gangway.example.org
  tls:
  - secretName: tls-keycloak
    hosts:
      - gangway.example.org

# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
 -----BEGIN CERTIFICATE-----
 MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
 -----END CERTIFICATE-----

Arata cam asa. Vă permite să descărcați imediat un fișier de configurare și să îl generați folosind un set de comenzi:

Fixăm autorizarea ActiveDirectory la Kubernetes folosind Keycloak

Sursa: www.habr.com

Adauga un comentariu