نحن ربط إذن LDAP ل Kubernetes


برنامج تعليمي قصير حول كيفية استخدام Kubernetes لتوصيل Kubernetes بخادم LDAP وتكوين استيراد المستخدمين والمجموعات باستخدام Keycloak. سيتيح لك ذلك تكوين RBAC للمستخدمين لديك واستخدام وكيل المصادقة لحماية لوحة معلومات Kubernetes والتطبيقات الأخرى التي لا يمكنها التصريح بأنفسهم.


تثبيت Keycloak


افترض أن لديك بالفعل خادم LDAP. قد يكون الدليل النشط ، FreeIPA ، OpenLDAP أو أي شيء آخر. إذا لم يكن لديك خادم LDAP ، فيمكنك ، من حيث المبدأ ، إنشاء مستخدمين مباشرةً في واجهة Keycloak ، أو استخدام مزودي خدمة OIDC العامة (Google ، Github ، Gitlab) ، وستكون النتيجة هي نفسها تقريبًا.


بادئ ذي بدء ، سنقوم بتثبيت Keycloak نفسه ، ويمكن إجراء التثبيت بشكل منفصل ، وعلى الفور في نظام Kubernetes ، كقاعدة عامة ، إذا كان لديك العديد من مجموعات Kubernetes ، فسيكون من الأسهل تثبيتها بشكل منفصل. من ناحية أخرى ، يمكنك دائمًا استخدام مخطط الدفة الرسمي وتثبيته مباشرةً في نظام المجموعة الخاص بك.


لتخزين بيانات Keycloak ، تحتاج إلى قاعدة بيانات. بشكل افتراضي ، h2 استخدام 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 LDAPipauniqueid
رابط الاتصالldaps://freeipa.example.org
المستخدمين DNcn=users,cn=accounts,dc=example,dc=org
ربط dnuid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
ربط بيانات الاعتماد<password>
السماح بمصادقة Kerberos:on
عالم Kerberos:EXAMPLE.ORG
الخادم الرئيسي:HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:/etc/krb5.keytab

يجب إنشاء المستخدم keycloak-svc مسبقًا على خادم LDAP.


في حالة Active Directory ، ما عليك سوى اختيار البائع: Active Directory ويتم تعبئة الإعدادات اللازمة تلقائيًا في النموذج.


انقر فوق حفظ


الآن دعنا ننتقل:


اتحاد المستخدمين -> freeipa.example.org -> المصممون -> الاسم الأول


الخيارالقيمة
Ldap attriburegivenName

الآن تمكين تعيين المجموعة:


اتحاد المستخدمين -> freeipa.example.org -> معينو الخرائط -> إنشاء


الخيارالقيمة
الاسمgroups
نوع معينgroup-ldap-mapper
مجموعات LDAP DNcn=groups,cn=accounts,dc=example,dc=org
مجموعات المستخدمين استرداد الاستراتيجيةGET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

هذا يكمل تكوين الاتحاد ، دعنا ننتقل إلى إعداد العميل.


إعداد العميل


قم بإنشاء عميل جديد (تطبيق سيستقبل مستخدمين من Keycloak). نحن نمر


العملاء -> إنشاء


الخيارالقيمة
معرف العميلkubernetes
نوع الوصولconfidenrial
عنوان URL الجذرhttp://kubernetes.example.org/
صالح إعادة توجيه URIshttp://kubernetes.example.org/*
عنوان URL المسؤولhttp://kubernetes.example.org/

قم أيضًا بإنشاء نطاق للمجموعات:


نطاقات العميل -> إنشاء


الخيارالقيمة
قالبNo template
الاسمgroups
مسار المجموعة الكاملfalse

وتكوين معين لهم:


نطاقات العميل -> المجموعات -> المصممون -> إنشاء


الخيارالقيمة
الاسمgroups
نوع معينGroup membership
اسم المطالبة الرمزgroups

نحتاج الآن إلى تمكين مجموعة التعيين في نطاق عملائنا:


العملاء -> kubernetes -> نطاقات العميل -> نطاقات العميل الافتراضية


حدد مجموعات في نطاقات العميل المتوفرة ، انقر فوق إضافة محددة


الآن تكوين مصادقة التطبيق لدينا ، انتقل إلى:


العملاء -> kubernetes


الخيارالقيمة
تم تمكين التفويضON

انقر فوق حفظ ، ويكمل ذلك إعداد العميل ، الآن في علامة التبويب


العملاء -> kubernetes -> أوراق الاعتماد


يمكنك الحصول على السرية التي سوف نستخدمها في المستقبل.


تكوين Kubernetes


تكوين Kubernetes للمصادقة OIDC تافهة للغاية وغير معقدة للغاية. كل ما عليك القيام به هو وضع شهادة المرجع المصدق (CA) لخادم OIDC الخاص بك في /etc/kubernetes/pki/oidc-ca.pem وإضافة الخيارات الضرورية لـ kube-apiserver.
للقيام بذلك ، قم بتحديث /etc/kubernetes/manifests/kube-apiserver.yaml على جميع /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 أحد أكثر الخيارات ملاءمة ، حيث يتيح لك وصف جميع مجموعات Kubernetes بتكوين واحد والتبديل بينها بسهولة.


لتكوين Kuberos ، ما عليك سوى وصف قالب kubeconfig وتشغيله باستخدام المعلمات التالية:


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

انظر الاستخدام على جيثب لمزيد من التفاصيل.


من الممكن أيضًا استخدام kubelogin إذا كنت ترغب في التصريح مباشرةً على جهاز الكمبيوتر الخاص بالمستخدم. في هذه الحالة ، يفتح المستخدم مستعرضًا بنموذج ترخيص على المضيف المحلي.


يمكن التحقق من kubeconfig الناتج في jwt.io. ما عليك users[].user.auth-provider.config.id-token نسخ قيمة users[].user.auth-provider.config.id-token من kubeconfig الخاص بك إلى النموذج على الموقع والحصول على فك التشفير على الفور.


إعداد RBAC


عند إعداد RBAC ، يمكنك الرجوع إلى كل من اسم المستخدم (حقل name في الرمز المميز jwt) ومجموعة المستخدم (حقل groups في الرمز المميز jwt). فيما يلي مثال على تعيين أذونات لمجموعة 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.


تكوين مصادقة الوكيل


يوجد مشروع keycloak-gatekeeper رائع يسمح لك بحماية أي تطبيق ، مما يتيح للمستخدم إمكانية المصادقة مع خادم 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 

Source: https://habr.com/ru/post/ar441112/


All Articles