Ni fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

Ĉi tiu artikolo estis skribita por pligrandigi la jam ekzistanta, sed parolas pri la funkcioj de la pakaĵo kun Microsoft ActiveDirectory, kaj ankaŭ kompletigas ĝin.

En ĉi tiu artikolo mi rakontos al vi kiel instali kaj agordi:

  • ŝlosilmantelo estas malfermkoda projekto. Kiu provizas ununuran punkton de eniro por aplikoj. Funkcias kun multaj protokoloj, inkluzive de LDAP kaj OpenID, pri kiuj ni interesiĝas.
  • ŝlosilmantelo pordisto - inversa prokura aplikaĵo, kiu ebligas al vi integri rajtigon per Keycloak.
  • pasejo - aplikaĵo, kiu generas agordon por kubectl, per kiu vi povas ensaluti kaj konektiĝi al la Kubernetes API per OpenID.

Kiel funkcias permesoj en Kubernetes.

Ni povas administri uzant-/grupajn rajtojn uzante RBAC, amaso da artikoloj jam estis kreitaj pri tio, mi ne detale detale pri tio. La problemo estas, ke vi povas uzi RBAC por limigi uzantrajtojn, sed Kubernetes scias nenion pri uzantoj. Rezultas, ke ni bezonas uzantan liveran mekanismon en Kubernetes. Por fari tion, ni aldonos provizanton al Kuberntes OpenID, kiu diros, ke tia uzanto vere ekzistas, kaj Kubernetes mem donos al li la rajtojn.

Trejnado

  • Vi bezonos Kubernetes-areton aŭ minikube
  • Aktiva Dosierujo
  • Domajnoj:
    keycloak.example.org
    kubernetes-dashboard.example.org
    pasejo.ekzemplo.org
  • Atestilo por domajnoj aŭ memsubskribita atestilo

Mi ne pritraktos kiel krei memsubskribitan atestilon, vi devas krei 2 atestojn, ĉi tio estas la radiko (Atestila Aŭtoritato) kaj ĵokera kliento por la domajno *.example.org.

Post kiam vi ricevas/eldonos atestojn, la kliento devas esti aldonita al Kubernetes, por tio ni kreas sekreton por ĝi:

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

Poste, ni uzos ĝin por nia Ingress-regilo.

Instalado de Keycloak

Mi decidis, ke la plej facila maniero estas uzi pretajn solvojn por ĉi tio, nome stirilaj leteroj.

Instalu la deponejon kaj ĝisdatigu ĝin:

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

Kreu keycloak.yml dosieron kun la sekva enhavo:

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

Federacia aranĝo

Tuj poste, iru al la retinterfaco keycloak.example.org

Klaku en la maldekstra angulo Aldonu regnon

ŝlosilo
valoro

Nomo
kubernetoj

Montri Nomo
Kubernetoj

Malebligu uzantan retpoŝtan konfirmon:
Klientokampoj —> Retpoŝto —> Mapistoj —> Retpoŝto kontrolita (Forigi)

Ni starigis federacion por importi uzantojn el ActiveDirectory, mi lasos ekrankopiojn sube, mi pensas, ke ĝi estos pli klara.

Uzantfederacio —> Aldoni provizanton... —> ldap

Federacia aranĝoNi fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak
Ni fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

Se ĉio estas en ordo, tiam post premado de la butono Sinkronigu ĉiujn uzantojn vi vidos mesaĝon pri la sukcesa importo de uzantoj.

Poste ni devas mapi niajn grupojn

Uzantfederacio --> ldap_localhost --> Mapistoj --> Krei

Kreante mapistonNi fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

Klienta agordo

Necesas krei klienton, laŭ Keycloak, ĉi tio estas aplikaĵo, kiu estos rajtigita de li. Mi reliefigos la gravajn punktojn en la ekrankopio ruĝe.

Klientoj —> Krei

Klienta agordoNi fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

Ni kreu scoupe por grupoj:

Kliento Amplekso —> Krei

Krei ampleksonNi fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

Kaj starigu mapigilon por ili:

Kliento Amplekso —> grupoj —> Mapistoj —> Krei

MapistoNi fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

Aldonu la mapadon de niaj grupoj al la Defaŭltaj Klientaj Amplekso:

Klientoj —> kubernetes —> Kliento-Ampleksoj —> Defaŭlta Kliento-Amplekso
Elektu grupoj в Disponeblaj Kliento-Ampleksoj, premu Aldoni elektitan

Ni ricevas la sekreton (kaj skribas ĝin al la fadeno) kiun ni uzos por rajtigo en Keycloak:

Klientoj —> kubernetes —> Akreditaĵoj —> Sekreto
Ĉi tio kompletigas la aranĝon, sed mi havis eraron kiam, post sukcesa rajtigo, mi ricevis eraron 403. Cimraporto.

Ripari:

Kliento Amplekso —> roloj —> Mapistoj —> Krei

MapistoNi fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

Skriptokodo

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

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

Agordante Kubernetes

Ni devas specifi kie troviĝas nia radika atestilo de la retejo, kaj kie troviĝas la OIDC-provizanto.
Por fari tion, redaktu la dosieron /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
...

Ĝisdatigu kubeadm-agordon en la areto:

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

Agordi aŭth-proxy

Vi povas uzi keycloak gatekeeper por protekti vian retejon. Krom la fakto, ke ĉi tiu inversa prokurilo rajtigos la uzanton antaŭ ol montri la paĝon, ĝi ankaŭ transdonos informojn pri vi en la kaplinioj al la fina aplikaĵo. Tiel, se via aplikaĵo subtenas OpenID, tiam la uzanto tuj estas rajtigita. Konsideru la ekzemplon de Kubernetes Dashboard

Instalante Kubernetes Dashboard


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'

Agordi alirrajtojn:

Ni kreu ClusterRoleBinding, kiu donos al cluster-administran rajtojn (norma ClusterRole cluster-admin) por uzantoj en la DataOPS-grupo.


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

Instalu 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

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

Post tio, kiam vi provas iri al kubernetes-dashboard.example.org, ni estos redirektitaj al Keycloak kaj en kazo de sukcesa rajtigo ni alvenos al la Dashboard jam ensalutinta.

pasejinstalado

Por komforto, vi povas aldoni pasejon, kiu generos agordan dosieron por kubectl, kun la helpo de kiu ni eniros Kubernetes sub nia uzanto.


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

Aspektas tiel. Ebligas vin tuj elŝuti la agordan dosieron kaj generi ĝin per aro da komandoj:

Ni fiksas ActiveDirectory-rajtigon al Kubernetes per Keycloak

fonto: www.habr.com

Aldoni komenton