یک آموزش کوچک در مورد نحوه استفاده از Keycloak برای اتصال Kubernetes به سرور LDAP و راه اندازی واردات کاربران و گروه ها. این به شما امکان میدهد RBAC را برای کاربران خود راهاندازی کنید و از auth-proxy برای محافظت از داشبورد Kubernetes و سایر برنامههایی که نمیدانند چگونه خود را مجاز کنند، استفاده کنید.
نصب Keycloak
بیایید فرض کنیم که شما از قبل یک سرور LDAP دارید. این می تواند Active Directory، FreeIPA، OpenLDAP یا هر چیز دیگری باشد. اگر سرور LDAP ندارید، در اصل می توانید کاربران را مستقیماً در رابط Keycloak ایجاد کنید یا از ارائه دهندگان oidc عمومی (Google، Github، Gitlab) استفاده کنید، نتیجه تقریباً یکسان خواهد بود.
اول از همه، بیایید خود Keycloak را نصب کنیم، نصب می تواند به طور جداگانه انجام شود، یا مستقیماً در خوشه Kubernetes، به عنوان یک قاعده، اگر چندین کلاستر Kubernetes دارید، نصب آن به طور جداگانه آسان تر است. از طرف دیگر، شما همیشه می توانید استفاده کنید
برای ذخیره داده های Keycloak، به یک پایگاه داده نیاز دارید. پیش فرض است h2
(همه داده ها به صورت محلی ذخیره می شوند)، اما استفاده از آن نیز امکان پذیر است postgres
, mysql
یا mariadb
.
اگر هنوز تصمیم دارید Keycloak را به طور جداگانه نصب کنید، می توانید دستورالعمل های دقیق تری را در اینجا بیابید
راه اندازی فدراسیون
اول از همه، اجازه دهید یک قلمرو جدید ایجاد کنیم. Realm فضای برنامه ما است. هر برنامه می تواند قلمرو خود را با کاربران مختلف و تنظیمات مجوز داشته باشد. قلمرو اصلی توسط خود 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
URL اتصال
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/[email protected]
برگه کلید:
/etc/krb5.keytab
کاربر keycloak-svc
باید از قبل در سرور LDAP ما ایجاد شود.
در مورد Active Directory، به سادگی انتخاب کنید فروشنده: Active Directory و تنظیمات لازم به صورت خودکار در فرم درج خواهد شد.
فشار ذخیره
حالا بریم جلو:
فدراسیون کاربران -> freeipa.example.org -> نقشه برداران -> نام کوچک
گزینه
ارزش
ویژگی های Ldap
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/
URIهای تغییر مسیر معتبر
http://kubernetes.example.org/*
آدرس ادمین
http://kubernetes.example.org/
ما همچنین یک محدوده برای گروه ها ایجاد خواهیم کرد:
محدوده های مشتری -> ساختن
گزینه
ارزش
قالب
No template
نام
groups
مسیر گروهی کامل
false
و یک نقشه بردار برای آنها تنظیم کنید:
محدوده های مشتری -> گروه -> نقشه برداران -> ساختن
گزینه
ارزش
نام
groups
نوع نقشه بردار
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) و برای گروهی از کاربران (فیلد 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 را میتوانید در اینجا پیدا کنید
تنظیم auth-proxy
یک پروژه فوق العاده وجود دارد
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