إدارة الأسرار والبنية التحتية للمفاتيح

مبادئ إدارة الأسرار

18 دقيقة الدرس 2 من 28

مبادئ إدارة الأسرار

قبل أن تلجأ إلى HashiCorp Vault أو AWS Secrets Manager، تحتاج إلى فهم المبادئ التي يُبنى عليها كل نظام جاد لإدارة الأسرار. هذه الأعمدة الأربعة — التخزين المركزي، ومبدأ الصلاحية الدنيا، والتدوير، والتدقيق — ليست ميزات في أداة بعينها. إنها خصائص معمارية تفصل النظام الذي يصمد أمام الاختراق عن ذاك الذي يصبح هو الاختراق نفسه.

الفرق في Google وNetflix وStripe لا تستخدم كلها مدير أسرار واحداً. ما يجمعها هو الالتزام الصارم بهذه المبادئ، مُطبَّقاً عبر السياسات والأدوات والثقافة. فهم "لماذا" كل مبدأ هو ما يُمكّنك من تقييم أي أداة — واتخاذ مقايضات قابلة للدفاع عنها تحت الضغط.

العمود الأول: التخزين المركزي — مصدر واحد للحقيقة

النمط المضاد الأخطر لإدارة الأسرار في الإنتاج هو تشتت الأسرار: كلمة مرور قاعدة البيانات نفسها تعيش في ملف .env على خادم CI، ومُدمجة في حزمة نشر Lambda، ومنسوخة إلى Confluence، ومخزّنة في Kubernetes Secret أُنشئ يدوياً، وأُرسلت بالبريد الإلكتروني لثلاثة مهندسين انضموا قبل ستة أشهر. عندما تحتاج إلى تدوير بيانات الاعتماد تلك، لن تعرف أين توجد جميع النسخ. ستفوّت واحدة منها. تلك الواحدة ستكون التي يجدها المهاجمون.

التخزين المركزي يعني وجود موقع واحد موثوق تماماً يعيش فيه السر. كل مستهلك — تطبيقك، pipeline الـ CI الخاص بك، pod الـ Kubernetes — يقرأ من ذلك الموقع في وقت التشغيل. لا نسخ، لا تخزين مؤقت بـ TTL غير محدود، لا ملفات مُدمجة في Git.

قاعدة "لا أسرار في Git" مطلقة. السر المُدمج في مستودع Git مخترق بشكل دائم — حتى لو أزلته فوراً بـ force-push. تاريخ Git مُنسوخ إلى كل clone وكل نظام CI وكل fork. أدوات مثل git-secrets وtrufflehog وgitleaks موجودة تحديداً لمسح المستودعات بحثاً عن بيانات اعتماد مُدمجة عن طريق الخطأ. في شركات التقنية الكبرى، سر واحد يُعثر عليه في مستودع عام يُشغّل استجابة حادثة فورية ودوراناً إلزامياً خلال دقائق.

الشكل العملي للتخزين المركزي في 2025: مدير أسرار (Vault، AWS Secrets Manager، GCP Secret Manager، Azure Key Vault) مع تسلسل هرمي منظّم للمسارات، وسياسات صارمة حول المسارات التي يمكن للتطبيقات قراءتها. بنية مسار Vault ملموسة لإعداد متعدد البيئات:

# Vault KV v2 path hierarchy — enforced by policy, not convention secret/ data/ production/ api-service/ database # DB_URL, DB_PASSWORD stripe # STRIPE_SECRET_KEY jwt # JWT_SIGNING_KEY staging/ api-service/ database stripe ci/ shared/ docker-registry # push credentials for CI builds only # Reading a secret via the Vault CLI vault kv get secret/production/api-service/database # Reading programmatically (app startup) vault kv get -format=json secret/production/api-service/database \ | jq -r '.data.data.DB_PASSWORD'

