RBAC و ServiceAccounts
الهدف من الدرس
Section titled “الهدف من الدرس”ستتعلم كيف تنشئ ServiceAccount، Role، RoleBinding، وكيف تختبر الصلاحيات باستخدام kubectl auth can-i.
الفكرة ببساطة
Section titled “الفكرة ببساطة”RBAC يجيب عن سؤال: “هذا المستخدم أو هذا Pod مسموح له يعمل ماذا؟ وعلى أي resources؟ وفي أي namespace؟”
المكونات
Section titled “المكونات”flowchart LR SA[ServiceAccount] --> RB[RoleBinding] R[Role] --> RB RB --> NS[Namespace scope]| المورد | الدور |
|---|---|
ServiceAccount | هوية يستخدمها Pod |
Role | مجموعة صلاحيات داخل namespace |
RoleBinding | يربط Role بمستخدم أو ServiceAccount |
ClusterRole | صلاحيات على مستوى cluster أو موارد cluster-wide |
ClusterRoleBinding | ربط cluster-wide، استخدمه بحذر |
YAML كامل
Section titled “YAML كامل”rbac.yaml:
apiVersion: v1kind: Namespacemetadata: name: demo-rbac---apiVersion: v1kind: ServiceAccountmetadata: name: pod-reader namespace: demo-rbac---apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: read-pods namespace: demo-rbacrules: - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: pod-reader-read-pods namespace: demo-rbacsubjects: - kind: ServiceAccount name: pod-reader namespace: demo-rbacroleRef: kind: Role name: read-pods apiGroup: rbac.authorization.k8s.io---apiVersion: v1kind: Podmetadata: name: rbac-test namespace: demo-rbacspec: serviceAccountName: pod-reader containers: - name: kubectl image: bitnami/kubectl:1.34 command: ["sleep", "3600"] resources: requests: cpu: "20m" memory: "64Mi" limits: cpu: "100m" memory: "128Mi"اختبار الصلاحيات
Section titled “اختبار الصلاحيات”kubectl apply -f rbac.yamlkubectl auth can-i list pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbackubectl auth can-i delete pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbacExpected output:
yesnoاختبر من داخل Pod:
kubectl -n demo-rbac exec rbac-test -- kubectl get pods -n demo-rbackubectl -n demo-rbac exec rbac-test -- kubectl delete pod rbac-test -n demo-rbacExpected output:
NAME READY STATUS RESTARTS AGErbac-test 1/1 Running 0 30s
Error from server (Forbidden): pods "rbac-test" is forbiddenأخطاء شائعة
Section titled “أخطاء شائعة”| المشكلة | التشخيص | الحل |
|---|---|---|
Forbidden | kubectl auth can-i ... --as=... | أضف verb/resource المطلوب فقط |
| Role في namespace خطأ | kubectl get role -A | ضع Role وRoleBinding في نفس namespace المستهدف |
| استخدام ClusterRoleBinding بلا حاجة | مراجعة manifests | استخدم RoleBinding عندما تكون الصلاحية داخل namespace |
| Pod يستخدم default ServiceAccount | kubectl get pod -o yaml | اضبط serviceAccountName صراحة |
قواعد Production
Section titled “قواعد Production”- لا تستخدم
defaultServiceAccount لتطبيقات تحتاج صلاحيات. - لا تعطي
*في verbs أو resources إلا لسبب قوي ومراجع. - افصل صلاحيات CI/CD عن صلاحيات runtime داخل Pods.
- راقب audit logs في clusters المهمة.
Lab: بناء صلاحية قراءة فقط
الهدف: إنشاء ServiceAccount يستطيع قراءة Pods ولا يستطيع حذفها.
Prerequisites
Section titled “Prerequisites”- Cluster محلي.
- صلاحية إنشاء RBAC resources.
- احفظ YAML في
rbac.yaml. - طبقه:
kubectl apply -f rbac.yaml- اختبر القراءة والحذف:
kubectl auth can-i list pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbackubectl auth can-i delete pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbac- نفذ نفس الفحص من داخل Pod:
kubectl -n demo-rbac exec rbac-test -- kubectl get pods -n demo-rbackubectl -n demo-rbac exec rbac-test -- kubectl delete pod rbac-test -n demo-rbacExpected output
Section titled “Expected output”yesnoError from server (Forbidden)Cleanup
Section titled “Cleanup”kubectl delete namespace demo-rbacالربط بالمشروع النهائي
Section titled “الربط بالمشروع النهائي”في Capstone ستحتاج ServiceAccounts منفصلة للـ API والـ worker والـ GitOps controller. هذا الدرس يعطيك الأساس لتطبيق least privilege.