מדריך קטן כיצד להשתמש ב-Keycloak כדי לחבר את Kubernetes לשרת ה-LDAP שלך ולהגדיר ייבוא של משתמשים וקבוצות. זה יאפשר לך להגדיר RBAC עבור המשתמשים שלך ולהשתמש ב-author-proxy כדי להגן על Kubernetes Dashboard ויישומים אחרים שאינם יודעים כיצד לאשר את עצמם.
התקנת Keycloak
בוא נניח שכבר יש לך שרת LDAP. זה יכול להיות Active Directory, FreeIPA, OpenLDAP או כל דבר אחר. אם אין לכם שרת LDAP, אז באופן עקרוני תוכלו ליצור משתמשים ישירות בממשק Keycloak, או להשתמש בספקי oidc ציבוריים (גוגל, Github, Gitlab), התוצאה תהיה כמעט זהה.
קודם כל בואו נתקין את Keycloak בעצמה, את ההתקנה ניתן לבצע בנפרד, או ישירות לאשכול Kubernetes, ככלל, אם יש לכם מספר אשכולות Kubernetes, יהיה קל יותר להתקין אותו בנפרד. מצד שני, אתה תמיד יכול להשתמש
כדי לאחסן נתוני Keycloak, תזדקק למסד נתונים. ברירת המחדל היא h2
(כל הנתונים מאוחסנים באופן מקומי), אבל אפשר גם להשתמש postgres
, mysql
או mariadb
.
אם בכל זאת תחליט להתקין את Keycloak בנפרד, תוכל למצוא הוראות מפורטות יותר ב
הגדרת הפדרציה
קודם כל, בואו ניצור ממלכה חדשה. התחום הוא המרחב של האפליקציה שלנו. לכל אפליקציה יכולה להיות תחום משלה עם משתמשים והגדרות הרשאה שונות. ממלכת המאסטר משמשת את Keycloak עצמה והשימוש בו לכל דבר אחר הוא שגוי.
לחץ כאן הוסף ממלכה
אפשרות
ערך
שם
kubernetes
צג שם
Kubernetes
שם תצוגה ב-HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes כברירת מחדל בודקת אם האימייל של המשתמש אושר או לא. מכיוון שאנו משתמשים בשרת LDAP משלנו, הסימון הזה יחזור כמעט תמיד false
. בואו נשבית את הייצוג של הגדרה זו ב-Kubernetes:
היקפי לקוחות -> כתובת אימייל -> מפות -> אימייל מאומת (לִמְחוֹק)
עכשיו בואו נגדיר את הפדרציה, בשביל זה אנחנו הולכים ל:
פדרציית משתמשים -> הוסף ספק... -> ldap
להלן דוגמה להגדרה עבור FreeIPA:
אפשרות
ערך
שם תצוגה של המסוף
freeipa.example.org
מוכר
Red Hat Directory Server
מאפיין UUID LDAP
ipauniqueid
כתובת אתר לחיבור
ldaps://freeipa.example.org
משתמש DN
cn=users,cn=accounts,dc=example,dc=org
לאגד את ד.נ.
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
אגד אישורים
<password>
אפשר אימות Kerberos:
on
ממלכת Kerberos:
EXAMPLE.ORG
מנהל שרת:
HTTP/[email protected]
לשונית מפתח:
/etc/krb5.keytab
משתמש keycloak-svc
יש ליצור מראש בשרת ה-LDAP שלנו.
במקרה של Active Directory, פשוט בחר ספק: Active Directory וההגדרות הדרושות יוכנסו לטופס באופן אוטומטי.
לחץ כאן שמור
עכשיו נמשיך הלאה:
פדרציית משתמשים -> freeipa.example.org -> מפות -> שם פרטי
אפשרות
ערך
תכונות Ldap
givenName
כעת הפעל מיפוי קבוצתי:
פדרציית משתמשים -> freeipa.example.org -> מפות -> צור
אפשרות
ערך
שם
groups
סוג Mapper
group-ldap-mapper
DN קבוצות LDAP
cn=groups,cn=accounts,dc=example,dc=org
אסטרטגיית אחזור קבוצת משתמשים
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
זה משלים את הגדרת הפדרציה, בואו נעבור להגדרת הלקוח.
הגדרת לקוח
בואו ניצור לקוח חדש (אפליקציה שתקבל משתמשים מ-Keycloak). בוא נלך:
לקוחות -> צור
אפשרות
ערך
זיהוי הלקוח
kubernetes
סוג גישה
confidenrial
כתובת אתר שורשית
http://kubernetes.example.org/
כתובות URI חוקיות להפניה מחדש
http://kubernetes.example.org/*
כתובת אתר של מנהל מערכת
http://kubernetes.example.org/
כמו כן, ניצור טווח לקבוצות:
היקפי לקוחות -> צור
אפשרות
ערך
תבנית
No template
שם
groups
מסלול קבוצתי מלא
false
והגדר עבורם מפה:
היקפי לקוחות -> קבוצות -> מפות -> צור
אפשרות
ערך
שם
groups
סוג Mapper
Group membership
שם תביעת אסימון
groups
כעת עלינו לאפשר מיפוי קבוצתי בהיקף הלקוחות שלנו:
לקוחות -> קוברנטס -> היקפי לקוחות -> היקפי לקוח ברירת מחדל
בחר קבוצות в היקפי לקוח זמיניםלחץ הוסף נבחרים
עכשיו בואו נגדיר את האימות של האפליקציה שלנו, עבור אל:
לקוחות -> קוברנטס
אפשרות
ערך
הרשאה מופעלת
ON
בואו נדחוף להציל וזה משלים את הגדרת הלקוח, כעת בכרטיסייה
לקוחות -> קוברנטס -> אישורים
אתה יכול לקבל סוד בו נשתמש בהמשך.
הגדרת Kubernetes
הגדרת Kubernetes להרשאת OIDC היא די טריוויאלית ולא משהו מסובך במיוחד. כל מה שאתה צריך לעשות הוא להכניס את אישור ה-CA של שרת ה-OIDC שלך /etc/kubernetes/pki/oidc-ca.pem
והוסף את האפשרויות הדרושות עבור kube-apiserver.
כדי לעשות זאת, עדכן /etc/kubernetes/manifests/kube-apiserver.yaml
על כל אדוניך:
...
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
...
וגם עדכן את תצורת kubeadm באשכול כדי לא לאבד את ההגדרות האלה במהלך העדכון:
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
...
זה משלים את הגדרת Kubernetes. אתה יכול לחזור על השלבים האלה בכל אשכולות Kubernetes שלך.
אישור ראשוני
לאחר השלבים האלה, כבר יהיה לך אשכול Kubernetes עם הרשאת OIDC מוגדר. הנקודה היחידה היא שלמשתמשים שלך אין עדיין לקוח מוגדר, כמו גם kubeconfig משלהם. כדי לפתור בעיה זו, עליך להגדיר את ההנפקה האוטומטית של kubeconfig למשתמשים לאחר אישור מוצלח.
לשם כך, אתה יכול להשתמש ביישומי אינטרנט מיוחדים המאפשרים לך לאמת את המשתמש ולאחר מכן להוריד את kubeconfig המוגמר. אחד הנוחים ביותר הוא
כדי להגדיר את Kuberos, מספיק לתאר את התבנית עבור kubeconfig ולהפעיל אותה עם הפרמטרים הבאים:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
לפרטים נוספים ראה
אפשר גם להשתמש
ניתן לבדוק את ה-kubeconfig שהתקבל באתר users[].user.auth-provider.config.id-token
מה-kubeconfig שלך לטופס באתר וקבל את התמליל מיד.
הגדרת RBAC
בעת הגדרת RBAC, אתה יכול להתייחס גם לשם המשתמש (שדה name
ב-jwt token) ולקבוצת משתמשים (שדה groups
ב-jwt token). הנה דוגמה להגדרת הרשאות עבור קבוצה 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 ניתן למצוא ב
הגדרת אישור פרוקסי
יש פרויקט נפלא
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
מקור: www.habr.com