الدرس 18 من 24

أمان الحاويات و Kubernetes

أساسيات أمان Kubernetes

4 دقيقة للقراءة

Kubernetes ينسق الحاويات على نطاق واسع لكنه يقدم سطح هجوم معقد. تأمين control plane وأعباء العمل والشبكة يتطلب فهم RBAC ومعايير أمان Pod وسياسات الشبكة.

سطح هجوم Kubernetes

المكونات الحرجة

┌─────────────────────────────────────────────────────┐
│                    Control Plane                     │
│  ┌──────────┐  ┌──────────┐  ┌───────────────────┐ │
│  │ API      │  │ etcd     │  │ Controller/       │ │
│  │ Server   │  │ (الأسرار)│  │ Scheduler         │ │
│  └──────────┘  └──────────┘  └───────────────────┘ │
├─────────────────────────────────────────────────────┤
│                    عقد العمال                        │
│  ┌──────────┐  ┌──────────┐  ┌──────────────────┐  │
│  │ kubelet  │  │ kube-    │  │ وقت تشغيل       │  │
│  │          │  │ proxy    │  │ الحاوية          │  │
│  └──────────┘  └──────────┘  └──────────────────┘  │
└─────────────────────────────────────────────────────┘
المكون المخاطر الحماية
API Server وصول غير مصرح RBAC، المصادقة
etcd كشف الأسرار التشفير في الراحة
kubelet اختراق العقدة تعطيل المصادقة المجهولة
وقت تشغيل الحاوية الهروب من الحاوية سياسات أمان Pod
الشبكة الحركة الجانبية سياسات الشبكة

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

مكونات RBAC

# Role - يحدد الصلاحيات داخل namespace
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get"]

---
# RoleBinding - يمنح Role للمستخدمين/المجموعات
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: production
subjects:
- kind: User
  name: developer@example.com
  apiGroup: rbac.authorization.k8s.io
- kind: Group
  name: developers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

ClusterRole للوصول على مستوى المجموعة

# ClusterRole - صلاحيات على مستوى المجموعة
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

---
# ClusterRoleBinding - يمنح ClusterRole على مستوى المجموعة
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: ServiceAccount
  name: security-scanner
  namespace: security
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

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

الممارسة التنفيذ
أقل صلاحيات امنح فقط الصلاحيات المطلوبة
عزل Namespace استخدم Roles، وليس ClusterRoles عند الإمكان
تحديد نطاق Service account SA مخصص لكل تطبيق
لا SA افتراضي أنشئ service accounts محددة
تدقيق RBAC مراجعات صلاحيات منتظمة

معايير أمان Pod

تكوين Security Context

apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: app
    image: myapp:latest
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
          - ALL
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
      requests:
        memory: "64Mi"
        cpu: "250m"

مستويات معايير أمان Pod (PSS)

المستوى الوصف حالة الاستخدام
Privileged غير مقيد أعباء عمل النظام
Baseline مقيد بشكل بسيط أعباء العمل القياسية
Restricted مقيد بشدة حساس أمنياً

فرض عبر تسميات namespace:

apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted

سياسات الشبكة

سياسة الرفض الافتراضي

# رفض جميع الدخول والخروج افتراضياً
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

السماح بحركة مرور محددة

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-web-to-api
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: api
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web
    ports:
    - protocol: TCP
      port: 8080
---
# السماح لـ API بالوصول لقاعدة البيانات
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-api-to-db
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: database
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: api
    ports:
    - protocol: TCP
      port: 5432

إدارة الأسرار

أمان أسرار Kubernetes

# إنشاء سر
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
data:
  username: YWRtaW4=  # مشفر base64
  password: cGFzc3dvcmQxMjM=

الأسرار مشفرة base64، وليست مشفرة!

تفعيل التشفير في الراحة

# /etc/kubernetes/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <32-byte-base64-key>
      - identity: {}

إدارة الأسرار الخارجية

# استخدام External Secrets Operator مع AWS
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secrets-manager
    kind: SecretStore
  target:
    name: db-credentials
  data:
  - secretKey: password
    remoteRef:
      key: production/db
      property: password

أمان Kubernetes المُدار

ضوابط مزود السحابة

الميزة EKS AKS GKE
أمان control plane مُدار من AWS مُدار من Azure مُدار من Google
أمان العقد مجموعات عقد مُدارة تجمعات العقد Autopilot
تكامل RBAC أدوار IAM لـ SA تكامل AAD Workload Identity
سياسات الشبكة Calico Azure CNI GKE Dataplane V2
الأسرار Secrets Manager Key Vault Secret Manager

التالي، سنستكشف أدوات الأمان السحابية الأصلية مثل Falco وOPA ومتحكمات القبول. :::

اختبار

الوحدة 5: أمان الحاويات و Kubernetes

خذ الاختبار