تخزين الأسرار والمفاتيح وتدويرها
أين تعيش مفاتيحك، ولماذا حذف السرّ المسرَّب لا يكفي؟ ⏱ نحو 35 دقيقة.
- تدرك خطر وضع الأسرار في الكود والمستودعات.
- تخزّن الأسرار في البيئة أو الخزائن.
- تدوّر المفاتيح وتطبّق أقل صلاحية عليها.
- تستجيب لتسريب سرّ بإبطاله.
١السرّ لا يعيش في الكود
كل ما سبق من تشفير وتوقيع يقوم على أسرار: مفاتيح، وكلمات مرور قواعد البيانات، ورموز واجهات برمجية. إن كشف المهاجم السرّ، سقطت الحماية كلها. وأكثر تسريبات الأسرار سببها بسيط: وضعها في الكود.
| الخطأ | لماذا خطر |
|---|---|
| سرّ مكتوب في الكود | يظهر لكل من يرى المستودع |
| سرّ في مستودع Git | يبقى في التاريخ حتى بعد حذفه |
| سرّ في كود الواجهة | يصل إليه كل مستخدم (افتح أدوات المطوّر) |
| سرّ في السجلّات | يُكشف مع كل من يقرأ السجل |
٢أين توضع الأسرار؟
| المكان | ملاءمته |
|---|---|
| متغيّرات البيئة | الحدّ الأدنى: خارج الكود، تُحقن وقت التشغيل |
ملف .env غير مرفوع | للتطوير، مع إضافته إلى .gitignore |
خزنة أسرار (Vault) | الأفضل للإنتاج: تخزين مشفّر، وصول مُدقَّق، تدوير |
| خدمة أسرار سحابية | مُدارة: KMS / Secrets Manager |
// ✗ سرّ في الكودconst SECRET = 'my-real-secret-123'; // ✓ من متغيّر البيئة، يُحقن وقت التشغيلconst SECRET = process.env.JWT_SECRET;if (!SECRET) throw new Error('JWT_SECRET غير مضبوط');
المبدأ: افصل الإعداد (بما فيه الأسرار) عن الكود. الكود يُنشَر علنًا، والأسرار تُحقن في البيئة الآمنة.
٣تدوير المفاتيح وأقل صلاحية
حتى السرّ غير المكشوف يُدوَّر دوريًّا، كي لا يبقى مفتاح واحد صالحًا للأبد، فيقلّ أثر أي تسريب غير مكتشف:
| الممارسة | المعنى |
|---|---|
| التدوير الدوري | مفتاح جديد كل فترة، مع قبول القديم مؤقتًا |
| أقل صلاحية للمفتاح | مفتاح الواجهة يقرأ فقط إن لم يحتج الكتابة |
| مفتاح لكل بيئة | التطوير والإنتاج لا يتشاركان المفتاح |
| الإبطال الفوري | عند الاشتباه، أبطل وولّد غيره |
هذه امتدادٌ لمبدأ أقل الصلاحيات (الدرس 6) على المفاتيح نفسها: كل مفتاح يملك أدنى صلاحية ولأقصر مدة.
توقّع وتحقّق
أين لا يوضع السرّ أبدًا؟
سرّ رُفع إلى مستودع عام:
تدوير المفاتيح يعني:
أفضل مكان لأسرار الإنتاج:
الخلاصة
- لا تضع السرّ في الكود ولا في
Gitولا في الواجهة ولا في السجل. - افصل الإعداد عن الكود: الأسرار في متغيّرات البيئة أو خزنة مُدارة.
- دوّر المفاتيح دوريًّا، وامنح كل مفتاح أقل صلاحية ولكل بيئة مفتاحه.
- السرّ المسرَّب مُبطَل؛ أبطله وولّد غيره فورًا.
تحدٍّ تصميمي: خطة إدارة أسرار «رفيق»
متوسطيملك متجر «رفيق» أسرارًا: كلمة مرور قاعدة البيانات، ومفتاح توقيع JWT، ومفتاح واجهة بوابة الدفع. ضع خطة إدارتها بملء الحقول.
- أين تُخزَّن هذه الأسرار بدل الكود (مكانان على الأقل).
- ماذا تفعل إن تسرّب أحدها إلى مستودع عام.
- ممارستان لتقليل أثر تسريب غير مكتشف (سطر لكل).
- مكانان للتخزين
- متغيّرات البيئة أو خزنة
- عند التسرّب: الإبطال
- ممارستان
- تدوير أو أقل صلاحية
💡 تلميح 1
💡 تلميح 2
💡 تلميح 3
نموذج واحد من إجابات كثيرة صحيحة.
- أين تُخزَّن الأسرار (مكانان)
- متغيّرات البيئة تُحقن وقت التشغيل، خارج الكود.
خزنة أسرار مُدارة(Vault/KMS)للإنتاج، بتخزين مشفّر ووصول مُدقَّق. - عند تسرّب سرّ إلى مستودع عام
- أعتبره مكشوفًا فورًا، فأبطله وأولّد سرًّا جديدًا، ولا أكتفي بحذفه من التاريخ.
- ممارستان لتقليل الأثر (سطر لكل)
- تدوير المفاتيح دوريًّا فلا يبقى مفتاح صالحًا للأبد.
منح كل مفتاح أقل صلاحية ولكل بيئة مفتاحها، فيقلّ ما يكشفه التسريب.