Pina-fasten namin ang pahintulot ng LDAP sa Kubernetes

Pina-fasten namin ang pahintulot ng LDAP sa Kubernetes

Isang maikling tutorial kung paano mo magagamit ang Keycloak para ikonekta ang Kubernetes sa iyong LDAP server at i-configure ang pag-import ng mga user at grupo. Ito ay magbibigay-daan sa iyong i-configure ang RBAC para sa iyong mga user at gumamit ng auth-proxy upang protektahan ang Kubernetes Dashboard at iba pang mga application na hindi makapag-authenticate sa kanilang mga sarili.

Pag-install ng Keycloak

Ipagpalagay natin na mayroon ka nang LDAP server. Ito ay maaaring Active Directory, FreeIPA, OpenLDAP o anumang bagay. Kung wala kang LDAP server, sa prinsipyo maaari kang lumikha ng mga user nang direkta sa interface ng Keycloak, o gumamit ng mga pampublikong oidc provider (Google, Github, Gitlab), ang resulta ay halos pareho.

Una sa lahat, i-install natin ang Keycloak mismo. Ang pag-install ay maaaring isagawa nang hiwalay o direkta sa isang Kubernetes cluster. Bilang isang panuntunan, kung mayroon kang ilang mga Kubernetes cluster, mas madaling i-install ito nang hiwalay. Sa kabilang banda maaari mong palaging gamitin opisyal na tsart ng timon at i-install ito nang direkta sa iyong cluster.

Upang mag-imbak ng data ng Keycloak kakailanganin mo ng isang database. Default ay h2 (lahat ng data ay lokal na nakaimbak), ngunit posible rin itong gamitin postgres, mysql o mariadb.
Kung magpasya ka pa ring mag-install ng Keycloak nang hiwalay, makakakita ka ng mas detalyadong mga tagubilin sa opisyal na dokumentasyon.

Pag-setup ng Federation

Una sa lahat, gumawa tayo ng bagong kaharian. Realm ay ang puwang ng aming aplikasyon. Ang bawat application ay maaaring magkaroon ng sarili nitong larangan na may iba't ibang user at mga setting ng pahintulot. Ang Master realm ay ginagamit ng Keycloak mismo at ito ay mali na gamitin ito para sa anumang bagay.

Push Magdagdag ng kaharian

Opsyon
halaga

Pangalan
kubernetes

Display Name
Kubernetes

HTML Display Name
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Bilang default, sinusuri ng Kubernetes kung kumpirmado o hindi ang email ng user. Dahil ginagamit namin ang sarili naming LDAP server, halos palaging babalik ang pagsusuring ito false. Huwag paganahin ang representasyon ng opsyong ito sa Kubernetes:

Mga saklaw ng kliyente -> Email -> Mga Mapper -> Na-verify ang email (Burahin)

Ngayon, i-set up natin ang federation; para gawin ito, pumunta sa:

User federation -> Magdagdag ng provider… -> ldap

Narito ang isang halimbawa ng mga setting para sa FreeIPA:

Opsyon
halaga

Display Name ng Console
freeipa.example.org

Magtitinda
Red Hat Directory Server

UUID LDAP attribute
ipauniqueid

URL ng koneksyon
ldaps://freeipa.example.org

Mga gumagamit DN
cn=users,cn=accounts,dc=example,dc=org

Itali ang DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

Bind Credential
<password>

Payagan ang pagpapatunay ng Kerberos:
on

Kaharian ng Kerberos:
EXAMPLE.ORG

Principal ng Server:
HTTP/[email protected]

KeyTab:
/etc/krb5.keytab

Gumagamit keycloak-svc kailangang gawin nang maaga sa aming LDAP server.

Sa kaso ng Active Directory, kailangan mo lang pumili Vendor: Active Directory at ang mga kinakailangang setting ay awtomatikong ilalagay sa form.

Push I-save ang

Ngayon magpatuloy tayo:

User federation -> freeipa.example.org -> Mga Mapper -> Pangalan

Opsyon
halaga

Ldap attribute
givenName

Ngayon paganahin natin ang group mapping:

User federation -> freeipa.example.org -> Mga Mapper -> Lumikha

Opsyon
halaga

Pangalan
groups

Uri ng Mapper
group-ldap-mapper

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

Diskarte sa Pagkuha ng Mga Grupo ng Gumagamit
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Ngayong kumpleto na ang setup ng federation, magpatuloy tayo sa pag-set up ng kliyente.

Setup ng kliyente

Gumawa tayo ng bagong kliyente (isang application na tatanggap ng mga user mula sa Keycloak). Ituloy natin:

Kliyente -> Lumikha

Opsyon
halaga

customer ID
kubernetes

Uri ng Pag-access
confidenrial

