Kiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Tämä artikkeli on kirjoitettu laajentamaan jo nykyinen, mutta puhuu paketin ominaisuuksista Microsoft ActiveDirectoryn kanssa ja myös täydentää sitä.

Tässä artikkelissa kerron kuinka asentaa ja määrittää:

  • Avaimenperä on avoimen lähdekoodin projekti. Joka tarjoaa yhden pisteen sovelluksille. Toimii monien protokollien kanssa, mukaan lukien LDAP ja OpenID, joista olemme kiinnostuneita.
  • avainviitta portinvartija - käänteinen välityspalvelinsovellus, jonka avulla voit integroida valtuutuksen Keycloakin kautta.
  • käytävä - sovellus, joka luo konfiguraation kubectl:lle, jolla voit kirjautua sisään ja muodostaa yhteyden Kubernetes API:hen OpenID:n kautta.

Miten käyttöoikeudet toimivat Kubernetesissa.

Voimme hallita käyttäjien / ryhmien oikeuksia RBAC: n avulla, tästä on jo luotu joukko artikkeleita, en käsittele tätä yksityiskohtaisesti. Ongelmana on, että RBAC:n avulla voit rajoittaa käyttäjien oikeuksia, mutta Kubernetes ei tiedä käyttäjistä mitään. Osoittautuu, että tarvitsemme käyttäjien toimitusmekanismin Kubernetesiin. Tätä varten lisäämme Kuberntes OpenID:hen palveluntarjoajan, joka sanoo, että tällainen käyttäjä todella on olemassa, ja Kubernetes itse antaa hänelle oikeudet.

Koulutus

  • Tarvitset Kubernetes-klusterin tai minikubin
  • Active Directory
  • Verkkotunnukset:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Varmenne verkkotunnuksille tai itse allekirjoitettu varmenne

En käsittele itse allekirjoitetun varmenteen luomista, sinun on luotava 2 varmennetta, tämä on *.example.org-verkkotunnuksen juuri (varmenteen myöntäjä) ja jokerimerkkiasiakas

Kun olet vastaanottanut / myöntänyt varmenteita, asiakas on lisättävä Kubernetesiin, tätä varten luomme sille salaisuuden:

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

Seuraavaksi käytämme sitä Ingress-ohjaimessamme.

Avaimenperän asennus

Päätin, että helpoin tapa on käyttää tähän valmiita ratkaisuja, nimittäin ruorikarttoja.

Asenna arkisto ja päivitä se:

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

Luo keycloak.yml-tiedosto, jossa on seuraava sisältö:

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

Liiton asetukset

Siirry seuraavaksi verkkokäyttöliittymään keycloak.example.org

Napsauta vasemmassa kulmassa Lisää valtakunta

avain
Arvo

Nimi
kuvernööri

Näytön nimi
Kubernetes

Poista käyttäjän sähköpostin vahvistus käytöstä:
Asiakasalueet —> Sähköposti —> Mappers —> Sähköposti vahvistettu (Poista)

Perustimme liittämisen tuomaan käyttäjiä ActiveDirectorysta, jätän kuvakaappaukset alle, luulen sen olevan selkeämpi.

Käyttäjien yhdistäminen —> Lisää tarjoaja... —> ldap

Liiton asetuksetKiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla
Kiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Jos kaikki on hyvin, niin painikkeen painamisen jälkeen Synkronoi kaikki käyttäjät näet viestin onnistuneesta käyttäjien tuonnista.

Seuraavaksi meidän on kartoitettava ryhmämme

Käyttäjien yhdistäminen --> ldap_localhost --> Mappers --> Create

Kartantekijän luominenKiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Asiakkaan asetukset

On tarpeen luoda asiakas, Keycloakin kannalta tämä on sovellus, joka valtuutetaan häneltä. Korostan tärkeät kohdat kuvakaappauksessa punaisella.

Asiakkaat —> Luo

Asiakkaan asetuksetKiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Luodaan scoupe ryhmille:

Asiakasalueet —> Luo

Luo laajuusKiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Ja perustaa heille kartoittaja:

Asiakasalueet —> ryhmät —> kartoittajat —> Luo

MapperKiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Lisää ryhmiemme kartoitus oletusasiakasalueisiin:

Asiakkaat —> kubernetes —> asiakasalueet —> oletusasiakasalueet
valita ryhmät в Saatavilla olevat asiakasalueetpainamalla Lisää valitut

Saamme salaisuuden (ja kirjoitamme sen säiettä), jota käytämme valtuutukseen Keycloakissa:

Asiakkaat —> kubernetes —> valtuustiedot —> salainen
Tämä viimeistelee asennuksen, mutta minulla oli virhe, kun sain onnistuneen valtuutuksen jälkeen virheilmoituksen 403. Virhe raportti.

Korjata:

Client Scopes —> roolit —> Mappers —> Create

mapperKiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Script Code

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

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

Kubernetesin määrittäminen

Meidän on määritettävä, missä sivuston juurivarmennemme sijaitsee ja missä OIDC-toimittaja sijaitsee.
Voit tehdä tämän muokkaamalla tiedostoa /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
...

Päivitä kubeadm-kokoonpano klusterissa:

kubeadmconfig

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
...

Asetetaan todennusvälityspalvelinta

Voit käyttää keycloak gatekeeperiä suojataksesi verkkosovelluksesi. Sen lisäksi, että tämä käänteinen välityspalvelin valtuuttaa käyttäjän ennen sivun näyttämistä, se välittää myös tietoja sinusta loppusovellukselle otsikoissa. Näin ollen, jos sovelluksesi tukee OpenID:tä, käyttäjä valtuutetaan välittömästi. Harkitse esimerkkiä Kubernetes Dashboardista

Kubernetes Dashboardin asentaminen


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

arvot_dashboard.yaml

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

Käyttöoikeuksien asettaminen:

Luodaan ClusterRoleBinding, joka antaa klusterin järjestelmänvalvojan oikeudet (vakio ClusterRole cluster-admin) DataOPS-ryhmän käyttäjille.


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

Asenna 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

arvot_välityspalvelin.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"

Sen jälkeen, kun yrität mennä kubernetes-dashboard.example.org, meidät ohjataan Keycloakiin ja onnistuneen valtuutuksen onnistuessa pääsemme jo sisäänkirjautuneena Dashboardiin.

käytävän asennus

Mukavuuden vuoksi voit lisätä käytävän, joka luo konfigurointitiedoston kubectlille, jonka avulla pääsemme käyttäjämme alaisuuteen Kubernetesiin.


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

arvot_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-----

Näyttää tältä. Voit ladata konfigurointitiedoston välittömästi ja luoda sen käyttämällä komentosarjaa:

Kiinnitämme ActiveDirectory-valtuutuksen Kubernetesiin Keycloakin avulla

Lähde: will.com

Lisää kommentti