أمان الحاويات و Kubernetes
أدوات الأمان السحابية الأصلية
4 دقيقة للقراءة
كشف وقت التشغيل وفرض السياسات والتحكم في القبول هي طبقات أساسية في أمان Kubernetes. أدوات مثل Falco وOPA/Gatekeeper وKyverno توفر الدفاع في العمق لأعباء العمل السحابية الأصلية.
كشف التهديدات في وقت التشغيل
Falco - أمان وقت التشغيل
Falco يكتشف السلوك الشاذ في وقت التشغيل بمراقبة استدعاءات النظام:
# تثبيت Falco عبر Helm
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco \
--set falco.grpc.enabled=true \
--set falco.grpcOutput.enabled=true
قواعد الكشف الافتراضية:
# كشف shell تم تفريخه في الحاوية
- rule: Terminal shell in container
desc: كشف تنفيذ shell في حاوية
condition: >
spawned_process and container and
shell_procs and proc.tty != 0 and
container_entrypoint
output: >
Shell spawned in container (user=%user.name container=%container.name
shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)
priority: NOTICE
tags: [container, shell, mitre_execution]
# كشف الوصول لملفات حساسة
- rule: Read sensitive file in container
desc: محاولة قراءة ملفات حساسة مثل /etc/shadow
condition: >
open_read and container and
sensitive_files and not proc.name in (allowed_readers)
output: >
Sensitive file read in container (user=%user.name
file=%fd.name container=%container.name)
priority: WARNING
tags: [container, filesystem, mitre_credential_access]
قواعد Falco مخصصة
# كشف تعدين العملات المشفرة
- rule: Detect crypto mining process
desc: كشف العمليات المرتبطة بتعدين العملات
condition: >
spawned_process and container and
proc.name in (xmrig, minerd, cpuminer, cgminer, bfgminer)
output: >
Crypto mining process detected (user=%user.name container=%container.name
process=%proc.name cmdline=%proc.cmdline)
priority: CRITICAL
tags: [container, crypto, mitre_resource_hijacking]
# كشف اتصال صادر لمنافذ مشبوهة
- rule: Outbound connection to mining pool
desc: كشف الاتصالات لمنافذ تجمعات التعدين الشائعة
condition: >
outbound and container and
fd.sport in (3333, 4444, 5555, 7777, 8888, 9999)
output: >
Suspicious outbound connection (container=%container.name
connection=%fd.name)
priority: WARNING
فرض السياسات مع OPA Gatekeeper
معمارية Gatekeeper
┌─────────────────────────────────────────────────────┐
│ Kubernetes API │
└──────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Admission Webhook │
│ ┌─────────────────────────────────────────────┐ │
│ │ OPA Gatekeeper │ │
│ │ ┌──────────────┐ ┌──────────────────────┐ │ │
│ │ │ Constraint │ │ ConstraintTemplate │ │ │
│ │ │ (المثيل) │ │ (تعريف السياسة) │ │ │
│ │ └──────────────┘ └──────────────────────┘ │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
تثبيت Gatekeeper
# تثبيت Gatekeeper
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/v3.14.0/deploy/gatekeeper.yaml
# التحقق من التثبيت
kubectl get pods -n gatekeeper-system
قوالب القيود والقيود
طلب تسميات على جميع الموارد:
# ConstraintTemplate - يحدد مخطط السياسة
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
validation:
openAPIV3Schema:
type: object
properties:
labels:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[_]}
missing := required - provided
count(missing) > 0
msg := sprintf("Missing required labels: %v", [missing])
}
---
# Constraint - يطبق السياسة
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: require-team-label
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
labels: ["team", "environment"]
حظر الحاويات ذات الصلاحيات:
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8sblockprivileged
spec:
crd:
spec:
names:
kind: K8sBlockPrivileged
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sblockprivileged
violation[{"msg": msg}] {
c := input.review.object.spec.containers[_]
c.securityContext.privileged == true
msg := sprintf("Privileged container not allowed: %v", [c.name])
}
---
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sBlockPrivileged
metadata:
name: block-privileged-containers
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
Kyverno - محرك السياسات الأصلي لـ Kubernetes
مزايا Kyverno
| الميزة | Kyverno | OPA Gatekeeper |
|---|---|---|
| اللغة | YAML (K8s أصلي) | Rego (منحنى تعلم) |
| التعديل | مدمج | قبول منفصل |
| التوليد | إنشاء موارد | غير مدعوم |
| التعقيد | أقل | أعلى |
أمثلة سياسات Kyverno
طلب حدود الموارد:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resource-limits
spec:
validationFailureAction: Enforce
rules:
- name: check-resource-limits
match:
any:
- resources:
kinds:
- Pod
validate:
message: "حدود CPU والذاكرة مطلوبة"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
إضافة تسميات تلقائياً (تعديل):
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-default-labels
spec:
rules:
- name: add-team-label
match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
metadata:
labels:
managed-by: kyverno
+(team): platform
متحكمات القبول
متحكمات القبول المدمجة
# التحقق من متحكمات القبول الممكنة
kubectl api-versions | grep admission
# متحكمات القبول الرئيسية
# - PodSecurity (يستبدل PodSecurityPolicy)
# - ResourceQuota
# - LimitRanger
# - ValidatingAdmissionWebhook
# - MutatingAdmissionWebhook
مثال Validating Webhook
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: image-policy-webhook
webhooks:
- name: validate.images.example.com
admissionReviewVersions: ["v1"]
sideEffects: None
clientConfig:
service:
name: image-policy-service
namespace: security
path: "/validate"
rules:
- operations: ["CREATE", "UPDATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
failurePolicy: Fail
matchPolicy: Exact
مقارنة أدوات الأمان
| القدرة | Falco | Gatekeeper | Kyverno |
|---|---|---|---|
| كشف وقت التشغيل | نعم | لا | لا |
| التحكم في القبول | لا | نعم | نعم |
| لغة السياسة | YAML/JSON | Rego | YAML |
| تعديل الموارد | لا | محدود | نعم |
| توليد الموارد | لا | لا | نعم |
| مراقبة استدعاءات النظام | نعم | لا | لا |
التالي، سنغطي أمان سلسلة التوريد بما في ذلك توقيع الصور وSBOM وإدارة الثغرات. :::