
برنامج تعليمي قصير حول كيفية استخدام 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 LDAP | ipauniqueid |
رابط الاتصال | ldaps://freeipa.example.org |
المستخدمين DN | cn=users,cn=accounts,dc=example,dc=org |
ربط dn | uid=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 attribure | givenName |
الآن تمكين تعيين المجموعة:
اتحاد المستخدمين -> freeipa.example.org -> معينو الخرائط -> إنشاء
الخيار | القيمة |
---|
الاسم | groups |
نوع معين | group-ldap-mapper |
مجموعات LDAP DN | cn=groups,cn=accounts,dc=example,dc=org |
مجموعات المستخدمين استرداد الاستراتيجية | GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE |
هذا يكمل تكوين الاتحاد ، دعنا ننتقل إلى إعداد العميل.
إعداد العميل
قم بإنشاء عميل جديد (تطبيق سيستقبل مستخدمين من Keycloak). نحن نمر
العملاء -> إنشاء
الخيار | القيمة |
---|
معرف العميل | kubernetes |
نوع الوصول | confidenrial |
عنوان URL الجذر | http://kubernetes.example.org/ |
صالح إعادة توجيه URIs | http://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