أساسيات لينكس

الصلاحيات والملكية

18 دقيقة الدرس 6 من 26

الصلاحيات والملكية

يحمل كل ملف ومجلد في نظام Linux سجلاً أمنياً صغيراً لكنه بالغ الأثر: مالك، ومجموعة، ومجموعة من بتات الصلاحية. أخطاء في هذا الإعداد على خادم إنتاجي تفتح ثغرة أمنية أو تتسبب في عطل — وغالباً كلاهما معاً في أسوأ لحظة ممكنة. يشرح هذا الدرس النموذج بالكامل، من تخطيط البتات الخام إلى الإعدادات الافتراضية التي تفرضها فرق عمليات كبرى التقنية منذ اليوم الأول.

الطبقات الثلاث: المالك والمجموعة والآخرون

يتتبع Linux ثلاث هويات لكل عنصر في نظام الملفات:

  • المالك (u — user): الحساب الذي أنشأ الملف، أو من خُصِّص له عبر chown.
  • المجموعة (g): مجموعة مسماة من المستخدمين. يحصل أي عضو في المجموعة المعيّنة على صلاحيات المجموعة.
  • الآخرون (o): كل شخص آخر — أي عملية تعمل بحساب لا يمثّل المالك ولا ينتمي إلى المجموعة.

يفحص النواة هذه الطبقات بالترتيب ويتوقف عند أول تطابق. إن كنت المالك، تُطبَّق بتات المالك فقط — حتى لو كانت بتات المجموعة أكثر تساهلاً.

بتات rwx — قراءة سلسلة الصلاحيات

شغّل ls -l على أي ملف وستجد العمود الأيسر عبارة عن سلسلة من 10 محارف مثل -rwxr-xr--. تفسيرها:

Linux Permission Bit Layout - r w x r - x r - - Type (- file) Owner (u) rwx = 7 Group (g) r-x = 5 Others (o) r-- = 4 Bit Values r (read) = 4 w (write) = 2 x (execute) = 1 - (none) = 0 Full mode: -rwxr-xr-- = 0754 Owner: r+w+x = 4+2+1 = 7 Group: r+x = 4+0+1 = 5 Others: r = 4+0+0 = 4 بت x للمجلدات x = الدخول إليه w = إنشاء/حذف ملفات r = سرد المحتوى
تشريح سلسلة صلاحيات Linux: بت النوع، ثم ثلاث ثلاثيات rwx للمالك والمجموعة والآخرين.

