Ni fiksas LDAP-rajtigon al Kubernetes

Ni fiksas LDAP-rajtigon al Kubernetes

Mallonga lernilo pri kiel vi povas uzi Keycloak por konekti Kubernetes al via LDAP-servilo kaj agordi la importadon de uzantoj kaj grupoj. Ĉi tio permesos al vi agordi RBAC por viaj uzantoj kaj uzi aŭth-proxy por protekti Kubernetes Dashboard kaj aliajn aplikojn, kiuj ne povas aŭtentikigi sin.

Instalado de Keycloak

Ni supozu, ke vi jam havas LDAP-servilon. Ĉi tio povus esti Active Directory, FreeIPA, OpenLDAP aŭ io ajn alia. Se vi ne havas LDAP-servilon, tiam principe vi povas krei uzantojn rekte en la interfaco Keycloak, aŭ uzi publikajn oidc-provizantoj (Google, Github, Gitlab), la rezulto estos preskaŭ la sama.

Antaŭ ĉio, ni instalu mem Keycloak.La instalado povas esti farita aparte aŭ rekte en Kubernetes-grupon.Kiel regulo, se vi havas plurajn Kubernetes-areojn, estus pli facile instali ĝin aparte. Aliflanke vi ĉiam povas uzi oficiala stirila letero kaj instalu ĝin rekte en vian areton.

Por konservi Keycloak-datumojn vi bezonos datumbazon. Defaŭlte estas h2 (ĉiuj datumoj estas konservitaj loke), sed ankaŭ eblas uzi ĝin postgres, mysqlmariadb.
Se vi ankoraŭ decidas instali Keycloak aparte, vi trovos pli detalajn instrukciojn en oficiala dokumentaro.

Federacia aranĝo

Antaŭ ĉio, ni kreu novan regnon. Sfero estas la spaco de nia aplikaĵo. Ĉiu aplikaĵo povas havi sian propran regnon kun malsamaj uzantoj kaj rajtigaj agordoj. La Majstra regno estas uzata de Keycloak mem kaj estas malĝuste uzi ĝin por io alia.

Puŝi Aldonu regnon

eblo
valoro

Nomo
kubernetes

Montri Nomo
Kubernetes

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

Kubernetes defaŭlte kontrolas ĉu la retpoŝto de la uzanto estas konfirmita aŭ ne. Ĉar ni uzas nian propran LDAP-servilon, ĉi tiu kontrolo preskaŭ ĉiam revenos false. Ni malŝaltu la reprezentadon de ĉi tiu opcio en Kubernetes:

Klientaj medioj -> retpoŝto -> Mapistoj -> Retpoŝto kontrolita (Forigi)

Nun ni starigu la federacion; por fari tion, iru al:

Uzantfederacio -> Aldoni provizanton... -> ldap

Jen ekzemplo de agordoj por FreeIPA:

eblo
valoro

Konzolo Afiŝnomo
freeipa.example.org

vendisto
Red Hat Directory Server

UUID LDAP-atributo
ipauniqueid

Konekto URL
ldaps://freeipa.example.org

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

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

Ligi Akreditaĵon
<password>

Permesu Kerberos-aŭtentikigon:
on

Kerberos-Regno:
EXAMPLE.ORG

Rektoro de Servilo:
HTTP/[email protected]

KeyTab:
/etc/krb5.keytab

Uzanto keycloak-svc devas esti kreita anticipe sur nia LDAP-servilo.

En la kazo de Active Directory, vi nur bezonas elekti Vendisto: Active Directory kaj la necesaj agordoj estos aŭtomate enmetitaj en la formularon.

Puŝi Savi

Nun ni pluiru:

Uzantfederacio -> freeipa.example.org -> Mapistoj -> unua Nomo

eblo
valoro

Ldap-atributo
givenName

Nun ni ebligu grupan mapadon:

Uzantfederacio -> freeipa.example.org -> Mapistoj -> krei

eblo
valoro

Nomo
groups

Mapper tipo
group-ldap-mapper

LDAP-grupoj DN
cn=groups,cn=accounts,dc=example,dc=org

Uzantgrupoj Reakiri Strategion
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Nun kiam la federacia agordo estas kompleta, ni pluiru al agordo de la kliento.

Klienta agordo

Ni kreu novan klienton (aplikaĵo kiu ricevos uzantojn de Keycloak). Ni pluiru:

