Nou tache otorizasyon LDAP nan Kubernetes

Nou tache otorizasyon LDAP nan Kubernetes

Yon ti leson patikilye sou kijan pou itilize Keycloak pou konekte Kubernetes ak sèvè LDAP ou a epi mete kanpe enpòte itilizatè yo ak gwoup yo. Sa a pral pèmèt ou mete kanpe RBAC pou itilizatè ou yo epi sèvi ak auth-proxy pou pwoteje Kubernetes Dashboard ak lòt aplikasyon ki pa konnen ki jan yo otorize tèt yo.

Enstalasyon Keycloak

Ann sipoze ke ou deja gen yon sèvè LDAP. Li ta ka Active Directory, FreeIPA, OpenLDAP oswa kèlkeswa sa. Si ou pa gen yon sèvè LDAP, Lè sa a, nan prensip ou ka kreye itilizatè dirèkteman nan koòdone Keycloak la, oswa itilize founisè oidc piblik (Google, Github, Gitlab), rezilta a pral prèske menm.

Premye a tout, se pou yo enstale Keycloak tèt li, enstalasyon an ka fèt separeman, oswa dirèkteman nan gwoup Kubernetes la, kòm yon règ, si ou gen plizyè grap Kubernetes, li ta pi fasil enstale li separeman. Nan lòt men an, ou ka toujou itilize tablo Helm ofisyèl epi enstale li dirèkteman nan gwoup ou a.

Pou estoke done Keycloak, w ap bezwen yon baz done. Defo a se h2 (tout done yo estoke lokalman), men li posib tou pou itilize postgres, mysql oswa mariadb.
Si ou toujou deside enstale Keycloak separeman, ou ka jwenn enstriksyon plis detay nan dokiman ofisyèl yo.

Konfigirasyon federasyon an

Premye a tout, se pou yo kreye yon nouvo domèn. Rwayom se espas aplikasyon nou an. Chak aplikasyon ka gen pwòp domèn li yo ak itilizatè diferan ak anviwònman otorizasyon. Keycloak tèt li itilize domèn mèt la epi sèvi ak li pou nenpòt lòt bagay ki mal.

Pouse Ajoute domèn

opsyon
Valè

Non
kubernetes

Display Non
Kubernetes

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

Kubernetes pa default tcheke si imel itilizatè a konfime oswa ou pa. Piske n ap itilize pwòp sèvè LDAP nou an, chèk sa a pral prèske toujou retounen false. Ann enfim reprezantasyon anviwònman sa a nan Kubernetes:

Kliyan dimansyon -> Imèl -> Mapè yo -> imel verifye (Efase)

Koulye a, ann mete kanpe federasyon an, pou sa a nou ale nan:

Federasyon itilizatè -> Ajoute founisè... -> ldap

Men yon egzanp konfigirasyon pou FreeIPA:

opsyon
Valè

Non ekspozisyon konsole
freeipa.example.org

Machann
Red Hat Directory Server

UUID LDAP atribi
ipauniqueid

URL koneksyon
ldaps://freeipa.example.org

Itilizatè DN
cn=users,cn=accounts,dc=example,dc=org

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

Mare kalifikasyon
<password>

Pèmèt otantifikasyon Kerberos:
on

Rwayom Kerberos:
EXAMPLE.ORG

Direktè sèvè:
HTTP/[email protected]

onglet kle:
/etc/krb5.keytab

Itilizatè keycloak-svc dwe kreye davans sou sèvè LDAP nou an.

Nan ka a nan Anyè aktif, tou senpleman chwazi Vandè: Anyè aktif epi paramèt ki nesesè yo pral antre nan fòm lan otomatikman.

Pouse Save

Koulye a, ann kontinye:

Federasyon itilizatè -> freeipa.example.org -> Mapè yo -> Nom

opsyon
Valè

Atribi Ldap
givenName

Koulye a, pèmèt kat gwoup:

Federasyon itilizatè -> freeipa.example.org -> Mapè yo -> Kreye

opsyon
Valè

Non
groups

Kalite Mapper
group-ldap-mapper

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

Gwoup itilizatè Rekipere estrateji
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Sa a konplete konfigirasyon federasyon an, ann ale nan mete kanpe kliyan an.

Konfigirasyon kliyan an

Ann kreye yon nouvo kliyan (yon aplikasyon ki pral resevwa itilizatè soti nan Keycloak). Ann ale:

Kliyan -> Kreye

