عند الحديث عن أمان خادم لينكس، يُعد تقييد صلاحيات الجذر غير الضرورية من أهم الخطوات. ماذا لو كان تطبيقك بحاجة إلى الاستماع على منفذ أصغر من 1024 ولا تريد تشغيله كجذر؟ هنا تأتي قدرات لينكس (Linux capabilities) للإنقاذ. في هذه المقالة، سنشرح خطوة بخطوة كيفية فتح منفذ باستخدام نظام قدرات لينكس دون الحاجة لصلاحية الجذر.
ما هي قدرات لينكس؟
في نماذج يونكس التقليدية، كان يتم النظر فقط فيما إذا كانت العملية جذرًا أم لا. الجذر يتمتع بصلاحيات غير محدودة على النظام بأكمله، بينما المستخدم العادي محدود للغاية. قدرات لينكس تلون هذه الصورة بالأبيض والأسود: فهي تقسم صلاحيات الجذر إلى وحدات صغيرة ومستقلة. على سبيل المثال، تسمح قدرة CAP_NET_BIND_SERVICE لعملية بالاتصال بالمنافذ الأصغر من 1024 دون منح صلاحيات الجذر الأخرى.
هذا النظام مثالي بشكل خاص للخدمات مثل خوادم الويب، خوادم DNS، أو قواعد البيانات. إذا كان تطبيقك يستخدم المنافذ 80 أو 443 أو 53، فيمكنك بفضل القدرات تشغيله كمستخدم عادي، مما يمنع المهاجم من السيطرة على النظام بأكمله في حالة وجود ثغرة أمنية.
كيفية فتح منفذ بدون صلاحية الجذر؟
1. تعيين قدرة لملف ثنائي
لإعطاء تطبيق معين قدرة محددة، نستخدم الأمر setcap. على سبيل المثال، لإضافة CAP_NET_BIND_SERVICE إلى ملف nginx الثنائي:
sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/nginxيسمح هذا الأمر لـ nginx بالاتصال بالمنفذ 80 حتى عند تشغيله كمستخدم عادي. يشير +ep إلى أن القدرة يجب أن تكون موجودة في كل من المجموعة الفعالة (effective) والمجموعة المسموح بها (permitted).
2. إعطاء قدرة لعملية قيد التشغيل
في بعض الحالات، قد ترغب في إعطاء قدرة لعملية قيد التشغيل لاحقًا. يمكن استخدام capsh أو prctl. لكن الطريقة الأكثر عملية هي استخدام القدرات المحيطة (ambient capabilities) عند بدء التشغيل. على سبيل المثال، في ملف خدمة systemd:
[Service] AmbientCapabilities=CAP_NET_BIND_SERVICE User=nginx ExecStart=/usr/sbin/nginx -g 'daemon off;'بهذه الطريقة، يعمل nginx كمستخدم nginx ولكن لديه صلاحية الاتصال بالمنفذ 80.
نقاط مهمة ونصائح أمنية
- امنح فقط القدرات الضرورية. على سبيل المثال، CAP_NET_ADMIN تتضمن صلاحيات أوسع بكثير؛ استخدمها فقط عند الحاجة الفعلية.
- امنع المستخدمين غير المصرح لهم من استخدام setcap. يجب أن يتمكن فقط الجذر أو من لديه صلاحية sudo من ذلك.
- تحقق من القدرات بانتظام. باستخدام getcap، يمكنك رؤية الملفات التي تمتلك أي قدرات:
مثال عملي: خادم HTTP بسيط بلغة بايثون
لنفترض أن لديك خادم HTTP بسيط ببايثون يعمل على المنفذ 80. عادةً لا يمكنك تشغيله بدون جذر. إليك الخطوات:
- تعيين قدرة لمفسر بايثون: sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3
- تشغيل الخادم كمستخدم عادي: python3 -m http.server 80
- الآن يتم الاستماع على المنفذ 80 دون الحاجة للجذر.
تحذير: هذه الطريقة تعطي صلاحية لجميع نصوص بايثون، لذا كن حذرًا. الأفضل تشغيل النص المعني فقط بمستخدم خاص.
هل نحتاج لاستخدام القدرات؟
بالطبع هناك بدائل: authbind، إعادة توجيه المنفذ عبر iptables، أو نقل المقابس عبر systemd. لكن القدرات هي النهج الأكثر مباشرة وحداثة. خاصة أن تقنيات الحاويات (Docker، Podman) مبنية على القدرات. في حاويات Docker، يتم استخدام --cap-add لإجراء عمليات مماثلة.
الخلاصة
قدرات لينكس هي أداة لا غنى عنها لتعزيز أمان الخادم. بتقييد صلاحية الجذر، تقلل من تأثير أي اختراق محتمل. خاصة فتح المنافذ عبر CAP_NET_BIND_SERVICE هو من أكثر الطرق شيوعًا بعد إعدادات جدار الحماية.
في HostingServer.com.tr، نستمر في مشاركة أحدث التقنيات للحفاظ على خوادمك آمنة وذات أداء عالٍ. إذا كانت لديك أسئلة، فلا تتردد في التعليق!