أين تعيش الأسرار: من ملفات الإعدادات إلى خزائن الأسرار

أنت بصدد إعداد تطبيق جديد. تنشئ ملف .env يحتوي على بيانات اعتماد قاعدة البيانات ومفاتيح API وعناوين الخوادم. يعمل التطبيق على جهازك. تدفع الملف إلى Git ليتمكن زميلك من تشغيل الإعداد نفسه. بعد بضعة أشهر، يصبح التطبيق في بيئة الإنتاج، ويدفع شخص ما ملف .env عن طريق الخطأ إلى مستودع عام. في غضون دقائق، تصبح كلمة مرور قاعدة بيانات الإنتاج على الإنترنت.

هذا السيناريو ليس نادرًا. يحدث لأن أبسط طريقة لتخزين الأسرار هي أيضًا الأكثر خطورة. الرحلة من تخزين الأسرار في ملفات الإعدادات إلى استخدام أدوات إدارة الأسرار المخصصة هي رحلة يمر بها كل فريق، غالبًا بعد أن يتعلم الدرس بالطريقة الصعبة.

مشكلة ملفات الإعدادات

عندما تتعلم بناء التطبيقات لأول مرة، يبدو وضع كل شيء في ملف إعدادات واحد أمرًا طبيعيًا. يصبح ملف .env أو config.json أو application.properties خليطًا غير منظم. عناوين الخوادم غير الحساسة تجاور كلمات مرور قاعدة البيانات شديدة الحساسية. يذهب الملف بأكمله إلى Git، ويمكن لأي شخص لديه حق الوصول إلى المستودع رؤية كل شيء.

يعمل هذا النهج بشكل جيد عندما تكون المطور الوحيد ويعمل التطبيق على حاسوبك المحمول. ولكن بمجرد أن ينمو فريقك أو يصل التطبيق إلى مستخدمين حقيقيين، تظهر الشقوق. يمكن لكل مطور يستنسخ المستودع رؤية كلمات مرور الإنتاج. حتى إذا كان المستودع خاصًا، فإن الأسرار تُخزَّن بشكل دائم في تاريخ Git. حذف الملف من أحدث commit لا يزيله من الـ commits الأقدم. السر موجود هناك إلى الأبد، ويمكن لأي شخص يعرف كيفية تصفح تاريخ Git الوصول إليه.

الخطوة التالية التي تتخذها معظم الفرق هي فصل الأسرار عن الإعدادات العادية. يبقى ملف الإعدادات في Git، لكن القيم الحساسة تصبح عناصر نائبة مثل DB_PASSWORD=changeme. القيم الحقيقية تعيش في مكان آخر: ملف لا يتم دفعه إلى Git، أو متغيرات بيئة على الخادم، أو مستند تتم مشاركته عبر الدردشة. هذا أفضل من تخزين الأسرار في Git، لكنه يقدم مشاكل جديدة. لا يوجد سجل لمن وصل إلى السر. تدوير كلمة المرور يعني تحديثها في عدة أماكن يدويًا. إذا فُقد ملف السر أو تلف، فلا توجد نسخة احتياطية مُدارة لاستعادتها.

ما الذي يغيره مخزن الأسرار المخصص

الفرق التي تتعامل مع تطبيقات وبيئات متعددة تبحث في النهاية عن أدوات مبنية خصيصًا للأسرار. Vault و AWS Secrets Manager و Azure Key Vault و GCP Secret Manager مصممة للتعامل مع البيانات الحساسة بشكل صحيح. لم تعد الأسرار ملفات على القرص. بل أصبحت كائنات يستردها التطبيق عبر API.

التحول من الملفات إلى مخزن أسرار يغير ثلاثة أشياء أساسية:

إليك مثال سريع لكيفية تخزين واسترداد كلمة مرور قاعدة بيانات باستخدام HashiCorp Vault:

# تخزين سر
vault kv put secret/myapp DB_PASSWORD=supersecret

# استرداد السر
vault kv get secret/myapp

# المخرجات:
# ====== Data ======
# Key              Value
# ---              -----
# DB_PASSWORD      supersecret

التحكم في الوصول. مع ملف الإعدادات، يمكن لأي شخص يمكنه قراءة الملف رؤية السر. مع vault، تحدد أي تطبيق أو pipeline يمكنه الوصول إلى أي سر. يمكن لـ CI pipeline لبيئة staging استرداد بيانات اعتماد staging لكن لا يمكنه لمس أسرار الإنتاج. هذه الدقة مستحيلة مع الملفات.

سجل التدقيق. الملفات لا تسجل من قرأها. vault يسجل كل طلب وصول: من طلب، وأي سر طلب، ومتى حدث ذلك. إذا تسرب سر، يمكنك تتبع أي التطبيقات أو المستخدمين وصلوا إليه في وقت قريب من الحادث.