opsyon
Valè

ID kliyan
kubernetes

Kalite Aksè
confidenrial

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

URI redireksyon ki valab
http://kubernetes.example.org/*

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

Nou pral kreye tou yon dimansyon pou gwoup:

Kliyan dimansyon -> Kreye

opsyon
Valè

modèl
No template

Non
groups

Chemen gwoup konplè
false

Epi mete yon mape pou yo:

Kliyan dimansyon -> gwoup -> Mapè yo -> Kreye

opsyon
Valè

Non
groups

Kalite Mapper
Group membership

Non Reklamasyon Siy
groups

Koulye a, nou bezwen pèmèt kat gwoup nan sijè ki abòde kliyan nou an:

Kliyan -> gouvènè -> Kliyan dimansyon -> Dimansyon Kliyan Default

Chwazi gwoup в Dimansyon Kliyan ki disponibpouse Ajoute chwazi yo

Koulye a, ann mete kanpe otantifikasyon aplikasyon nou an, ale nan:

Kliyan -> gouvènè

opsyon
Valè

Otorizasyon Pèmèt
ON

Ann pouse sove ak sa a konplete konfigirasyon kliyan an, kounye a sou tab la

Kliyan -> gouvènè -> Kredansyèl yo

ou ka jwenn Sekrè ke nou pral itilize pita.

Konfigirasyon Kubernetes

Mete kanpe Kubernetes pou otorizasyon OIDC se byen trivial epi li pa yon bagay trè konplike. Tout sa ou bezwen fè se mete sètifika CA sèvè OIDC ou a nan /etc/kubernetes/pki/oidc-ca.pem epi ajoute opsyon ki nesesè pou kube-apiserver.
Pou fè sa, mete ajou /etc/kubernetes/manifests/kube-apiserver.yaml sou tout mèt ou yo:

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

Epi tou mete ajou konfigirasyon kubeadm nan gwoup la pou yo pa pèdi paramèt sa yo pandan aktyalizasyon a:

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

Sa a konplete konfigirasyon Kubernetes la. Ou ka repete etap sa yo atravè tout gwoup Kubernetes ou yo.

Premye Otorizasyon

Apre etap sa yo, ou pral deja gen yon gwoup Kubernetes ak otorizasyon OIDC configuré. Sèl pwen an se ke itilizatè ou yo poko gen yon kliyan configuré, osi byen ke pwòp kubeconfig yo. Pou rezoud pwoblèm sa a, ou bezwen konfigirasyon emisyon otomatik kubeconfig bay itilizatè yo apre otorizasyon siksè.

Pou fè sa, ou ka itilize aplikasyon espesyal entènèt ki pèmèt ou otantifye itilizatè a ak Lè sa a, telechaje kubeconfig la fini. Youn nan pi pratik se Kuberos, li pèmèt ou dekri tout gwoup Kubernetes nan yon sèl konfigirasyon epi fasil chanje ant yo.

Pou konfigirasyon Kuberos, li ase dekri modèl la pou kubeconfig epi kouri li ak paramèt sa yo:

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

Pou plis detay gade Itilizasyon sou Github.

Li posib tou pou itilize kubelogin si ou vle otorize dirèkteman sou òdinatè itilizatè a. Nan ka sa a, itilizatè a pral louvri yon navigatè ak yon fòm otorizasyon sou localhost.

Kubeconfig ki kapab lakòz yo ka tcheke sou sit la jwt.io. Jis kopye valè a users[].user.auth-provider.config.id-token soti nan kubeconfig ou a nan yon fòm sou sit la epi jwenn transkripsyon an touswit.

konfigirasyon RBAC

Lè w ap konfigirasyon RBAC, ou ka fè referans ak non itilizatè a (jaden name nan siy jwt la) ak pou yon gwoup itilizatè (jaden groups nan siy jwt). Men yon egzanp tabli otorizasyon pou yon gwoup 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

Ou ka jwenn plis egzanp pou RBAC nan dokiman ofisyèl Kubernetes

Mete otorizasyon-proxy

Gen yon bèl pwojè keycloak-gatekeeper, ki pèmèt ou an sekirite nenpòt aplikasyon pa pèmèt itilizatè a otantifye nan sèvè OIDC la. Mwen pral montre w kouman ou ka mete l kanpe lè l sèvi avèk Kubernetes Dashboard la kòm yon egzanp:

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

Sous: www.habr.com

Add nouvo kòmantè