الفصل 5.2 - الأسرار
أهداف التعلم
في نهاية هذا الفصل، ستكون قادرًا على:
- فهم ما هو السر ولماذا يتم استخدامه
- إنشاء أسرار بطرق مختلفة
- استخدام الأسرار في الـ Pods بشكل آمن
- فهم قيود الأمان للأسرار
- تطبيق أفضل الممارسات لإدارة الأسرار
مقدمة
الأسرار تشبه ConfigMaps ولكنها مصممة لتخزين البيانات الحساسة مثل كلمات المرور، رموز API، المفاتيح الخاصة، والشهادات.
مهم: الأسرار في Kubernetes ليست مشفرة افتراضيًا. إنها فقط مشفرة بـ base64.
ما هو السر؟
الـ سر هو كائن Kubernetes يخزن البيانات الحساسة. افتراضيًا، يتم ترميز الأسرار بـ base64 (ليست مشفرة).
أنواع الأسرار
يدعم Kubernetes عدة أنواع من الأسرار:
- Opaque: بيانات عشوائية (افتراضي)
- kubernetes.io/dockerconfigjson: بيانات اعتماد لسجلات Docker
- kubernetes.io/tls: شهادات TLS
- kubernetes.io/service-account-token: رموز حساب الخدمة
لماذا استخدام الأسرار؟
مشاكل بدون أسرار
مشاكل:
- كلمات مرور مضمنة في الكود
- خطر الكشف في Git
- صعوبة في التدوير
- لا توجد إدارة مركزية
فوائد مع الأسرار
فوائد:
- منفصلة عن الكود التطبيقي
- إدارة مركزية
- تدوير ميسر
- تكامل مع أدوات خارجية (Vault، إلخ.)
إنشاء الأسرار
الطريقة 1: من الحروف
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secretpassword123
الطريقة 2: من ملف
إنشاء ملف password.txt:
mysecretpassword
kubectl create secret generic db-secret \
--from-file=password=password.txt
الطريقة 3: من ملف YAML
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64 لـ "admin"
password: cGFzc3dvcmQxMjM= # base64 لـ "password123"
مهم: يجب أن تكون القيم في data مشفرة بـ base64.
للترميز:
echo -n "admin" | base64
# النتيجة: YWRtaW4=
أنواع الأسرار المتخصصة
سر سجل Docker
للوصول إلى سجل Docker خاص:
kubectl create secret docker-registry regcred \
--docker-server=docker.io \
--docker-username=myuser \
--docker-password=mypassword \
--docker-email=myuser@example.com
الاستخدام في Pod:
spec:
containers:
- name: app
image: private-registry.io/myapp:1.0
imagePullSecrets:
- name: regcred
سر TLS
للشهادات SSL/TLS:
kubectl create secret tls tls-secret \
--cert=tls.crt \
--key=tls.key
الاستخدام في الـ Pods
الطريقة 1: متغيرات البيئة (مفتاح واحد)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
الطريقة 2: جميع المفاتيح (envFrom)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
envFrom:
- secretRef:
name: db-secret
الطريقة 3: كحجم (ملفات)
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: secrets
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secrets
secret:
secretName: db-secret
defaultMode: 0400 # أذونات: للقراءة فقط
النتيجة: كل مفتاح يصبح ملفًا في /etc/secrets/ مع القيمة المفككة.
أمان الأسرار
قيود هامة
مهم:
- الأسرار مشفر بـ base64، غير مشفرة
- متاحة لأي شخص لديه وصول إلى etcd
- مرئية مع
kubectl get secret -o yaml - السجلات قد تكشف الأسرار
أفضل ممارسات الأمان
- تفعيل التشفير عند الراحة
إنشاء ملف encryption-config.yaml:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-secret>
- identity: {} # يسمح بفك التشفير
- استخدام External Secrets Operator
للتكامل مع Vault، AWS Secrets Manager، إلخ.
- RBAC مقيد
تقييد الوصول إلى الأسرار باستخدام RBAC:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["db-secret"]
verbs: ["get"]
- عدم الالتزام بالأسرار أبدًا
- استخدام
.gitignoreلملفات الأسرار - استخدام أدوات إدارة الأسرار
- التدوير المنتظم
مثال كامل
الخطوة 1: إنشاء السر
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
database_url: cG9zdGdyZXNxbDovL3VzZXI6cGFzc0BkYjoxMjM0L215ZGI=
api_key: c2VjcmV0X2FwaV9rZXlfMTIzNDU2
jwt_secret: bXlfanN0X3NlY3JldF9rZXlfZm9yX3NpZ25pbmc=
الخطوة 2: الاستخدام في نشر
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: my-app:1.0
envFrom:
- secretRef:
name: app-secrets
volumeMounts:
- name: certs
mountPath: /etc/ssl/certs
readOnly: true
volumes:
- name: certs
secret:
secretName: tls-secret
defaultMode: 0400
أوامر مفيدة
عرض سر (مشفر)
kubectl get secret db-secret
kubectl describe secret db-secret
kubectl get secret db-secret -o yaml
فك تشفير سر
# عرض القيمة المفككة
kubectl get secret db-secret -o jsonpath='{.data.password}' | base64 -d
تعديل سر
kubectl edit secret db-secret
ملاحظة: يجب أن تكون القيم مشفرة بـ base64 في المحرر.
حذف سر
kubectl delete secret db-secret
تدوير الأسرار
عملية التدوير
الخطوات:
- إنشاء سر جديد باسم مختلف
- تحديث النشر للإشارة إلى السر الجديد
- انتظار إعادة تشغيل الـ Pods
- حذف السر القديم
External Secrets Operator
لإدارة متقدمة مع أدوات خارجية:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-secret
spec:
secretStoreRef:
name: vault-backend
kind: SecretStore
target:
name: db-secret
data:
- secretKey: password
remoteRef:
key: production/database/password
ملخص
في هذا الفصل، تعلمت:
السر: كائن Kubernetes للبيانات الحساسة (base64، غير مشفر افتراضيًا)
الأنواع: Opaque، docker-registry، TLS، service-account-token
الإنشاء: kubectl create، YAML مع قيم base64
الاستخدام: متغيرات البيئة أو الأحجام
الأمان: تفعيل التشفير عند الراحة، RBAC، External Secrets
القيود: base64 فقط، مرئي في etcd، السجلات
التدوير: إنشاء سر جديد، تحديث، حذف القديم
الخطوات التالية
الفصل 5.3: الحقن في الـ Pods
الفصل 5.4: أفضل الممارسات
المختبر 5.2: إدارة الأسرار
الفصل تم إنشاؤه في: ديسمبر 2024