الصلاحيات والملكية
الصلاحيات والملكية
يحمل كل ملف ومجلد في نظام Linux سجلاً أمنياً صغيراً لكنه بالغ الأثر: مالك، ومجموعة، ومجموعة من بتات الصلاحية. أخطاء في هذا الإعداد على خادم إنتاجي تفتح ثغرة أمنية أو تتسبب في عطل — وغالباً كلاهما معاً في أسوأ لحظة ممكنة. يشرح هذا الدرس النموذج بالكامل، من تخطيط البتات الخام إلى الإعدادات الافتراضية التي تفرضها فرق عمليات كبرى التقنية منذ اليوم الأول.
الطبقات الثلاث: المالك والمجموعة والآخرون
يتتبع Linux ثلاث هويات لكل عنصر في نظام الملفات:
- المالك (u — user): الحساب الذي أنشأ الملف، أو من خُصِّص له عبر
chown. - المجموعة (g): مجموعة مسماة من المستخدمين. يحصل أي عضو في المجموعة المعيّنة على صلاحيات المجموعة.
- الآخرون (o): كل شخص آخر — أي عملية تعمل بحساب لا يمثّل المالك ولا ينتمي إلى المجموعة.
يفحص النواة هذه الطبقات بالترتيب ويتوقف عند أول تطابق. إن كنت المالك، تُطبَّق بتات المالك فقط — حتى لو كانت بتات المجموعة أكثر تساهلاً.
بتات rwx — قراءة سلسلة الصلاحيات
شغّل ls -l على أي ملف وستجد العمود الأيسر عبارة عن سلسلة من 10 محارف مثل -rwxr-xr--. تفسيرها:
للمجلدات، تحمل البتات معنىً مختلفاً قليلاً: r تتيح سرد المحتوى (ls)، w تتيح إنشاء أو حذف ملفات داخله، وx (بت "التنفيذ") هو بت البحث — بدونه لا يمكنك cd للدخول إلى المجلد أو اجتيازه في المسار، حتى لو كان لديك صلاحية القراءة.
chmod — تغيير الصلاحيات
تتوفر طريقتان: الرمزية والثمانية (octal). كلتاهما تُستخدم يومياً؛ احفظهما جيداً.
chmod 777 أبداً في الإنتاج. يمنح هذا الخيار صلاحية الكتابة لكل مستخدم على النظام. خطأ شائع هو "إصلاح" تطبيق ويب لا يستطيع الكتابة في storage/ بضبط 777 — هذا يمنح أي عملية مخترقة القدرة على الكتابة فوق ملفات تطبيقك. الإصلاح الصحيح هو تحديد المالك أو المجموعة الصحيحين، لا فتح الصلاحيات للعالم.
chown — تغيير الملكية
يستطيع تغيير مالك الملف فقط root (أو عملية تمتلك CAP_CHOWN). الصيغة هي chown user:group target.
www-data أو nginx أو postgres). تكون ملفات التطبيق مملوكة لهذا الحساب، ولا يستطيع أي مستخدم آخر الكتابة فيها. هذا يحدّ من نطاق الضرر إن اختُرقت الخدمة — يتحكم المهاجم فقط بما يستطيع ذلك الحساب الوصول إليه.
umask — مرشح الصلاحيات الافتراضي
عندما تنشئ عملية ملفاً جديداً، تبدأ النواة بصلاحية أساسية 0666 للملفات و0777 للمجلدات، ثم تطرح بتات umask. تعمل umask كقناع بتات لحجب الصلاحيات.
الإعداد الافتراضي الأكثر شيوعاً هو 0022: يحجب الكتابة عن المجموعة والآخرين. لذا يحصل الملف الجديد على 0666 & ~0022 = 0644 (rw-r--r--)، والمجلد الجديد على 0777 & ~0022 = 0755 (rwxr-xr-x).
027 أو 077 لحسابات النظام. تعيين 022 في بيئة الخدمة هو الحد الأدنى المطلق — يمنع ظهور ملفات إعداد قابلة للكتابة من المجموعة/العالم بعد الترقيات. اضبط umask في ملف وحدة الخدمة (UMask=0027 في systemd) حتى لا يعتمد على بيئة الشل الذي أطلق الخدمة.
البتات الخاصة: setuid وsetgid والـ Sticky
ثلاث بتات إضافية تعيش فوق ثلاثيات rwx القياسية. تظهر كرقم رابع في الثماني (octal) أو كمحارف معدّلة في ناتج ls.
ضبط هذه البتات يتبع نفس صيغة chmod مع البتات الخاصة كأرقام ثمانية بادئة:
chmod 4755 /usr/local/bin/myprog— setuid مع 755 العاديةchmod 2775 /srv/shared— setgid على مجلد مشتركchmod 1777 /tmp— sticky مع قابلية الكتابة للجميع (معيار/tmp)
حين يظهر s بحرف كبير (S) في ناتج ls، يعني أن بتة setuid/setgid مضبوطة لكن بتة التنفيذ غير مضبوطة — وضع عديم الفائدة ومربك. تحقق دائماً بـ ls -l بعد ضبط البتات الخاصة.
find / -perm /4000 -ls 2>/dev/null، وأزل البتة من كل ما لا يحتاجها فعلاً، واستخدم nosuid خياراً في mount على أقسام نظام الملفات التي لا يجب أن تحتوي ثنائيات SUID (مثل /home و/tmp و/var).
قائمة مراجعة الإنتاج العملية
هذه هي أنماط الصلاحيات التي ستضبطها مراراً عبر كل بيئة:
600— المفاتيح الخاصة (~/.ssh/id_rsa)، ملفات كلمات مرور قواعد البيانات، ملفات.env644— أصول الويب الثابتة، ملفات الإعدادات التي يقرأها الـ daemon بصلاحية root755— الثنائيات، مجلدات الويب، السكريبتات في/usr/local/bin700—~/.ssh، السكريبتات التي تحتوي بيانات اعتماد مضمّنة2775— مجلدات الفريق المشتركة حيث يجب أن تنتقل ملكية المجموعة1777— مجلدات المؤقتة القابلة للكتابة من الجميع
حين لا يستطيع تطبيق ويب الكتابة في مجلد التحميلات أو المؤقتات، الإجابة غالباً هي chown مفقود — لا chmod 777. حدد مستخدم العملية (ps aux | grep nginx)، ثم chown -R processuser:processuser /var/www/app/storage واضبط المجلد على 755 أو 775.
find /var/www/app -perm /o+w -ls سيكشف أي ملفات قابلة للكتابة من العالم أُنشئت بسكريبت نشر مُخطئ أو مطور يختبر على الخادم. اجعلها حاجزاً في الـ pipeline — أفشل النشر إن ظهر أي ملف قابل للكتابة من العالم خارج المسارات المسموحة صراحةً.