التسلسل الهرمي ليس شكلياً. يُترجَم مباشرةً إلى سياسات ACL (قائمة التحكم في الوصول). الـ api-service في الإنتاج يمكنه قراءة secret/production/api-service/* ولا شيء آخر. لا يمكنه قراءة أسرار التجهيز، ولا يمكنه قراءة بيانات اعتماد خدمة أخرى، وبالتأكيد لا يمكنه قراءة بيانات اعتماد سجل CI. هذا مُطبَّق تشفيرياً — وليس بنظام الشرف.

العمود الثاني: مبدأ الصلاحية الدنيا — صل إلى ما تحتاجه فحسب

مبدأ الصلاحية الدنيا في إدارة الأسرار يعني أن كل مستهلك لديه صلاحية قراءة الأسرار التي يحتاجها بالضبط لأداء وظيفته، محدودة بالبيئة التي يعمل فيها، ولا أكثر. يبدو هذا واضحاً، لكن انتهاكه هو القاعدة في معظم المنظمات الهندسية.

أكثر أنماط الفشل شيوعاً: حساب خدمة مشترك أو دور IAM مع صلاحية قراءة جميع الأسرار، "لأن ذلك كان أسهل في الإعداد." عندما تُخترق بيانات اعتماد ذلك الحساب — مسروقة من pod، مُسرَّبة في سطر سجل، تصيّد احتيالي لمهندس — يمتلك المهاجم كل سر في النظام في آن واحد.

Least Privilege access scoping for secrets Vault Secrets Store api-service prod/api-service/* payment-service prod/payment/* CI Runner ci/shared/docker-* prod/payment/* DENIED for api-service prod/api-service/* ALLOWED for api-service cross-service read DENIED Each service identity can only read its own secret paths — policy enforced at the secrets manager, not the application layer.
تحديد نطاق مبدأ الصلاحية الدنيا: كل هوية خدمة مرتبطة فقط بمسارات الأسرار التي تحتاجها فعلاً.

تطبيق مبدأ الصلاحية الدنيا يتطلب هويات الخدمات — هوية فريدة وقابلة للتحقق لكل حمل عمل. في Kubernetes، هذا هو ServiceAccount بالإضافة إلى طريقة مصادقة Kubernetes في Vault. في AWS، هو دور IAM مرتبط بمهمة ECS أو pod عبر IRSA. الهوية ليست اسم مستخدم وكلمة مرور؛ إنها حقيقة مُثبتة تشفيرياً عمّا يكون الحمل وأين يعمل.

# Vault policy: api-service in production (HCL) # File: policies/api-service-prod.hcl path "secret/data/production/api-service/*" { capabilities = ["read"] } # Explicitly deny access to other services' secrets path "secret/data/production/payment-service/*" { capabilities = ["deny"] } # No list capability — service cannot enumerate what else exists path "secret/metadata/production/*" { capabilities = ["deny"] } # Apply policy and bind to Kubernetes ServiceAccount vault policy write api-service-prod policies/api-service-prod.hcl vault write auth/kubernetes/role/api-service-prod \ bound_service_account_names=api-service \ bound_service_account_namespaces=production \ policies=api-service-prod \ ttl=1h
رفض صلاحية list على مسارات الأسرار. بشكل افتراضي في Vault، الخدمة التي يمكنها قراءة مسار يمكنها أيضاً سرد المفاتيح الموجودة في ذلك المسار. سرد البيانات الوصفية لـ secret/production/ يكشف قائمة جرد الأسرار بأكملها لأي خدمة مخترقة — وهو إفصاح خطير عن المعلومات. دائماً افرض deny صريحاً لصلاحيتَي list والبيانات الوصفية على بادئات المسارات فوق نطاق الخدمة الخاصة.

العمود الثالث: التدوير — للأسرار عمر افتراضي

السر الذي لا يُدوَّر أبداً هو قنبلة موقوتة. كل يوم يمر دون تغيير، تزيد احتمالية أنه قد سُرب ولم يُستخدَم بعد. التدوير هو ممارسة استبدال الأسرار وفق جدول منتظم — أو فور الاشتباه في الاختراق — مع إبقاء الخدمات المعتمدة عليه متاحة. هذا أصعب مما يبدو.

هناك نمطان للتدوير تحتاج إلى فهمهما:

  • التدوير اليدوي: يُولّد المشغّل بيانات اعتماد جديدة، يحدّث مدير الأسرار، ويُعيد تشغيل pods والخدمات لتلتقطها. مناسب للأسرار نادرة الاستخدام (شهادات SSL السنوية، حسابات الخدمة طويلة الأمد). تكلفة جهد بشري عالية وخطر خطأ بشري.
  • الأسرار الديناميكية التلقائية: يُولّد مدير الأسرار بيانات اعتماد جديدة وقصيرة الأمد عند كل طلب، ويحذفها عند انتهاء صلاحية الـ lease. التطبيق لا يحتفظ بنفس بيانات الاعتماد مرتين. هذا هو الإعداد الافتراضي في بيئات الإنتاج لكلمات مرور قواعد البيانات ومفاتيح API السحابية — يُتناول بعمق في الدرس الرابع.
# Secret rotation frequency — production baseline (2025) # # Dynamic secrets (Vault / cloud-native): # Database passwords: TTL 1h (auto-issued per app instance) # Cloud API access tokens: TTL 15m (short-lived STS/OIDC tokens) # Internal service tokens: TTL 30m # # Static secrets (manually rotated): # TLS certificates: 90 days (automated via cert-manager + ACME) # External API keys: 30-90 days (vendor-dependent, calendar reminder) # SSH host keys: 180 days # Root CA private key: 2-5 years (offline, HSM-backed) # # Forced immediate rotation triggers: # - Employee offboarding with secret access # - Git history scan finds a secret # - Vendor notifies of API key leak # - IDS/SIEM alert on anomalous secret usage # AWS Secrets Manager — enable automatic rotation on a secret aws secretsmanager rotate-secret \ --secret-id production/api-service/database \ --rotation-rules AutomaticallyAfterDays=30 \ --rotate-immediately
التدوير الأخضر/الأزرق هو النمط الآمن — لا تقطع بشكل مباشر أبداً. عند تدوير كلمة مرور قاعدة البيانات، النهج الساذج هو تحديث كلمة المرور في قاعدة البيانات، تحديث السر، إعادة تشغيل جميع التطبيقات. خلال فترة إعادة التشغيل، التطبيقات القديمة تحتفظ بالكلمة القديمة (المُلغاة الآن) وتفشل بأخطاء مصادقة. النمط الصحيح: أنشئ بيانات اعتماد جديدة جنباً إلى جنب مع القديمة، حدّث السر بالقيمة الجديدة، دع التطبيقات تلتقطها عبر دورة تجديد الـ lease الاعتيادية، ثم ألغِ بيانات الاعتماد القديمة فقط بعد تأكيد عدم وجود اتصالات تستخدمها. محرك قواعد بيانات Vault المدمج يتولى هذا تلقائياً.

العمود الرابع: التدقيق — كل وصول يجب أن يترك أثراً

التدقيق هو الطريقة التي تجيب بها على ثلاثة أسئلة بعد حادثة أمنية: هل جرى الوصول إلى هذا السر؟ من قِبَل من أو ماذا؟ ومتى؟ بدون سجلات التدقيق، لا يمكنك تحديد نطاق الاختراق. لا يمكنك التمييز بين "هاجم المهاجم قراءة كلمة مرور قاعدة البيانات مرة واحدة" و"المهاجم يسرب البيانات بكميات كبيرة منذ ستة أشهر." كلاهما يبدو متطابقاً من الخارج.

يشمل سجل التدقيق الكامل لوصول الأسرار مسار السر، وهوية الوصول (الخدمة، pod، المشغّل البشري)، والعملية (قراءة، كتابة، حذف، تجديد)، والطابع الزمني، وIP المصدر، والنتيجة (نجاح أو رفض). هذه السجلات يجب أن تكون:

  • غير قابلة للتغيير: مكتوبة إلى مستقبل لا يمكن للواصل تعديله (تسجيل مركزي، SIEM، S3 bucket للكتابة مرة واحدة). مهاجم يملك صلاحيات root على خادم تطبيقك لا يجب أن يتمكن من محو أدلة قراءاته للأسرار.
  • مُحتفظ بها: الحدود التنظيمية الدنيا هي 90 يوماً إلى سنة لمعظم الصناعات (SOC 2، PCI-DSS). خزّن 13 شهراً لتغطية التحليل عاماً بعام.
  • قابلة للتنبيه: الأنماط الشاذة (قراءات بالجملة، قراءات من IPs غير متوقعة، قراءات خارج ساعات العمل، حساب خدمة يظهر لأول مرة) يجب أن تُشغّل تنبيهات فورية — لا يُكتشف بعد وقوع الحادثة فحسب.
# Enable Vault audit device — write to a file (pipe to your SIEM) vault audit enable file file_path=/var/log/vault/audit.log # Vault audit log entry (JSON, one line per event) { "time": "2025-09-14T02:31:07.123Z", "type": "response", "auth": { "client_token": "hmac-sha256:...", "accessor": "hmac-sha256:...", "display_name": "kubernetes-production-api-service", "policies": ["api-service-prod"], "metadata": { "service_account_name": "api-service", "service_account_namespace": "production" } }, "request": { "id": "3e4f8b2a-...", "operation": "read", "path": "secret/data/production/api-service/database", "remote_address": "10.0.1.42" }, "response": { "mount_type": "kv" }, "error": "" } # Ship to Datadog (example) vault audit enable socket address=localhost:10514 socket_type=tcp # Alert rule: secret read from unexpected CIDR (pseudocode for SIEM) # IF event.path MATCHES "secret/data/production/*" # AND event.remote_address NOT IN [10.0.0.0/8, 172.16.0.0/12] # THEN page on-call immediately
سجل تدقيق Vault هو تبعية صارمة — ليس اختيارياً. ترفض Vault خدمة الطلبات إذا كانت جميع أجهزة التدقيق المُهيَّأة غير قابلة للوصول. هذا مقصود: جهاز التدقيق غير المتاح يعني أنك لا تستطيع إثبات الامتثال أو التحقيق في الحوادث. صمّم pipeline التدقيق (شاحن السجلات، نقطة نهاية SIEM) لتوافر عالٍ قبل التفعيل في الإنتاج. استخدم جهازَي تدقيق (ملف + socket) للتكرار.

تجميع الكل: التسلسل الهرمي للمبادئ

هذه المبادئ الأربعة ليست مربعات اختيار مستقلة. إنها تُعزز بعضها في موقف دفاع متعمق:

  1. التخزين المركزي يمنحك لوحة تحكم — مكان واحد لفرض السياسة والتدوير والتدقيق.
  2. مبدأ الصلاحية الدنيا يُقيّد نصف قطر الانفجار عند اختراق هوية خدمة — يحصل المهاجم فقط على أسرار تلك الخدمة.
  3. التدوير يُقيّد النافزة الزمنية التي تكون فيها بيانات الاعتماد المسروقة صالحة — حتى لو فشل التدوير، تنتهي صلاحية الأسرار الديناميكية القصيرة تلقائياً.
  4. التدقيق يضمن إمكانية اكتشاف الاختراق — في الوقت الفعلي (التنبيه) وبعد الوقوع (الطب الشرعي).

الدرس التالي يتعمق في معمارية HashiCorp Vault لمعرفة كيف تُطبّق هذه المبادئ بالضبط على نطاق واسع — آلية الإغلاق/الفتح، وطرق المصادقة، ومحركات الأسرار، ولغة السياسة التي تربطها معاً.