التشفير في حالة السكون وأثناء النقل. تخزن ملفات الإعدادات الأسرار كنص عادي على القرص. vault يشفر الأسرار عند تخزينها وعند إرسالها عبر الشبكة. حتى إذا تمكن شخص ما من الوصول إلى التخزين الأساسي، لا يمكنه قراءة الأسرار بدون مفاتيح التشفير.

التكلفة التشغيلية لاستخدام Vault

أدوات إدارة الأسرار ليست مجانية، والتكلفة ليست مالية فقط. يحتاج فريقك إلى تعلم كيفية تشغيل الأداة. إذا تعطل vault، لا يمكن للتطبيقات جلب الأسرار وقد تتوقف عن العمل تمامًا. تحتاج إلى استراتيجيات للتوفر العالي أو التخزين المؤقت أو آليات التراجع حتى لا يؤدي انقطاع vault إلى تعطيل نظام الإنتاج لديك.

مخازن الأسرار المُدارة في السحابة تقلل العبء التشغيلي لكنها تقدم تسعيرًا لكل طلب أو لكل سر. الفريق الذي يقوم بآلاف طلبات الأسرار في الدقيقة يحتاج إلى النظر في ما إذا كانت التكلفة مستدامة. الخيارات المستضافة ذاتيًا مثل Vault تمنحك تحكمًا أكبر لكنها تتطلب جهدًا مخصصًا للصيانة والترقية والتأمين.

اختيار ما يناسب فريقك

لا توجد إجابة واحدة صحيحة لمكان تخزين الأسرار. يعتمد الاختيار الصحيح على حجم فريقك وعدد التطبيقات وتحمل المخاطر.

يمكن أن يساعدك مخطط التدفق التالي في تحديد النهج الذي يناسب وضعك الحالي:

flowchart TD A[ابدأ: كم عدد التطبيقات والمطورين؟] --> B{حجم الفريق والتعقيد} B -->|فريق صغير، تطبيق واحد| C[استخدم ملف .env غير مدفوع إلى Git] B -->|فريق متنامٍ، تطبيقات متعددة| D[استخدم متغيرات البيئة من CI] B -->|فريق كبير، بيئة خاضعة للتنظيم| E[استخدم vault مخصص مثل HashiCorp Vault] C --> F[المخاطرة: تدوير يدوي، لا سجل تدقيق] D --> G[أفضل: إعدادات مركزية، بعض سجل التدقيق] E --> H[الأفضل: التحكم في الوصول، سجل التدقيق، التشفير]

فريق صغير مع تطبيق واحد وعدد قليل من البيئات يمكنه استخدام ملف منفصل غير مدفوع إلى Git، طالما أن الجميع يفهم المخاطر. المفتاح هو أن يكون الاختيار متعمدًا، وليس الوقوع فيه افتراضيًا.

فريق لديه تطبيقات متعددة وبيئات متعددة والعديد من المطورين سيستفيد من مخزن أسرار مخصص. الجهد المبذول في إعداده يعوض عن نفسه في المرة الأولى التي تحتاج فيها إلى تدوير بيانات اعتماد عبر جميع البيئات أو التحقيق في من وصل إلى سر تم تسريبه لاحقًا.

المبدأ المهم هو الاتساق. أيًا كانت الطريقة التي تختارها، طبقها بشكل موحد. خلط الأساليب، بعض الأسرار في ملفات، والبعض في متغيرات البيئة، والبعض في vault، يخلق ارتباكًا ويزيد من فرصة التعرض العرضي.

قائمة مراجعة عملية لتخزين الأسرار

  • هل الأسرار منفصلة عن الإعدادات العادية؟
  • هل الأسرار مستبعدة من التحكم في الإصدارات (تحقق من .gitignore
  • هل يمكنك تدوير بيانات الاعتماد دون تغيير كود التطبيق؟
  • هل تعرف أي التطبيقات و pipelines يمكنها الوصول إلى كل سر؟
  • هل لديك سجلات تظهر من وصل إلى سر ومتى؟
  • إذا تعطل مخزن الأسرار لديك، هل يمكن لتطبيقك البدء أو الفشل بأمان؟

ما التالي

معرفة أين تخزن الأسرار هي نصف العمل فقط. السؤال التالي هو كيف يسترد pipeline الخاص بك تلك الأسرار دون تخزينها داخل إعدادات pipeline نفسه. pipeline CI/CD يطبع الأسرار في السجلات، أو يخزنها في متغيرات بيئة مرئية لجميع الخطوات، أو يخزنها مؤقتًا في ملفات مساحة العمل، ليس أفضل من ملف إعدادات مدفوع إلى Git. طريقة التخزين مهمة، لكن كيفية تدفق الأسرار خلال عملية التسليم مهمة بنفس القدر.