Em bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Ev gotar bi armanca berfirehkirina berê hatiye nivîsandin heyî, lê li ser taybetmendiyên pêwendiyê bi taybetî bi Microsoft ActiveDirectory re diaxive, û wê jî temam dike.

Di vê gotarê de ez ê ji we re vebêjim ka meriv çawa saz dike û mîheng dike:

  • keycloak projeyek çavkaniyek vekirî ye. Ku ji bo serîlêdanan xalek têketinê ya yekane peyda dike. Bi gelek protokolan re dixebite, di nav de LDAP û OpenID, ku ji me re eleqedar in.
  • Keycloak dergevan - serîlêdanek proxy berevajî ku dihêle hûn bi rêya Keycloak destûrnameyê yek bikin.
  • Gangway - serîlêdanek ku ji bo kubectl vesaziyek çêdike ku hûn pê re dikarin bi OpenID ve têkevinê û bi Kubernetes API-yê ve girêdin.

Çawa destûr di Kubernetes de dixebitin.

Em dikarin mafên bikarhêner / komê bi karanîna RBAC-ê bi rêve bibin, jixwe komek gotar li ser vê yekê hatine afirandin, ez ê bi hûrgulî li ser vê yekê nesekinim. Pirsgirêk ev e ku hûn dikarin RBAC bikar bînin da ku mafên bikarhêner sînordar bikin, lê Kubernetes di derbarê bikarhêneran de tiştek nizane. Derket holê ku em hewceyê mekanîzmayek radestkirina bikarhêner li Kubernetes in. Ji bo vê yekê, em ê pêşkêşkerek li Kuberntes OpenID zêde bikin, ku dê destnîşan bike ku bikarhênerek wusa bi rastî heye, û Kubernetes bixwe dê mafan bide wî.

Amadekirin

  • Hûn ê hewceyê komek Kubernetes an minikube bin
  • Dîra Active Active
  • Domain:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sertîfîka ji bo domanan an sertîfîkaya xwe-îmzakirî

Ez ê bi hûrgulî neçim ka meriv çawa sertîfîkayek xwe-îmzakirî biafirîne; hûn hewce ne ku 2 sertîfîkayan biafirînin, ev kok (Desthilatdariya Sertîfîkayê) û qertafa xerîdar e ji bo domaina *.example.org

Piştî ku hûn sertîfîkayan werdigirin/nivîsin, hûn hewce ne ku sertîfîkaya xerîdar li Kubernetes zêde bikin; ji bo vê yekê, ji bo wê nepeniyek biafirînin:

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

Dûv re em ê wê ji bo kontrolkera xweya Ingress bikar bînin

Sazkirina Keycloak

Min biryar da ku riya herî hêsan ev bû ku ji bo vê yekê çareseriyên amade bikar bînin, ango nexşeyên helm.

Depoyê saz bikin û wê nûve bikin:

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

Bi naveroka jêrîn pelek keycloak.yml biafirînin:

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

Sazkirina Federasyonê

Piştre, biçin navrûya webê keycloak.example.org

Li quncika çepê bikirtînin Herêmê zêde bikin

Qûfle
Giranî

Nav
Kubernetes

Navekî Display
Kubernetes

Kontrolkirina pejirandina e-nameya bikarhêner neçalak bike:
Qadên xerîdar —> E-name —> Nexşeyan —> E-name piştrastkirî (Jêbibe)

Em federasyonek saz dikin da ku bikarhêneran ji ActiveDirectory derxînin, ez ê dîmenên li jêr bihêlim, ez difikirim ku ew ê zelaltir be.

Federasyona Bikarhêner —> Pêşkêşker lê zêde bike… —> ldap

Sazkirina FederasyonêEm bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin
Em bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Ger her tişt baş e, wê hingê piştî pêlkirina bişkojkê Hemî bikarhêneran senkronîze bikin Hûn ê peyamek bibînin ku têketina serketî ya bikarhêneran destnîşan dike.

Piştre divê em komên xwe nexşeyê bikin

Federasyona bikarhêner -> ldap_localhost -> Mappers -> Afirandin

Çêkirina nexşerêEm bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Sazkirina xerîdar

Pêdivî ye ku hûn xerîdarek biafirînin, di warê Keycloak de ev serîlêdanek e ku dê ji hêla wê ve were destûr kirin. Ez ê di dîmenê de xalên girîng bi rengê sor ronî bikim.

Xerîdar -> Create

Sazkirina xerîdarEm bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Werin em ji bo koman kopiyek biafirînin:

Qadên Xerîdar -> Afirandin

Çêkirina çarçoveyekEm bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Û ji wan re nexşeyek saz bikin:

Qadên Xerîdar -> Kom -> Nexşesaz -> Afirandin

MapperEm bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Em nexşeya komên xwe li Qadeyên Xerîdar ên Pêşbirk zêde dikin:

Xerîdar -> kubernetes -> Qada xerîdar -> Qada xerîdar a xwerû
Em hilbijêre komên в Qadên Xerîdar ên Berdest, çap bikin Hilbijartî zêde bike

Em razê digirin (û wê li cîhek binivîsin) ku em ê ji bo destûrnameyê li Keycloak bikar bînin:

Xerîdar -> kubernetes -> pêbawer -> veşartî
Ev sazkirinê temam dike, lê gava ku, piştî destûrnameya serketî, min xeletiyek 403 wergirt, xeletiyek min derket. Rapora xeletiyê.

Pêvekirin:

Qadên Xerîdar -> Role -> Mappers -> Afirandin

MappersEm bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Koda skrîptê

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

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

Veavakirina Kubernetes

Pêdivî ye ku em destnîşan bikin ka sertîfîkaya meya root ji malperê li ku ye, û peydakerê OIDC li ku ye.
Ji bo vê yekê, pelê biguherînin /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
...

Veavakirina kubeadm di komê de nûve bikin:

kubeadm veavakirina

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

Sazkirina auth-proxy

Ji bo parastina serîlêdana weba xwe, hûn dikarin keycloak gatekeeper bikar bînin. Digel vê yekê ku ev proxy berevajî dê destûr bide bikarhêner berî ku rûpelê nîşan bide, ew ê di sernavan de agahdariya we jî ji serîlêdana paşîn re bişîne. Ji ber vê yekê, heke serîlêdana we OpenID piştgirî dike, bikarhêner tavilê destûr tê dayîn. Ka em li mînaka Kubernetes Dashboard binêrin

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

Sazkirina mafên gihîştinê:

Werin em ClusterRoleBindingek biafirînin ku dê mafên rêvebirê komê (standard ClusterRole-rêvebir) bide bikarhênerên di koma DataOPS de.


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

Sazkirina dergehê keycloak:


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"

Piştî vê yekê, gava ku hûn hewl didin ku têkevinê kubernetes-dashboard.example.org, beralîkirinek ji Keycloak re dê çêbibe û ger destûrname serketî be, em ê bibin Dashboard-a ku jixwe têketine.

Sazkirina Gangway

Ji bo rehetiyê, hûn dikarin gangwayek lê zêde bikin ku dê pelek mîhengê ji bo kubectl çêbike, bi alîkariya wê em ê têkevin Kubernetes di bin bikarhênerê xwe de.


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

Tiştekî wiha xuya dike. Destûrê dide we ku hûn tavilê pelek mîhengê dakêşin û wê bi karanîna komek fermanan çêbikin:

Em bi karanîna Keycloak destûrnameya ActiveDirectory li Kubernetes girêdidin

Source: www.habr.com

Add a comment