klientoj -> krei

eblo
valoro

Klienta ID
kubernetes

Alira Tipo
confidenrial

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

Validaj Alidirektaj URIoj
http://kubernetes.example.org/*

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

Ni ankaŭ kreu amplekson por grupoj:

Kliento Scopes -> krei

eblo
valoro

template
No template

Nomo
groups

Plena grupa vojo
false

Kaj starigu mapigilon por ili:

Kliento Scopes -> grupoj -> Mapistoj -> krei

eblo
valoro

Nomo
groups

Mapper Tipo
Group membership

Tokena Aserto Nomo
groups

Nun ni devas ebligi mapan grupon en nia klienta amplekso:

klientoj -> kubernetoj -> Kliento Scopes -> Defaŭltaj Kliento-Ampleksoj

Elektu grupoj в Disponeblaj Kliento-Ampleksoj, premu Aldoni elektitan

Nun ni agordu la aŭtentikigon de nia aplikaĵo, iru al:

klientoj -> kubernetoj

eblo
valoro

Rajtigo Ebligita
ON

Ni premu savi kaj kun ĉi tio la klienta agordo estas finita, nun sur la langeto

klientoj -> kubernetoj -> Kreditoj

vi povas akiri sekreta kiun ni plu uzos.

Agordante Kubernetes

Agordi Kubernetes por OIDC-rajtigo estas sufiĉe bagatela kaj ne tre komplika. Ĉio, kion vi devas fari, estas enmeti la CA-atestilon de via OIDC-servilo /etc/kubernetes/pki/oidc-ca.pem kaj aldonu la necesajn elektojn por kube-apiserver.
Por fari tion, ĝisdatigu /etc/kubernetes/manifests/kube-apiserver.yaml sur ĉiuj viaj mastroj:

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

Ankaŭ, ĝisdatigu la kubeadm-agordon en la areto por ne perdi ĉi tiujn agordojn dum ĝisdatigo:

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

Ĉi tio kompletigas la aranĝon de Kubernetes. Vi povas ripeti ĉi tiujn paŝojn tra ĉiuj viaj Kubernetes-aretoj.

Komenca rajtigo

Post ĉi tiuj paŝoj, vi jam havos Kubernetes-grupon kun agordita OIDC-rajtigo. La sola afero estas, ke viaj uzantoj ankoraŭ ne havas agorditan klienton aŭ sian propran kubeconfig. Por solvi ĉi tiun problemon, vi devas agordi aŭtomatan distribuadon de kubeconfig al uzantoj post sukcesa rajtigo.

Por fari tion, vi povas uzi specialajn TTT-aplikaĵojn, kiuj permesas vin aŭtentikigi la uzanton kaj poste elŝuti la pretan kubeconfig. Unu el la plej oportunaj estas Kuberos, ĝi permesas vin priskribi ĉiujn Kubernetes-aretojn en unu agordo kaj facile ŝanĝi inter ili.

Por agordi Kuberos, simple priskribu la ŝablonon por kubeconfig kaj rulu ĝin kun la sekvaj parametroj:

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

Por pli detalaj informoj vidu uzado sur Github.

Ankaŭ eblas uzi kubelogin se vi volas rajtigi rekte sur la komputilo de la uzanto. En ĉi tiu kazo, la uzanto malfermos retumilon kun rajtigo formularo sur localhost.

La rezulta kubeconfig povas esti kontrolita en la retejo jwt.io. Nur kopiu la valoron users[].user.auth-provider.config.id-token de via kubeconfig al la formularo en la retejo kaj tuj ricevu transskribon.

Agordi RBAC

Kiam vi agordas RBAC, vi povas rilati al ambaŭ la uzantnomo (kampo name en la jwt-ĵetono), kaj per uzantgrupo (kampo groups en jwt-ĵetono). Jen ekzemplo de starigo de rajtoj por 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

Pliaj ekzemploj por RBAC troveblas en oficiala Kubernetes dokumentaro

Agordi aŭth-proxy

Estas mirinda projekto ŝlosilmantelo-pordegogardisto, kiu permesas vin protekti ajnan aplikaĵon provizante al la uzanto la kapablon aŭtentikiĝi al la OIDC-servilo. Mi montros al vi kiel agordi ĝin uzante Kubernetes Dashboard kiel ekzemplo:

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

fonto: www.habr.com

Aldoni komenton