Biz LDAP avtorizatsiyasini Kubernetesga mahkamlaymiz

Biz LDAP avtorizatsiyasini Kubernetesga mahkamlaymiz

Kubernetes-ni LDAP serveringizga ulash va foydalanuvchilar va guruhlar importini sozlash uchun Keycloak-dan qanday foydalanish bo'yicha kichik qo'llanma. Bu sizga foydalanuvchilaringiz uchun RBAC-ni sozlash va Kubernetes Dashboard va o'zlarini avtorizatsiya qilishni bilmagan boshqa ilovalarni himoya qilish uchun auth-proxy-dan foydalanish imkonini beradi.

Keycloak o'rnatish

Faraz qilaylik, sizda allaqachon LDAP serveri bor. Bu Active Directory, FreeIPA, OpenLDAP yoki boshqa bo'lishi mumkin. Agar sizda LDAP serveri bo'lmasa, printsipial jihatdan siz Keycloak interfeysida foydalanuvchilarni yaratishingiz yoki ommaviy oidc provayderlaridan (Google, Github, Gitlab) foydalanishingiz mumkin, natija deyarli bir xil bo'ladi.

Avvalo, Keycloak-ning o'zini o'rnatamiz, o'rnatish alohida yoki to'g'ridan-to'g'ri Kubernetes klasteriga amalga oshirilishi mumkin, qoida tariqasida, agar sizda bir nechta Kubernetes klasterlari bo'lsa, uni alohida o'rnatish osonroq bo'ladi. Boshqa tomondan, siz har doim foydalanishingiz mumkin rasmiy rul jadvali va uni to'g'ridan-to'g'ri klasteringizga o'rnating.

Keycloak ma'lumotlarini saqlash uchun sizga ma'lumotlar bazasi kerak bo'ladi. Asl qiymati h2 (barcha ma'lumotlar mahalliy sifatida saqlanadi), lekin undan foydalanish ham mumkin postgres, mysql yoki mariadb.
Agar siz hali ham Keycloak-ni alohida o'rnatishga qaror qilsangiz, batafsilroq ko'rsatmalarni topishingiz mumkin rasmiy hujjatlar.

Federatsiyani o'rnatish

Avvalo, keling, yangi soha yarataylik. Realm - bu bizning ilovamiz maydoni. Har bir ilova turli foydalanuvchilar va avtorizatsiya sozlamalari bilan o'z sohasiga ega bo'lishi mumkin. Asosiy sohani Keycloakning o'zi ishlatadi va uni boshqa narsa uchun ishlatish noto'g'ri.

Bu yerni bosing Hudud qo'shing

Option
qiymati

Ism
kubernetes

Ko'rsatiladigan ism
Kubernetes

HTML ko'rsatish nomi
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Kubernetes sukut bo'yicha foydalanuvchi elektron pochtasi tasdiqlangan yoki tasdiqlanmaganligini tekshiradi. Biz o'z LDAP serverimizdan foydalanayotganimiz sababli, bu tekshirish deyarli har doim qaytib keladi false. Keling, Kubernetesda ushbu sozlamaning namoyishini o'chirib qo'yaylik:

