Urang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

Artikel ieu geus ditulis rék dilegakeun dina geus aya, tapi ceramah ngeunaan fitur tina kebat jeung Microsoft ActiveDirectory, sarta complements eta.

Dina tulisan ieu kuring bakal nyarioskeun ka anjeun kumaha masang sareng ngonpigurasikeun:

  • keycloak mangrupa proyék open source. Anu nyayogikeun hiji titik éntri pikeun aplikasi. Gawéna sareng seueur protokol, kalebet LDAP sareng OpenID anu dipikaresep ku urang.
  • keycloak gatekeeper - aplikasi proxy sabalikna nu ngidinan Anjeun pikeun ngahijikeun otorisasina ngaliwatan Keycloak.
  • gangway - hiji aplikasi nu ngahasilkeun config pikeun kubectl kalawan nu bisa asup tur nyambung ka API Kubernetes ngaliwatan OpenID.

Kumaha idin dianggo dina Kubernetes.

Urang tiasa ngatur hak pangguna / grup nganggo RBAC, sakumpulan tulisan anu parantos didamel ngeunaan ieu, kuring moal ngémutan hal ieu sacara rinci. Masalahna nyaéta anjeun tiasa nganggo RBAC pikeun ngawatesan hak pangguna, tapi Kubernetes henteu terang nanaon ngeunaan pangguna. Tétéla urang peryogi mékanisme pangiriman pangguna dina Kubernetes. Jang ngalampahkeun ieu, urang bakal nambahan panyadia kana Kuberntes OpenID, nu bakal nyebutkeun yén pamaké misalna bener aya, sarta Kubernetes sorangan bakal masihan anjeunna hak.

palatihan

  • Anjeun peryogi klaster Kubernetes atanapi minikube
  • aktif Diréktori
  • Domain:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Sertipikat pikeun domain atanapi sertipikat anu ditandatanganan sorangan

Kuring moal Huni on cara nyieun sertipikat timer ditandatanganan, Anjeun kudu nyieun 2 sertipikat, ieu akar (Otoritas Sertipikat) jeung klien wildcard pikeun domain *.example.org

Saatos anjeun nampi / ngaluarkeun sertipikat, klien kedah diasupkeun kana Kubernetes, pikeun ieu kami nyiptakeun rusiah pikeun éta:

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

Salajengna, kami bakal nganggo éta pikeun pangontrol Ingress kami.

Pamasangan Keycloak

Kuring mutuskeun yén cara panggampangna nyaéta ngagunakeun solusi anu siap-siap pikeun ieu, nyaéta bagan helm.

Pasang Repository sareng ngapdet éta:

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

Jieun file keycloak.yml sareng eusi ieu:

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

Setélan Federation

Salajengna, buka panganteur web keycloak.example.org

Klik di belah kénca juru Tambahkeun karajaan

konci
ajen

nami
kubernetes

Nami tayang
Kubernetes

Pareuman verifikasi email pangguna:
Lingkup klien -> Surélék -> Mappers -> Surélék diverifikasi (Hapus)

Urang nyetél federasi pikeun ngimpor pamaké ti ActiveDirectory, Kuring bakal ninggalkeun Potret layar handap, Jigana bakal leuwih jelas.

Federasi pamaké -> Tambihkeun panyadia… -> ldap

Setélan FederationUrang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak
Urang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

Upami sadayana saé, teras saatos mencét tombol Singkronkeun sadaya pangguna anjeun bakal ningali pesen ngeunaan suksés impor pangguna.

Salajengna urang kedah peta grup urang

Federasi pamaké -> ldap_localhost -> Mappers -> Jieun

Nyieun mapper aUrang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

Setélan klien

Perlu nyiptakeun klien, dina hal Keycloak, ieu mangrupikeun aplikasi anu bakal diidinan ti anjeunna. Kuring bakal nyorot titik penting dina screenshot beureum.

Klién -> Jieun

Setélan klienUrang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

Hayu urang nyieun scoupe pikeun grup:

Lingkup Klién -> Jieun

Jieun wengkuanUrang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

Sareng pasang mapper pikeun aranjeunna:

Lingkup Klién -> grup -> Mappers -> Jieun

MapperUrang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

Tambihkeun pemetaan grup kami ka Lingkup Klién Default:

Klién —> kubernetes —> Lingkup Klién —> Lingkup Klién Default
Pilih grup в wengkuan klien sadiamalik Tambahkeun dipilih

Kami nampi rusiah (sareng nyerat kana benang) anu bakal kami anggo pikeun otorisasina dina Keycloak:

Klién -> kubernetes -> Kapercayaan -> Rahasia
Ieu ngalengkepan setélan, tapi kuring ngagaduhan kasalahan nalika, saatos otorisasi suksés, kuring nampi kasalahan 403. laporan bug.

Ngalereskeun:

Lingkup Klién -> kalungguhan -> Mappers -> Jieun

MappersUrang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

Kode Aksara

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

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

Ngonpigurasikeun Kubernetes

Urang kudu nangtukeun mana sertipikat root kami ti loka perenahna, sarta dimana panyadia OIDC lokasina.
Jang ngalampahkeun ieu, édit file /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
...

Apdet kubeadm config dina kluster:

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

Nyetél auth-proxy

Anjeun tiasa nganggo keycloak gatekeeper pikeun ngajagi aplikasi wéb anjeun. Salian kanyataan yén proxy sabalikna ieu bakal otorisasi pamaké saméméh némbongkeun kaca, éta ogé bakal ngalirkeun informasi ngeunaan anjeun ka aplikasi tungtung dina headers. Janten, upami aplikasi anjeun ngadukung OpenID, maka pangguna langsung otorisasi. Pertimbangkeun conto Kubernetes Dashboard

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

Nyetél hak aksés:

Hayu urang ngadamel ClusterRoleBinding anu bakal masihan hak admin klaster (baku ClusterRole klaster-admin) pikeun pangguna dina grup 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

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

Sanggeus éta, nalika anjeun nyoba buka kubernetes-dashboard.example.org, urang bakal dialihkeun ka Keycloak jeung bisi otorisasina suksés urang bakal meunang ka Dashboard geus asup.

pamasangan gangway

Pikeun genah, anjeun tiasa nambihan gangway anu bakal ngahasilkeun file config pikeun kubectl, kalayan bantosan anu kami bakal lebet kana Kubernetes handapeun pangguna kami.


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

Sigana mah kieu. Ngidinan anjeun langsung ngaunduh file config sareng ngahasilkeunna nganggo sakumpulan paréntah:

Urang nyepetkeun otorisasina ActiveDirectory ka Kubernetes maké Keycloak

sumber: www.habr.com

Tambahkeun komentar