שיטות עבודה מומלצות לאבטחת Kubernetes
Kubernetes חוללה מהפכה בתזמור ובניהול של קונטיינרים בקנה מידה גדול, והפכה לתקן דה-פקטו לפריסת אפליקציות cloud-native, אך הארכיטקטורה המבוזרת שלה והמורכבות המובנית שלה מציגות משטח תקיפה מורחב באופן משמעותי בהשוואה למודלים מסורתיים של פריסה. אשכול Kubernetes טיפוסי כולל עשרות רכיבים מקושרים - API server, etcd, scheduler, controller manager, kubelet, kube-proxy - שלכל אחד מהם פגיעויות פוטנציאליות משלו ודרישות הקשחה ספציפיות. הטבע הדינמי של K8s, שבו pods נוצרים ונהרסים כל הזמן, workloads נודדים בין nodes, ומדיניות רשת חייבת לחול בזמן אמת, הופך את האבטחה לאתגר רב-ממדי הדורש גישה של הגנה לעומק. תצורות ברירת מחדל לא מאובטחות, כגון הרשאות מתירניות יתר על המידה ב-RBAC, היעדר network policies המאפשרות תקשורת בלתי מוגבלת בין pods, קונטיינרים הרצים כ-root עם capabilities privileged, ו-secrets המאוחסנים כטקסט גלוי ב- etcd לא מוצפן, מייצגים וקטורי תקיפה הנפוצים לניצול בסביבות K8s בתצורה לקויה. מאמר זה בוחן שיטות יסוד להקשחת אשכולות Kubernetes, ומכסה בקרת גישה מבוססת תפקידים (RBAC), pod security standards, network policies ל- מיקרו-סגמנטציה, ניהול מאובטח של secrets, admission controllers ל-policy enforcement, ניטור אבטחה ב-runtime עם כלים כגון Falco, ועמידה ב-benchmarks של התעשייה כגון CIS Kubernetes Benchmark, ומספק מפת דרכים מלאה לבנייה ולתפעול של אשכולות Kubernetes מאובטחים בסביבות ייצור.
ארכיטקטורת אבטחה של K8s
לאשכול Kubernetes יש מספר רכיבים קריטיים:
- Control Plane: API Server, etcd, scheduler, controller manager
- Nodes: kubelet, kube-proxy, container runtime
- Add-ons: DNS, dashboard, ingress controllers
RBAC (Role-Based Access Control)
RBAC הוא הבסיס של אבטחת K8s, ושולט במי יכול לגשת למה דרך ה-API server.
תצורת RBAC
# Role לקריאת pods ב-namespace ספציפי
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
---
# RoleBinding משייך את ה-role למשתמש
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: production
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
עקרונות RBAC
- Least privilege: להעניק רק את ההרשאות הנדרשות
- להימנע מ-ClusterAdmin: ליצור roles ספציפיים לפי תפקיד
- Service accounts: לכל pod צריך להיות SA ייעודי
- Namespace isolation: RoleBindings במקום ClusterRoleBindings
Pod Security
Pod Security Standards
Kubernetes 1.25+ משתמש ב-Pod Security Admission במקום ה-PSPs המיושנים:
- Privileged: ללא הגבלה, עבור workloads מהימנים
- Baseline: מגביל באופן מינימלי, מונע הסלמות ידועות
- Restricted: מוגבל מאוד, עוקב אחר שיטות העבודה המומלצות להקשחה
Security Context
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: myapp:latest
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
Network Policies
כברירת מחדל, pods יכולים לתקשר באופן חופשי. Network Policies מיישמות סגמנטציה:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-allow-from-frontend
namespace: production
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
ניהול Secrets
- לעולם אל תקודדו secrets בקוד קשיח: השתמשו ב-Kubernetes Secrets או ב-vaults חיצוניים
- etcd encryption: הפעילו encryption-at-rest עבור etcd
- External Secrets Operator: שילוב עם Vault, AWS Secrets Manager
- סבבו secrets: יישמו רוטציה אוטומטית
- RBAC עבור secrets: הגבילו מי יכול לקרוא secrets
Image Security
- Private registries: אל תשתמשו ב-registries ציבוריים בייצור
- Image scanning: Trivy, Clair, Anchore לסריקת פגיעויות
- Image signing: Cosign לאימות שלמות
- Admission controllers: אמתו images לפני הפריסה
- Distroless images: מזערו את משטח התקיפה
Admission Controllers
- OPA/Gatekeeper: Policy-as-code עבור compliance
- Kyverno: ניהול מדיניות נייטיב של Kubernetes
- ImagePolicyWebhook: אמתו חתימות של images
- ResourceQuota: הגבילו משאבים לפי namespace
- LimitRanger: אכפו מגבלות CPU/זיכרון
הקשחת API Server
- הפעילו audit logging
- השתמשו ב-TLS לכל התקשורת
- השביתו anonymous auth
- יישמו API rate limiting
- הגבילו את הגישה ל-API server (network ACLs)
Runtime Security
- Falco: זיהוי איומים ב-runtime עבור K8s
- Sysdig Secure: הגנת runtime ו-compliance
- Aqua Security: אבטחת קונטיינרים לאורך כל מחזור החיים
Compliance וביקורת
- CIS Kubernetes Benchmark: Framework להקשחה
- kube-bench: בדיקות compliance אוטומטיות של CIS
- kube-hunter: כלי penetration testing עבור K8s
- Audit logs: רכזו ב-SIEM לצורך ניתוח
Service Mesh Security
Service meshes (Istio, Linkerd) מוסיפים שכבת אבטחה:
- mTLS אוטומטי בין pods
- מדיניות הרשאה fine-grained
- הצפנת תעבורה in transit
- Observability ו-auditability
המלצות מסכמות
אבטחת K8s היא אחריות משותפת. יישמו הגנה רב-שכבתית: RBAC, network policies, pod security, ניהול secrets והגנת runtime. השתמשו בכלי compliance אוטומטיים (kube-bench) ונטרו באופן רציף. הכשירו צוותים באבטחת K8s - מורכבות דורשת מומחיות ייעודית.