Mijoz doiralari -> Email -> Xaritachilar -> elektron pochta tasdiqlandi (O'chirish)

Endi federatsiyani tuzamiz, buning uchun biz boramiz:

Foydalanuvchilar federatsiyasi -> Provayder qoβ€˜shish… -> ldap

Mana FreeIPA uchun o'rnatish misoli:

Option
qiymati

Konsol nomi
freeipa.example.org

Sotuvchi
Red Hat Directory Server

UUID LDAP atributi
ipauniqueid

Ulanish URL
ldaps://freeipa.example.org

Foydalanuvchi DN
cn=users,cn=accounts,dc=example,dc=org

DNni bog'lash
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

Hisob ma'lumotlarini bog'lash
<password>

Kerberos autentifikatsiyasiga ruxsat bering:
on

Kerberos hududi:
EXAMPLE.ORG

Server direktori:
HTTP/[email protected]

kalit yorlig'i:
/etc/krb5.keytab

Foydalanuvchi keycloak-svc LDAP serverimizda oldindan yaratilgan bo'lishi kerak.

Active Directory bo'lsa, shunchaki tanlang Sotuvchi: Active Directory va kerakli sozlamalar avtomatik ravishda shaklga kiritiladi.

Bu yerni bosing saqlash

Endi davom etaylik:

Foydalanuvchilar federatsiyasi -> freeipa.example.org -> Xaritachilar -> Ism

Option
qiymati

Ldap atributlari
givenName

Endi guruh xaritasini yoqing:

Foydalanuvchilar federatsiyasi -> freeipa.example.org -> Xaritachilar -> yaratish

Option
qiymati

Ism
groups

Mapper turi
group-ldap-mapper

LDAP guruhlari DN
cn=groups,cn=accounts,dc=example,dc=org

Foydalanuvchilar guruhini olish strategiyasi
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Bu federatsiyani sozlashni yakunlaydi, keling, mijozni sozlashga o'tamiz.

Mijozni sozlash

Keling, yangi mijoz yarataylik (Keycloak-dan foydalanuvchilarni qabul qiladigan dastur). Qani ketdik:

Mijozlar -> yaratish

Option
qiymati

mijoz ID
kubernetes

Kirish turi
confidenrial

Ildiz URL
http://kubernetes.example.org/

Yaroqli qayta yo'naltirish URI'lari
http://kubernetes.example.org/*

Administrator URL-manzili
http://kubernetes.example.org/

Shuningdek, biz guruhlar uchun maydon yaratamiz:

Mijoz doiralari -> yaratish

Option
qiymati

Andoza
No template

Ism
groups

To'liq guruh yo'li
false

Va ular uchun xaritachini o'rnating:

Mijoz doiralari -> Guruhlar -> Xaritachilar -> yaratish

Option
qiymati

Ism
groups

Mapper turi
Group membership

Token daΚΌvo nomi
groups

Endi biz mijozlar doiramizda guruh xaritasini yoqishimiz kerak:

Mijozlar -> kubernetlar -> Mijoz doiralari -> Standart mijoz doiralari

Tanlaymiz Guruhlar Π² Mavjud mijozlar doiralaribosing Tanlangan qo'shish

Endi ilovamizning autentifikatsiyasini o'rnatamiz, o'ting:

Mijozlar -> kubernetlar

Option
qiymati

Avtorizatsiya yoqilgan
ON

Keling, turaylik Saqlash va bu mijozni sozlashni tugatadi, endi yorliqda

Mijozlar -> kubernetlar -> ishonch yorligi

olishingiz mumkin sir bundan keyinroq foydalanamiz.

Kubernetes sozlanmoqda

OIDC avtorizatsiyasi uchun Kubernetes-ni sozlash juda ahamiyatsiz va unchalik murakkab narsa emas. Sizga kerak bo'lgan yagona narsa OIDC serveringizning CA sertifikatini qo'yishdir /etc/kubernetes/pki/oidc-ca.pem va kube-apiserver uchun kerakli variantlarni qo'shing.
Buning uchun yangilang /etc/kubernetes/manifests/kube-apiserver.yaml barcha ustalaringiz haqida:

...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

Shuningdek, yangilanish paytida ushbu sozlamalarni yo'qotmaslik uchun klasterdagi kubeadm konfiguratsiyasini yangilang:

kubectl edit -n kube-system configmaps kubeadm-config

...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

Bu Kubernetes sozlamalarini yakunlaydi. Ushbu amallarni barcha Kubernetes klasterlarida takrorlashingiz mumkin.

Dastlabki avtorizatsiya

Ushbu qadamlardan so'ng siz allaqachon OIDC avtorizatsiyasi bilan tuzilgan Kubernetes klasteriga ega bo'lasiz. Yagona jihat shundaki, sizning foydalanuvchilaringiz hali mijoz sozlanmagan, shuningdek, o'zlarining kubeconfig. Ushbu muammoni hal qilish uchun muvaffaqiyatli avtorizatsiyadan so'ng foydalanuvchilarga kubeconfig avtomatik emissiyasini sozlashingiz kerak.

Buni amalga oshirish uchun siz foydalanuvchini autentifikatsiya qilish va keyin tugallangan kubeconfigni yuklab olish imkonini beruvchi maxsus veb-ilovalardan foydalanishingiz mumkin. Eng qulaylaridan biri Kuberos, bu sizga barcha Kubernetes klasterlarini bitta konfiguratsiyada tasvirlash va ular orasida osongina almashish imkonini beradi.

Kuberosni sozlash uchun kubeconfig shablonini tavsiflash va uni quyidagi parametrlar bilan ishga tushirish kifoya:

kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template

Batafsil ma'lumot uchun qarang foydalanish Github-da.

Foydalanish ham mumkin kubelogin agar siz to'g'ridan-to'g'ri foydalanuvchi kompyuterida avtorizatsiya qilishni xohlasangiz. Bunday holda, foydalanuvchi localhost-da avtorizatsiya shakli bilan brauzerni ochadi.

Olingan kubeconfigni saytda tekshirish mumkin jwt.io. Faqat qiymatni nusxalash users[].user.auth-provider.config.id-token kubeconfig dan saytdagi formaga o'ting va darhol transkriptni oling.

RBAC sozlamalari

RBAC-ni sozlashda siz ikkala foydalanuvchi nomiga ham murojaat qilishingiz mumkin (maydon name jwt tokenida) va bir guruh foydalanuvchilar uchun (maydon groups jwt tokenida). Bu erda guruh uchun ruxsatlarni o'rnatish misoli keltirilgan kubernetes-default-namespace-admins:

kubernetes-default-namespace-admins.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: default-admins
  namespace: default
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-default-namespace-admins
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: default-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: kubernetes-default-namespace-admins

RBAC uchun ko'proq misollarni topish mumkin rasmiy Kubernetes hujjatlari

Autx-proksini sozlash

Ajoyib loyiha bor kalit plash-darvoza qo'riqchisi, bu foydalanuvchiga OIDC serveriga autentifikatsiya qilish imkonini berish orqali har qanday ilovani himoya qilish imkonini beradi. Men buni misol sifatida Kubernetes boshqaruv paneli yordamida qanday sozlashni ko'rsataman:

asboblar paneli-proxy.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kubernetes-dashboard-proxy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: kubernetes-dashboard-proxy
    spec:
      containers:
      - args:
        - --listen=0.0.0.0:80
        - --discovery-url=https://keycloak.example.org/auth/realms/kubernetes
        - --client-id=kubernetes
        - --client-secret=<your-client-secret-here>
        - --redirection-url=https://kubernetes-dashboard.example.org
        - --enable-refresh-tokens=true
        - --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh
        - --upstream-url=https://kubernetes-dashboard.kube-system
        - --resources=uri=/*
        image: keycloak/keycloak-gatekeeper
        name: kubernetes-dashboard-proxy
        ports:
        - containerPort: 80
          livenessProbe:
            httpGet:
              path: /oauth/health
              port: 80
            initialDelaySeconds: 3
            timeoutSeconds: 2
          readinessProbe:
            httpGet:
              path: /oauth/health
              port: 80
            initialDelaySeconds: 3
            timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard-proxy
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: kubernetes-dashboard-proxy
  type: ClusterIP

Manba: www.habr.com

a Izoh qo'shish