انتقل إلى المحتوى الرئيسي

الفصل 9.1 - التحكم في الوصول المستند إلى الأدوار (RBAC)

أهداف التعلم​

في نهاية هذا الفصل، ستكون قادرًا على:

  • فهم ما هو RBAC ولماذا يتم استخدامه
  • إنشاء Roles و ClusterRoles
  • إنشاء RoleBindings و ClusterRoleBindings
  • فهم الأفعال والموارد
  • إدارة أذونات المستخدمين وحسابات الخدمة
  • تطبيق مبدأ أقل امتياز

مقدمة​

التحكم في الوصول المستند إلى الأدوار (RBAC) هو آلية التفويض في Kubernetes التي تسمح بالتحكم في من يمكنه فعل ماذا في العنقود. إنه ضروري للأمان والامتثال.


المفاهيم الأساسية​

Roles مقابل ClusterRoles​

Role: أذونات في نطاق namespace محدد
ClusterRole: أذونات على مستوى العنقود (جميع النطاقات)

RoleBindings مقابل ClusterRoleBindings​

RoleBinding: يربط Role بمستخدمين في نطاق namespace
ClusterRoleBinding: يربط ClusterRole بمستخدمين على مستوى العنقود


إنشاء Role​

Role أساسي​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # مجموعة API الأساسية (بدون بادئة)
resources: ["pods"]
verbs: ["get", "watch", "list"]

النتيجة: يسمح بقراءة الـ Pods في نطاق default.

Role مع موارد متعددة​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: app-manager
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]

إنشاء ClusterRole​

ClusterRole للعقد​

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "watch", "list"]

النتيجة: يسمح بقراءة العقد في جميع أنحاء العنقود.

ClusterRole مع ResourceNames​

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["my-secret", "another-secret"]
verbs: ["get", "list"]

النتيجة: الوصول فقط إلى الأسرار المحددة.


الأفعال (الإجراءات)​

الأفعال تحدد الإجراءات المسموح بها:

الفعلالوصف
getقراءة مورد
listسرد الموارد
watchمراقبة الموارد
createإنشاء مورد
updateتحديث مورد
patchتعديل جزئي لمورد
deleteحذف مورد
deletecollectionحذف عدة موارد

الرمز العام: * لجميع الإجراءات.


الموارد​

الموارد هي كائنات Kubernetes:

  • pods, services, configmaps, secrets
  • deployments, replicasets, statefulsets
  • nodes, namespaces, persistentvolumes
  • إلخ.

الرمز العام: * لجميع الموارد.


RoleBinding​

ربط Role بمستخدم​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

ربط Role بحساب خدمة​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: my-app-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

ربط ClusterRole بمستخدم (نطاق Namespace)​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-nodes
namespace: default
subjects:
- kind: User
name: bob
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io

النتيجة: يمكن لـ Bob قراءة العقد، ولكن فقط في نطاق default.


ClusterRoleBinding​

ربط ClusterRole على مستوى العنقود​

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
subjects:
- kind: User
name: admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io

النتيجة: المستخدم admin لديه أذونات cluster-admin في جميع أنحاء العنقود.


الأدوار المعرفة مسبقًا​

يوفر Kubernetes ClusterRoles معرفة مسبقًا:

cluster-admin​

وصول كامل إلى العنقود:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- nonResourceURLs: ["*"]
verbs: ["*"]

admin​

وصول كامل في نطاق namespace:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]

edit​

يمكنه تعديل الموارد (باستثناء RBAC):

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: edit
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["*"]
verbs: [] # لا يوجد وصول RBAC

view​

قراءة فقط:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: view
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]

مثال كامل: مطور​

الخطوة 1: إنشاء Role​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: development
name: developer
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]

الخطوة 2: إنشاء RoleBinding​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: development
subjects:
- kind: User
name: developer1
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io

النتيجة: يمكن لـ developer1 إدارة التطبيقات في نطاق development.


أوامر مفيدة​

التحقق​

# عرض الأدوار
kubectl get roles
kubectl get rolebinding

# عرض ClusterRoles
kubectl get clusterroles
kubectl get clusterrolebinding

# التفاصيل
kubectl describe role pod-reader
kubectl describe rolebinding read-pods

# التحقق من الأذونات
kubectl auth can-i create pods --namespace=default
kubectl auth can-i delete deployments --namespace=production

اختبار الأذونات​

# اختبار كمستخدم
kubectl get pods --as=developer1

# عرض أذونات المستخدم
kubectl auth can-i --list --as=developer1 --namespace=development

أفضل الممارسات​

1. مبدأ أقل امتياز​

إعطاء الأذونات الضرورية فقط.

2. أدوار محددة​

إنشاء أدوار محددة بدلاً من استخدام cluster-admin.

3. عزل النطاقات​

استخدام النطاقات لعزل البيئات.

4. حسابات الخدمة​

استخدام حسابات الخدمة للتطبيقات بدلاً من المستخدمين.

5. التدقيق​

تفعيل تسجيل التدقيق لتتبع الوصول.


ملخص​

في هذا الفصل، تعلمت:

RBAC: التحكم في الوصول المستند إلى الأدوار
Roles: أذونات في نطاق namespace
ClusterRoles: أذونات على مستوى العنقود
RoleBindings: ربط الأدوار بالمستخدمين/حسابات الخدمة
الأفعال: الإجراءات المسموح بها (get، list، create، update، delete، إلخ.)
الموارد: كائنات Kubernetes (pods، services، deployments، إلخ.)
الأدوار المعرفة مسبقًا: cluster-admin، admin، edit، view
أفضل الممارسات: أقل امتياز، أدوار محددة، عزل


الخطوات التالية​

الفصل 9.2: حسابات الخدمة
الفصل 9.3: سياسات الشبكة
المختبر 9.1: تكوين RBAC لمستخدم


تم إنشاء الفصل في: ديسمبر 2024