
En liten instruktion om hur man med hjÀlp av Keycloak kan koppla Kubernetes till din LDAP-server och konfigurera import av anvÀndare och grupper. Detta gör det möjligt att stÀlla in RBAC för dina anvÀndare och anvÀnda auth-proxy för att skydda Kubernetes Dashboard och andra applikationer som inte kan autentisera sig sjÀlva.
Installation av Keycloak
Anta att du redan har en LDAP-server. Det kan vara Active Directory, FreeIPA, OpenLDAP eller nÄgot annat. Om du inte har en LDAP-server kan du i princip skapa anvÀndare direkt i Keycloaks grÀnssnitt eller anvÀnda offentliga oidc-leverantörer (Google, Github, Gitlab), resultatet blir nÀstan detsamma.
Först installerar vi sjÀlva Keycloak, installationen kan göras separat eller direkt i Kubernetes-klustret. Om du har flera Kubernetes-kluster Àr det oftast enklare att installera det separat. à andra sidan kan du alltid anvÀnda och installera det direkt i ditt kluster.
För att lagra data till Keycloak behöver du en databas. Som standard anvÀnds h2 (alla data lagras lokalt), men du kan ocksÄ anvÀnda postgres, mysql eller mariadb.
Om du ÀndÄ har bestÀmt dig för att installera Keycloak separat hittar du mer detaljerade instruktioner i .
Konfigurering av federation
Först skapar vi en ny realm. En realm Àr rummet för vÄr applikation. Varje applikation kan ha sin egen realm med olika anvÀndare och autentiseringens instÀllningar. Master realm anvÀnds av Keycloak sjÀlvt och det Àr fel att anvÀnda det till nÄgot annat.
Klicka pÄ LÀgg till realm
Alternativ
VĂ€rde
Namn
kubernetes
Visningsnamn
Kubernetes
HTML Visningsnamn
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes kontrollerar som standard om anvÀndarens e-post Àr verifierad eller inte. Eftersom vi anvÀnder vÄr egen LDAP-server kommer denna kontroll nÀstan alltid att returnera false. LÄt oss stÀnga av visningen av denna parameter i Kubernetes:
Klienter â> Email â> Mappers â> E-post verifierad (Ta bort)
Nu stÀller vi in federation, gÄ till:
AnvĂ€ndarfederation â> LĂ€gg till leverantör⊠â> ldap
HÀr Àr ett exempel pÄ konfiguration för FreeIPA:
Alternativ
VĂ€rde
Konsol Visningsnamn
freeipa.example.org
Leverantör
Red Hat Directory Server
UUID LDAP-attribut
ipauniqueid
Anslutnings-URL
ldaps://freeipa.example.org
AnvÀndares DN
cn=users,cn=accounts,dc=example,dc=org
Bind DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Bindningsuppgift
<password>
TillÄt Kerberos-autentisering:
on
Kerberos Realm:
EXAMPLE.ORG
Server Principal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
AnvÀndaren keycloak-svc mÄste skapas i förvÀg pÄ vÄr LDAP-server.
I fallet med Active Directory rÀcker det att bara vÀlja Leverantör: Active Directory och nödvÀndiga instÀllningar fylls automatiskt i formulÀret.
Klicka pÄ Save
Nu gÄr vi till:
AnvĂ€ndarfederation â> freeipa.example.org â> Mappers â> Förnamn
Alternativ
VĂ€rde
Ldap-attribut
givenName
LÄt oss nu aktivera gruppmappning:
AnvĂ€ndarfederation â> freeipa.example.org â> Mappers â> Skapa
Alternativ
VĂ€rde
Namn
grupper
Mapper typ
group-ldap-mapper
LDAP-grupper DN
cn=groups,cn=accounts,dc=example,dc=org
AnvÀndargruppers hÀmtstrategi
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Nu Àr konfigurationen av federationen klar, lÄt oss gÄ vidare till klientkonfigurationen.
Konfigurera klienten
Vi skapar en ny klient (applikation som kommer att hÀmta anvÀndare frÄn Keycloak). GÄ till:
Klienter â> Skapa
Alternativ
VĂ€rde
Klient-ID
kubernetes
Ă
tkomsttyp
confidenrial
Rot-URL
http://kubernetes.example.org/
Giltiga omdirigerings-URIs
http://kubernetes.example.org/*
Admin-URL
http://kubernetes.example.org/
Vi skapar ocksÄ ett scope för grupper:
KlientomfĂ„ng â> Skapa
Alternativ
VĂ€rde
Mall
Ingen mall
Namn
grupper
Full gruppvÀg
false
Och vi konfigurerar mappare för dem:
KlientomfĂ„ng â> grupper â> Mappers â> Skapa
Alternativ
VĂ€rde
Namn
grupper
Mapper-typ
Gruppmedlemskap
Token kravnamn
grupper
Nu behöver vi aktivera gruppmappningen i vÄrt klientomfÄng:
Klienter â> kubernetes â> KlientomfĂ„ng â> Standard klientomfĂ„ng
VÀlj grupper pÄ TillgÀngliga klientomfÄng, tryck pÄ LÀgg till valda
Nu konfigurerar vi autentiseringen av vÄr applikation, gÄ vidare till:
Klienter â> kubernetes
Alternativ
VĂ€rde
Behörighet aktiverad
PĂ
Klicka pÄ spara och nu Àr klientkonfigurationen avslutad, gÄ till fliken
Klienter â> kubernetes â> Referenser
dÀr kan du fÄ Hemmelighet som vi kommer att anvÀnda framöver.
Konfigurering av Kubernetes
Konfiguration av Kubernetes för OIDC-autentisering Àr ganska trivial och inget komplicerat. Det du behöver göra Àr att lÀgga CA-certifikat för din OIDC-server i /etc/kubernetes/pki/oidc-ca.pem och lÀgga till nödvÀndiga alternativ för kube-apiserver.
För detta, uppdatera /etc/kubernetes/manifests/kube-apiserver.yaml pÄ alla dina noder:
...
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
...Och uppdatera kubeadm-konfigurationen i klustret för att inte förlora dessa instÀllningar vid uppgradering:
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
...Nu Àr konfigurationen av Kubernetes klar. Du kan upprepa dessa ÄtgÀrder i alla dina Kubernetes-kluster.
Inledande autentisering
Efter dessa ÄtgÀrder kommer du att ha ett Kubernetes-kluster med konfigurerad OIDC-autentisering. Det enda problemet Àr att dina anvÀndare för tillfÀllet inte har konfigurerade klienter eller sina egna kubeconfig. För att lösa detta problem behöver du konfigurera automatisk utfÀrdande av kubeconfig för anvÀndare efter lyckad autentisering.
För detta kan du anvÀnda speciella webbapplikationer som möjliggör autentisering av anvÀndaren och sedan ladda ner en fÀrdig kubeconfig. En av de mest anvÀndarvÀnliga Àr , den lÄter dig beskriva alla Kubernetes-kluster i en konfiguration och enkelt vÀxla mellan dem.
För att konfigurera Kuberos behöver du bara beskriva mallen för kubeconfig och köra med följande parametrar:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateFör mer detaljerad information, se pÄ Github.
Det Àr ocksÄ möjligt att anvÀnda om du vill autentisera direkt pÄ anvÀndarens dator. I sÄ fall öppnas en webblÀsare med en autentiseringsformulÀr pÄ localhost.
Den erhÄllna kubeconfig kan kontrolleras pÄ webbplatsen . Kopiera bara vÀrdet users[].user.auth-provider.config.id-token frÄn din kubeconfig till formulÀret pÄ webbplatsen och fÄ direkt avkodning.
RBAC-konfiguration
Vid konfiguration av RBAC kan du referera till bÄde anvÀndarnamn (fÀlt name i jwt-token), sÄvÀl som anvÀndargrupp (fÀlt grupper i jwt-token). HÀr Àr ett exempel pÄ ÄtkomstinstÀllningar för gruppen 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-adminsFler exempel pÄ RBAC kan hittas i
InstÀllningar för auth-proxy
Det finns ett fantastiskt projekt , som gör det möjligt att skydda vilken applikation som helst, genom att ge anvÀndaren möjlighet att autentisera sig mot OIDC-servern. Jag kommer att visa hur man konfigurerar det med Kubernetes Dashboard som exempel:
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=
- --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: ClusterIPKĂ€lla: habr.com