URL ng ugat
http://kubernetes.example.org/

Mga wastong URI ng Pag-redirect
http://kubernetes.example.org/*

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

Gumawa din tayo ng saklaw para sa mga pangkat:

Saklaw ng Kliyente -> Lumikha

Opsyon
halaga

Template
No template

Pangalan
groups

Buong landas ng pangkat
false

At mag-set up ng mapper para sa kanila:

Saklaw ng Kliyente -> grupo -> Mga Mapper -> Lumikha

Opsyon
halaga

Pangalan
groups

Uri ng Mapper
Group membership

Pangalan ng Claim ng Token
groups

Ngayon ay kailangan naming paganahin ang pangkat ng pagmamapa sa saklaw ng aming kliyente:

Kliyente -> Kubernetes -> Saklaw ng Kliyente -> Default na Saklaw ng Kliyente

piliin grupo Π² Magagamit na Saklaw ng Kliyentei-click Idagdag ang napili

Ngayon ay i-configure natin ang pagpapatunay ng aming application, pumunta sa:

Kliyente -> Kubernetes

Opsyon
halaga

Pinagana ang Pahintulot
ON

Pindutin natin i-save ang at kasama nito ang pag-setup ng kliyente ay nakumpleto, ngayon sa tab

Kliyente -> Kubernetes -> kredensyal

makukuha mo Lihim na gagamitin pa natin.

Pag-configure ng Kubernetes

Ang pag-set up ng Kubernetes para sa awtorisasyon ng OIDC ay medyo maliit at hindi masyadong kumplikado. Ang kailangan mo lang gawin ay ilagay ang CA certificate ng iyong OIDC server /etc/kubernetes/pki/oidc-ca.pem at idagdag ang mga kinakailangang opsyon para sa kube-apiserver.
Upang gawin ito, i-update /etc/kubernetes/manifests/kube-apiserver.yaml sa lahat ng iyong mga panginoon:

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

Gayundin, i-update ang kubeadm config sa cluster upang hindi mawala ang mga setting na ito kapag nag-a-update:

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

Kinukumpleto nito ang pag-setup ng Kubernetes. Maaari mong ulitin ang mga hakbang na ito sa lahat ng iyong Kubernetes cluster.

Paunang awtorisasyon

Pagkatapos ng mga hakbang na ito, magkakaroon ka na ng Kubernetes cluster na may naka-configure na awtorisasyon sa OIDC. Ang tanging bagay ay ang iyong mga gumagamit ay wala pang naka-configure na kliyente o kanilang sariling kubeconfig. Upang malutas ang problemang ito, kailangan mong i-configure ang awtomatikong pamamahagi ng kubeconfig sa mga user pagkatapos ng matagumpay na awtorisasyon.

Upang gawin ito, maaari kang gumamit ng mga espesyal na web application na nagbibigay-daan sa iyong patunayan ang gumagamit at pagkatapos ay i-download ang handa na kubeconfig. Isa sa mga pinaka-maginhawa ay Kuberos, pinapayagan ka nitong ilarawan ang lahat ng mga kumpol ng Kubernetes sa isang config at madaling lumipat sa pagitan ng mga ito.

Upang i-configure ang Kuberos, ilarawan lamang ang template para sa kubeconfig at patakbuhin ito gamit ang mga sumusunod na parameter:

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

Para sa mas detalyadong impormasyon tingnan Paggamit sa Github.

Posible rin itong gamitin kubelogin kung gusto mong direktang magpahintulot sa computer ng user. Sa kasong ito, magbubukas ang user ng browser na may authorization form sa localhost.

Ang resultang kubeconfig ay maaaring suriin sa website jwt.io. Kopyahin lamang ang halaga users[].user.auth-provider.config.id-token mula sa iyong kubeconfig hanggang sa form sa website at agad na makatanggap ng transcript.

Pag-set up ng RBAC

Kapag kino-configure ang RBAC, maaari kang sumangguni sa parehong username (field name sa jwt token), at bawat pangkat ng gumagamit (field groups sa jwt token). Narito ang isang halimbawa ng pag-set up ng mga karapatan para sa isang grupo 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

Higit pang mga halimbawa para sa RBAC ay matatagpuan sa opisyal na dokumentasyon ng Kubernetes

Pagtatakda ng auth-proxy

Mayroong isang kahanga-hangang proyekto keycloak-gatekeeper, na nagbibigay-daan sa iyong protektahan ang anumang application sa pamamagitan ng pagbibigay sa user ng kakayahang mag-authenticate sa OIDC server. Ipapakita ko sa iyo kung paano ito i-configure gamit ang Kubernetes Dashboard bilang isang halimbawa:

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

Pinagmulan: www.habr.com

Magdagdag ng komento