تطبيقك لا يحتاج مستخدم root في قاعدة البيانات
إذا اتصل التطبيق كـroot، فثغرة SQL injection واحدة تملك كل شيء. أعطه مستخدمًا صغيرًا خاصًا به.
ما زلت أجد تطبيقات في الإنتاج تتصل بـMySQL أو PostgreSQL كـroot. يعمل الأمر، فلا أحد يغيّره. لكن هذا يعني أن ثغرة SQL injection واحدة أو ملف .env مسرّب يعطي المهاجم كل قواعد البيانات على الخادم، وأحيانًا ملفات القرص أيضًا.
الإصلاح يأخذ عشر دقائق:
- مستخدم لكل تطبيق، بصلاحية على قاعدة بيانات ذلك التطبيق فقط.
- الصلاحيات التي يستخدمها أثناء التشغيل فقط: غالبًا SELECT وINSERT وUPDATE وDELETE. لا DROP، ولا GRANT، ولا FILE.
- مستخدم منفصل للـmigrations، يُستخدم أثناء النشر، لا من التطبيق العامل.
- حدّد من أين يتصل (خادم التطبيق، لا
%). - التقارير والتحليلات تأخذ مستخدمين للقراءة فقط، ويفضّل على نسخة replica.
في MySQL هذا يعني CREATE USER وGRANT على appdb.*. وفي PostgreSQL دور بصلاحيات على schema واحدة.
مبدأ أقل صلاحية لا يمنع الخطأ، لكنه يحدد إلى أي حد يصبح الخطأ سيئًا.