للمجلدات، تحمل البتات معنىً مختلفاً قليلاً: r تتيح سرد المحتوى (lsw تتيح إنشاء أو حذف ملفات داخله، وx (بت "التنفيذ") هو بت البحث — بدونه لا يمكنك cd للدخول إلى المجلد أو اجتيازه في المسار، حتى لو كان لديك صلاحية القراءة.

chmod — تغيير الصلاحيات

تتوفر طريقتان: الرمزية والثمانية (octal). كلتاهما تُستخدم يومياً؛ احفظهما جيداً.

# --- الوضع الرمزي --- chmod u+x deploy.sh # إضافة صلاحية التنفيذ للمالك chmod g-w secrets.conf # إزالة صلاحية الكتابة من المجموعة chmod o=r report.txt # تحديد الآخرين بالقراءة فقط chmod a+x script.sh # إضافة تنفيذ للجميع (a = ugo) chmod u+x,g-w,o-rwx app.sh # تغييرات متعددة في أمر واحد # --- الوضع الثماني (الأكثر شيوعاً في السكريبتات و IaC) --- chmod 755 /usr/local/bin/myapp # rwxr-xr-x (ثنائيات نموذجية) chmod 644 /etc/nginx/nginx.conf # rw-r--r-- (ملف إعدادات) chmod 600 ~/.ssh/id_rsa # rw------- (المفتاح الخاص — يشترطه ssh) chmod 700 ~/.ssh # rwx------ (مجلد ssh — يشترطه ssh) chmod 664 uploads/avatar.png # rw-rw-r-- (مشترك قابل للكتابة بالمجموعة) # --- تطبيق تكراري --- chmod -R 755 /var/www/html # يُطبَّق على شجرة المجلدات
لا تستخدم chmod 777 أبداً في الإنتاج. يمنح هذا الخيار صلاحية الكتابة لكل مستخدم على النظام. خطأ شائع هو "إصلاح" تطبيق ويب لا يستطيع الكتابة في storage/ بضبط 777 — هذا يمنح أي عملية مخترقة القدرة على الكتابة فوق ملفات تطبيقك. الإصلاح الصحيح هو تحديد المالك أو المجموعة الصحيحين، لا فتح الصلاحيات للعالم.

chown — تغيير الملكية

يستطيع تغيير مالك الملف فقط root (أو عملية تمتلك CAP_CHOWN). الصيغة هي chown user:group target.

# تغيير المالك فقط chown deployer app.py # تغيير المالك والمجموعة معاً chown www-data:www-data /var/www/html # تغيير المجموعة فقط (لاحظ النقطتين البادئتين) chown :developers /srv/shared/ # تطبيق تكراري — ضروري بعد فك ضغط أرشيف إصدار chown -R www-data:www-data /var/www/myapp # فحص الملكية الحالية stat -c "%U %G %a" /etc/nginx/nginx.conf # الناتج: root root 644
نمط الإنتاج — حسابات الخدمة بأدنى صلاحية: في بيئات كبرى التقنية تعمل كل خدمة طويلة الأمد بحساب نظام مخصص غير root (مثل www-data أو nginx أو postgres). تكون ملفات التطبيق مملوكة لهذا الحساب، ولا يستطيع أي مستخدم آخر الكتابة فيها. هذا يحدّ من نطاق الضرر إن اختُرقت الخدمة — يتحكم المهاجم فقط بما يستطيع ذلك الحساب الوصول إليه.

umask — مرشح الصلاحيات الافتراضي

عندما تنشئ عملية ملفاً جديداً، تبدأ النواة بصلاحية أساسية 0666 للملفات و0777 للمجلدات، ثم تطرح بتات umask. تعمل umask كقناع بتات لحجب الصلاحيات.

الإعداد الافتراضي الأكثر شيوعاً هو 0022: يحجب الكتابة عن المجموعة والآخرين. لذا يحصل الملف الجديد على 0666 & ~0022 = 0644 (rw-r--r--)، والمجلد الجديد على 0777 & ~0022 = 0755 (rwxr-xr-x).

umask # عرض القناع الحالي (مثلاً 0022) umask 027 # حجب الجميع عن الآخرين، وحجب الكتابة عن المجموعة # الملفات الجديدة: 0640 (rw-r-----) # المجلدات الجديدة: 0750 (rwxr-x---) # الضبط لجلسة محددة في سكريبت بدء التشغيل: # أضف إلى /etc/profile.d/security.sh أو ~/.bashrc umask 027 # التحقق: أنشئ ملفاً وافحص umask 027 && touch /tmp/testfile && stat -c "%a" /tmp/testfile # الناتج: 640
توصية umask للإنتاج: تشترط معظم خطوط أمان Linux المُصلَّبة (CIS Benchmark المستوى الأول) قيمة 027 أو 077 لحسابات النظام. تعيين 022 في بيئة الخدمة هو الحد الأدنى المطلق — يمنع ظهور ملفات إعداد قابلة للكتابة من المجموعة/العالم بعد الترقيات. اضبط umask في ملف وحدة الخدمة (UMask=0027 في systemd) حتى لا يعتمد على بيئة الشل الذي أطلق الخدمة.

البتات الخاصة: setuid وsetgid والـ Sticky

ثلاث بتات إضافية تعيش فوق ثلاثيات rwx القياسية. تظهر كرقم رابع في الثماني (octal) أو كمحارف معدّلة في ناتج ls.

Special Permission Bits: setuid, setgid, sticky setuid (SUID) chmod 4755 file ls: -rwsr-xr-x البادئة الثمانية: 4 ls يعرض: s في x المالك يعمل بهوية مالك الملف، لا المستخدم المنفِّذ. مثال: /usr/bin/passwd (يكتب في /etc/shadow بصلاحية root) setgid (SGID) chmod 2755 dir/ ls: drwxr-sr-x البادئة الثمانية: 2 ls يعرض: s في x المجموعة على المجلدات: الملفات الجديدة ترث مجموعة المجلد الأب. مثال: /srv/team/ مشترك بين الفريق Sticky Bit chmod 1777 /tmp ls: drwxrwxrwt البادئة الثمانية: 1 ls يعرض: t في x الآخرين على المجلدات: فقط المالك أو root يستطيع حذف الملف، حتى لو كان المجلد مفتوحاً. مثال: /tmp
البتات الثلاث الخاصة — setuid وsetgid والـ sticky — واستخداماتها الرئيسية.

ضبط هذه البتات يتبع نفس صيغة 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 بعد ضبط البتات الخاصة.

ثنائيات SUID هي سطح هجوم رئيسي. يمكن لأي ثنائي SUID يعمل بصلاحية root أن يُستخدم لتصعيد الصلاحيات إن احتوى ثغرة قابلة للاستغلال. تصليب الإنتاج: افحص جميع ثنائيات SUID بأمر find / -perm /4000 -ls 2>/dev/null، وأزل البتة من كل ما لا يحتاجها فعلاً، واستخدم nosuid خياراً في mount على أقسام نظام الملفات التي لا يجب أن تحتوي ثنائيات SUID (مثل /home و/tmp و/var).

قائمة مراجعة الإنتاج العملية

هذه هي أنماط الصلاحيات التي ستضبطها مراراً عبر كل بيئة:

  • 600 — المفاتيح الخاصة (~/.ssh/id_rsa)، ملفات كلمات مرور قواعد البيانات، ملفات .env
  • 644 — أصول الويب الثابتة، ملفات الإعدادات التي يقرأها الـ daemon بصلاحية root
  • 755 — الثنائيات، مجلدات الويب، السكريبتات في /usr/local/bin
  • 700~/.ssh، السكريبتات التي تحتوي بيانات اعتماد مضمّنة
  • 2775 — مجلدات الفريق المشتركة حيث يجب أن تنتقل ملكية المجموعة
  • 1777 — مجلدات المؤقتة القابلة للكتابة من الجميع

حين لا يستطيع تطبيق ويب الكتابة في مجلد التحميلات أو المؤقتات، الإجابة غالباً هي chown مفقود — لا chmod 777. حدد مستخدم العملية (ps aux | grep nginx)، ثم chown -R processuser:processuser /var/www/app/storage واضبط المجلد على 755 أو 775.

أتمتة إنفاذ الصلاحيات في CI/CD: أضف خطوة فحص صلاحيات إلى خط النشر. أمر بسيط مثل find /var/www/app -perm /o+w -ls سيكشف أي ملفات قابلة للكتابة من العالم أُنشئت بسكريبت نشر مُخطئ أو مطور يختبر على الخادم. اجعلها حاجزاً في الـ pipeline — أفشل النشر إن ظهر أي ملف قابل للكتابة من العالم خارج المسارات المسموحة صراحةً.