انتقل إلى المحتوى الرئيسي

الفصل 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
  • السجلات قد تكشف الأسرار

أفضل ممارسات الأمان​

  1. تفعيل التشفير عند الراحة

إنشاء ملف encryption-config.yaml:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-secret>
- identity: {} # يسمح بفك التشفير
  1. استخدام External Secrets Operator

للتكامل مع Vault، AWS Secrets Manager، إلخ.

  1. RBAC مقيد

تقييد الوصول إلى الأسرار باستخدام RBAC:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["db-secret"]
verbs: ["get"]
  1. عدم الالتزام بالأسرار أبدًا
  • استخدام .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

تدوير الأسرار​

عملية التدوير​

الخطوات:

  1. إنشاء سر جديد باسم مختلف
  2. تحديث النشر للإشارة إلى السر الجديد
  3. انتظار إعادة تشغيل الـ Pods
  4. حذف السر القديم

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