Við festum ActiveDirectory heimild til Kubernetes með Keycloak

Þessi grein hefur verið skrifuð til að víkka út nú þegar núverandi, en talar um eiginleika búntsins með Microsoft ActiveDirectory og bætir það einnig við.

Í þessari grein mun ég segja þér hvernig á að setja upp og stilla:

  • lyklaklæði er opinn hugbúnaður. Sem veitir einn aðgangsstað fyrir umsóknir. Virkar með mörgum samskiptareglum, þar á meðal LDAP og OpenID sem við höfum áhuga á.
  • lyklaklæði hliðvörður - öfugt umboðsforrit sem gerir þér kleift að samþætta heimild í gegnum Keycloak.
  • Gangbraut - forrit sem býr til stillingu fyrir kubectl sem þú getur skráð þig inn og tengst Kubernetes API í gegnum OpenID.

Hvernig heimildir virka í Kubernetes.

Við getum stjórnað notenda- / hópréttindum með því að nota RBAC, fullt af greinum hefur þegar verið búið til um þetta, ég ætla ekki að staldra við þetta í smáatriðum. Vandamálið er að þú getur notað RBAC til að takmarka notendaréttindi, en Kubernetes veit ekkert um notendur. Það kemur í ljós að við þurfum afhendingarkerfi notenda í Kubernetes. Til að gera þetta munum við bæta þjónustuveitu við Kuberntes OpenID, sem mun segja að slíkur notandi sé raunverulega til, og Kubernetes sjálft mun veita honum réttindin.

Þjálfun

  • Þú þarft Kubernetes þyrping eða minikube
  • Active Directory
  • Lén:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Vottorð fyrir lén eða sjálfundirritað vottorð

Ég ætla ekki að staldra við hvernig á að búa til sjálfstætt undirritað vottorð, þú þarft að búa til 2 vottorð, þetta er rótin (vottorðsyfirvöld) og algildisbiðlari fyrir *.example.org lénið

Eftir að þú hefur fengið / gefið út vottorð verður að bæta viðskiptavininum við Kubernetes, til þess búum við til leyndarmál fyrir hann:

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

Næst munum við nota það fyrir Ingress stjórnandi okkar.

Keycloak uppsetning

Ég ákvað að auðveldast væri að nota tilbúnar lausnir fyrir þetta, nefnilega stýrikort.

Settu upp geymsluna og uppfærðu hana:

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

Búðu til keycloak.yml skrá með eftirfarandi efni:

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

Uppsetning sambandsins

Næst skaltu fara í vefviðmótið keycloak.example.org

Smelltu í vinstra hornið Bæta við ríki

Key
gildi

heiti
Kubernetes

Sýna nafn
Kubernetes

Slökkva á staðfestingu á tölvupósti notanda:
Umfang viðskiptavinar —> Tölvupóstur —> Kortagerðarmenn —> Tölvupóstur staðfestur (Eyða)

Við settum upp bandalag til að flytja inn notendur frá ActiveDirectory, ég mun skilja eftir skjámyndir hér að neðan, ég held að það verði skýrara.

Notendasamband —> Bæta við þjónustuaðila... —> ldap

Uppsetning sambandsinsVið festum ActiveDirectory heimild til Kubernetes með Keycloak
Við festum ActiveDirectory heimild til Kubernetes með Keycloak

Ef allt er í lagi, þá eftir að hafa ýtt á hnappinn Samstilltu alla notendur þú munt sjá skilaboð um árangursríkan innflutning notenda.

Næst þurfum við að kortleggja hópana okkar

Notendasamband --> ldap_localhost --> Kortagerðarmenn --> Búa til

Að búa til kortagerðarmannVið festum ActiveDirectory heimild til Kubernetes með Keycloak

Uppsetning viðskiptavinar

Það er nauðsynlegt að búa til viðskiptavin, hvað varðar Keycloak, þetta er forrit sem verður heimilað frá honum. Ég mun undirstrika mikilvæg atriði í skjámyndinni með rauðu.

Viðskiptavinir —> Búa til

Uppsetning viðskiptavinarVið festum ActiveDirectory heimild til Kubernetes með Keycloak

Við skulum búa til scoupe fyrir hópa:

Umfang viðskiptavina —> Búa til

Búðu til svigrúmVið festum ActiveDirectory heimild til Kubernetes með Keycloak

Og settu upp kortara fyrir þá:

Umfang viðskiptavina —> hópar —> Kortagerðarmenn —> Búa til

KortagerðarmaðurVið festum ActiveDirectory heimild til Kubernetes með Keycloak

Bættu kortlagningu hópa okkar við sjálfgefið viðskiptasvið:

Viðskiptavinir —> kubernetes —> Umfang viðskiptavina —> Sjálfgefið umfang viðskiptavinar
Veldu hópar в Laus viðskiptavinarsviðsmellur Bæta við völdum

Við fáum leyndarmálið (og skrifum það á þráðinn) sem við munum nota fyrir heimild í Keycloak:

Viðskiptavinir —> kubernetes —> Skilríki —> Leyndarmál
Þetta lýkur uppsetningunni, en ég fékk villu þegar ég fékk villu 403 eftir að hafa fengið heimild. Villuskýrsla.

Laga:

Umfang viðskiptavina —> hlutverk —> Kortagerðarmenn —> Búa til

KortagerðVið festum ActiveDirectory heimild til Kubernetes með Keycloak

Handritskóði

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

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

Stillir Kubernetes

Við þurfum að tilgreina hvar rótarvottorð okkar frá síðunni liggur og hvar OIDC veitandinn er staðsettur.
Til að gera þetta, breyttu skránni /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
...

Uppfærðu kubeadm stillingar í þyrpingunni:

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

Auth-proxy stillt

Þú getur notað keycloak hliðvörð til að vernda vefforritið þitt. Auk þeirrar staðreyndar að þessi andstæða umboð mun heimila notandanum áður en hún sýnir síðuna, mun hann einnig senda upplýsingar um þig til lokaforritsins í hausunum. Þannig, ef forritið þitt styður OpenID, þá hefur notandinn strax heimild. Skoðum dæmið um Kubernetes mælaborðið

Setur upp Kubernetes mælaborð


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'

Aðgangsréttur stilltur:

Við skulum búa til ClusterRoleBinding sem mun veita cluster admin réttindi (venjulegt ClusterRole cluster-admin) fyrir notendur í DataOPS hópnum.


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

Settu upp keycloak hliðvörð:


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"

Eftir það, þegar þú reynir að fara til kubernetes-dashboard.example.org, okkur verður vísað áfram á Keycloak og ef heimildin er heppnuð munum við komast á stjórnborðið sem þegar er skráð inn.

uppsetning landganga

Til hægðarauka geturðu bætt við landgangi sem mun búa til stillingarskrá fyrir kubectl, með hjálp hennar munum við komast inn í Kubernetes undir notandanum okkar.


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

Lítur svona út. Gerir þér kleift að hlaða niður stillingarskránni strax og búa til hana með því að nota skipanir:

Við festum ActiveDirectory heimild til Kubernetes með Keycloak

Heimild: www.habr.com

Bæta við athugasemd