אנו מהדקים את הרשאת LDAP ל-Kubernetes

אנו מהדקים את הרשאת LDAP ל-Kubernetes

מדריך קטן כיצד להשתמש ב-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 המוגמר. אחד הנוחים ביותר הוא קוברוס, הוא מאפשר לך לתאר את כל אשכולות Kubernetes בתצורה אחת ולעבור בקלות ביניהם.

כדי להגדיר את Kuberos, מספיק לתאר את התבנית עבור kubeconfig ולהפעיל אותה עם הפרמטרים הבאים:

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

לפרטים נוספים ראה נוֹהָג על Github.

אפשר גם להשתמש kubelogin אם ברצונך לאשר ישירות במחשב של המשתמש. במקרה זה, המשתמש יפתח דפדפן עם טופס הרשאה ב-localhost.

ניתן לבדוק את ה-kubeconfig שהתקבל באתר jwt.io. פשוט העתק את הערך 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 ניתן למצוא ב תיעוד רשמי של Kubernetes

הגדרת אישור פרוקסי

יש פרויקט נפלא שומר סף מפתח, המאפשר לך לאבטח כל אפליקציה על ידי מתן אפשרות למשתמש לבצע אימות לשרת OIDC. אני אראה לך איך אתה יכול להגדיר את זה באמצעות לוח המחוונים של Kubernetes כדוגמה:

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

הוספת תגובה