وين تخزّن الـ Secrets في نظامك؟
لو تسرّب اليوم، وش يقدر يسوي فيه؟
فريق البحر التقني
تقريبًا أي نظام يحتوي على معلومات حساسة، مثل:
- Database Passwords
- API Keys
- Access Tokens
- Private Keys
- Encryption Keys
كل هذه المعلومات تُسمّى Secrets.
لكن السؤال الأهم: وين نحفظها؟
لا تحط الـ Secret داخل الكود
أسوأ حل ممكن هو إنك تحط الـ API Key أو كلمة المرور مباشرة داخل الكود.
لأنك لو رفعت الكود على Git بالغلط، أو حصل شخص على صلاحية الوصول إلى الـ Repository، ممكن يوصل إلى المفتاح بسهولة.
وحتى لو حذفت الـ Secret بعد ذلك، ممكن يظل موجودًا في Git History.
طيب، نحطه في .env؟
وضع الـ Secrets داخل ملف .env أفضل من وضعها مباشرة داخل الكود، لكنه مو حلًا متكاملًا لإدارة الأسرار.
في النهاية، .env مجرد ملف موجود على السيرفر.
ولو كانت صلاحيات الملف غير صحيحة، أو دخل ضمن نسخة احتياطية (Backup)، أو قدر Process آخر من الوصول إليه، فممكن يتسرّب الـ Secret.
هنا يجي دور Secrets Manager
بدل ما توزّع الأسرار بين الملفات والسيرفرات، تخزنها في مكان مخصص لإدارتها وحمايتها.
ويأخذ كل Service فقط الـ Secrets التي يحتاجها.
مثلًا:
Application ← Identity ← Secrets Manager ← Database Password • Payment API Key • Signing Key
لكن فيه نقطة مهمة
كون الـ Secret مشفّرًا لا يعني أن المشكلة انتهت.
على سبيل المثال، لو شفّرت API Key وخزنته في قاعدة بيانات، ثم وضعت مفتاح فك التشفير على نفس السيرفر، فأنت فعليًا نقلت المشكلة من مفتاح إلى مفتاح آخر.
وهنا يجي دور KMS
KMS — Key Management Service
يساعدك على إدارة مفاتيح التشفير بشكل منفصل عن التطبيق.
بدل ما يحتفظ التطبيق بمفتاح التشفير الرئيسي بنفسه، تكون إدارة المفاتيح في خدمة مخصصة، مع إمكانية تحديد:
- من يستطيع استخدام المفتاح.
- أي خدمة تستطيع استخدامه.
- ومتى يمكن استخدامه.
ولا تنسى Secret Rotation
بدل ما يكون الـ Password أو الـ API Key صالحًا لسنوات، تقدر تغيّره بشكل دوري وتلغي المفتاح القديم.
وبكذا تقلل الفترة التي يمكن أن يستفيد فيها أي شخص من الـ Secret في حال تسرّبه.
والأفضل من حماية الـ Secret؟
إنك ما تحتاج تخزنه من الأساس.
إذا كانت بنية النظام تسمح، تقدر تستخدم Workload Identity أو Credentials قصيرة العمر بدل الاعتماد على كلمات مرور ومفاتيح ثابتة.
وبشكل عام، ممكن تتطور إدارة الأسرار عندك من:
Hardcoded Secret ← .env ← Secrets Manager ← KMS + Rotation ← Short-lived Credentials / Identity
الفكرة مو بس إخفاء كلمات المرور
إدارة الـ Secrets ما تعني فقط إنك تخفي كلمات المرور.
الفكرة هي إنك تقلل:
- مين يقدر يوصل للـ Secret؟
- وكم مدة صلاحيته؟
- ومين استخدمه ومتى؟
وبالتالي تقلل الضرر المحتمل في حال تسرّبه.
لذلك، بدل ما يكون سؤالك:
هل الـ Secret مشفّر؟
خل سؤالك:
لو تسرّب اليوم، وش يقدر يسوي فيه؟