تخطَّ إلى المحتوى

RBAC و ServiceAccounts

ستتعلم كيف تنشئ ServiceAccount، Role، RoleBinding، وكيف تختبر الصلاحيات باستخدام kubectl auth can-i.

RBAC يجيب عن سؤال: “هذا المستخدم أو هذا Pod مسموح له يعمل ماذا؟ وعلى أي resources؟ وفي أي namespace؟”

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، استخدمه بحذر

rbac.yaml:

apiVersion: v1
kind: Namespace
metadata:
name: demo-rbac
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-reader
namespace: demo-rbac
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: read-pods
namespace: demo-rbac
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-read-pods
namespace: demo-rbac
subjects:
- kind: ServiceAccount
name: pod-reader
namespace: demo-rbac
roleRef:
kind: Role
name: read-pods
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: Pod
metadata:
name: rbac-test
namespace: demo-rbac
spec:
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"
Terminal window
kubectl apply -f rbac.yaml
kubectl auth can-i list pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbac
kubectl auth can-i delete pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbac

Expected output:

yes
no

اختبر من داخل Pod:

Terminal window
kubectl -n demo-rbac exec rbac-test -- kubectl get pods -n demo-rbac
kubectl -n demo-rbac exec rbac-test -- kubectl delete pod rbac-test -n demo-rbac

Expected output:

NAME READY STATUS RESTARTS AGE
rbac-test 1/1 Running 0 30s
Error from server (Forbidden): pods "rbac-test" is forbidden
المشكلةالتشخيصالحل
Forbiddenkubectl auth can-i ... --as=...أضف verb/resource المطلوب فقط
Role في namespace خطأkubectl get role -Aضع Role وRoleBinding في نفس namespace المستهدف
استخدام ClusterRoleBinding بلا حاجةمراجعة manifestsاستخدم RoleBinding عندما تكون الصلاحية داخل namespace
Pod يستخدم default ServiceAccountkubectl get pod -o yamlاضبط serviceAccountName صراحة
  • لا تستخدم default ServiceAccount لتطبيقات تحتاج صلاحيات.
  • لا تعطي * في verbs أو resources إلا لسبب قوي ومراجع.
  • افصل صلاحيات CI/CD عن صلاحيات runtime داخل Pods.
  • راقب audit logs في clusters المهمة.

Lab: بناء صلاحية قراءة فقط

المستوى: مبتدئ الوقت: 40 دقيقة الأدوات: kubectl

الهدف: إنشاء ServiceAccount يستطيع قراءة Pods ولا يستطيع حذفها.

  • Cluster محلي.
  • صلاحية إنشاء RBAC resources.
  1. احفظ YAML في rbac.yaml.
  2. طبقه:
Terminal window
kubectl apply -f rbac.yaml
  1. اختبر القراءة والحذف:
Terminal window
kubectl auth can-i list pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbac
kubectl auth can-i delete pods --as=system:serviceaccount:demo-rbac:pod-reader -n demo-rbac
  1. نفذ نفس الفحص من داخل Pod:
Terminal window
kubectl -n demo-rbac exec rbac-test -- kubectl get pods -n demo-rbac
kubectl -n demo-rbac exec rbac-test -- kubectl delete pod rbac-test -n demo-rbac
yes
no
Error from server (Forbidden)
Terminal window
kubectl delete namespace demo-rbac

الربط بالمشروع النهائي

Section titled “الربط بالمشروع النهائي”

في Capstone ستحتاج ServiceAccounts منفصلة للـ API والـ worker والـ GitOps controller. هذا الدرس يعطيك الأساس لتطبيق least privilege.