Linux: صلاحيات الملفات — chmod / chown / umask بالشرح
لينكس نظام تشغيل متعدد المستخدمين. صلاحيات الملفات هي أساس نموذج أمانه — تتحكم فيمن يمكنه القراءة والكتابة والتنفيذ لكل ملف ودليل.
📋 المتطلبات المسبقة: يجب إكمال
- الدرس 4: التنقل في نظام الملفات
- الدرس 5: عمليات الملفات والدلائل
1. ما ستتعلمه
- شرح نموذج صلاحيات rwx
- الصياغة الرقمية لـchmod (755/644/700)
- الصياغة الرمزية لـchmod (u/g/o/a +-=)
- chown لتغيير المالك والمجموعة
- الصلاحيات الافتراضية umask
- الصلاحيات الخاصة: SUID / SGID / Sticky Bit
2. قصة "Permission denied"
(1) الألم: سكريبت لا يعمل
كتب شياو مينغ سكريبت deploy.sh، لكن عندما حاول تشغيله:
./deploy.sh
# bash: ./deploy.sh: Permission denied
فحص صلاحيات الملف:
ls -l deploy.sh
# -rw-r--r-- 1 charlie charlie 50 Jul 7 10:23 deploy.sh
(2) إضافة صلاحية التنفيذ
قال بوب: "سكريبتك يملك صلاحيات قراءة وكتابة، لكن بدون صلاحية تنفيذ. أضف +x فقط."
chmod +x deploy.sh
ls -l deploy.sh
# -rwxr-xr-x 1 charlie charlie 50 Jul 7 10:23 deploy.sh
./deploy.sh # يعمل الآن!
(3) الفائدة: فهم نظام صلاحيات لينكس
فهم شياو مينغ الآن ما يعنيه chmod +x. والأهم، بدأ يفهم لماذا لينكس آمن — كل ملف وكل مستخدم له حدود صلاحيات واضحة.
3. نقاط المعرفة
(1) نموذج صلاحيات rwx
العمود الأول من مخرجات ls -l هو معلومات الصلاحيات. مثلًا -rwxr-xr-x:
- rwx r-x r-x
│ └┬─┘ └┬─┘ └┬─┘
│ │ │ └── صلاحيات الآخرين (other)
│ │ └─────── صلاحيات المجموعة (group)
│ └──────────── صلاحيات مالك الملف (user)
└──────────────── نوع الملف (- ملف عادي / d دليل / l رابط)
معنى بتات الصلاحيات الثلاثة:
| الصلاحية | المحرف | الرقم | للملفات | للدلائل |
|---|---|---|---|---|
| قراءة | r | 4 | عرض محتويات الملف | عرض محتويات الدليل (ls) |
| كتابة | w | 2 | تعديل محتويات الملف | إنشاء/حذف ملفات في الدليل |
| تنفيذ | x | 1 | تشغيل الملف (سكريبت/برنامج) | دخول الدليل (cd داخله) |
(2) الصياغة الرقمية لـchmod
ثلاثة أرقام تقابل صلاحيات المستخدم / المجموعة / الآخرين:
| الرقم | الثنائي | الصلاحيات |
|---|---|---|
| 7 | 111 | rwx (قراءة+كتابة+تنفيذ) |
| 6 | 110 | rw- (قراءة+كتابة) |
| 5 | 101 | r-x (قراءة+تنفيذ) |
| 4 | 100 | r-- (قراءة فقط) |
| 3 | 011 | -wx (كتابة+تنفيذ) |
| 2 | 010 | -w- (كتابة فقط) |
| 1 | 001 | --x (تنفيذ فقط) |
| 0 | 000 | --- (بدون صلاحيات) |
مجموعات الصلاحيات الشائعة:
chmod 755 script.sh # rwxr-xr-x المالك يمكنه قراءة/كتابة/تنفيذ، الآخرون يمكنهم قراءة/تنفيذ
chmod 644 file.txt # rw-r--r-- المالك يمكنه قراءة/كتابة، الآخرون قراءة فقط
> 💡 نصيحة: تذكّر أكثر مجموعتين صلاحيات شيوعًا — 755 هو الصلاحية القياسية للسكريبتات (المالك يمكنه التنفيذ، والآخرون يمكنهم القراءة/التنفيذ)، و644 هو القياسي للملفات العادية (المالك يمكنه القراءة/الكتابة، والآخرون القراءة فقط). الفرق الوحيد بين 755 و644 هو بتة "التنفيذ".
chmod 700 private.sh # rwx------ المالك فقط يمكنه العمل
chmod 600 secret.txt # rw------- المالك فقط يمكنه القراءة/الكتابة
chmod 777 public/ # rwxrwxrwx الجميع يمكنهم العمل (⚠️ غير آمن)
chmod 777 يتيح لكل المستخدمين القراءة والكتابة والتنفيذ، وهو أمر بالغ الخطورة على خادم — إذا اُخترق أي حساب، يمكن للمهاجم تعديل ذلك الملف. لا تستخدم 777 أبدًا في الإنتاج؛ استخدم صلاحيات المجموعة (مثل 775) أو ACLs للوصول المشترك.
(3) الصياغة الرمزية لـchmod
# الصياغة: chmod [من][عملية][صلاحية] ملف
# من: u (المالك) / g (المجموعة) / o (الآخرون) / a (الكل)
# العملية: + (إضافة) / - (إزالة) / = (تعيين بالضبط)
chmod u+x script.sh # إضافة صلاحية تنفيذ للمالك
chmod g-w file.txt # إزالة صلاحية كتابة من المجموعة
chmod o-r private.txt # إزالة صلاحية قراءة من الآخرين
chmod a+x script.sh # إضافة صلاحية تنفيذ للجميع
chmod u=rwx,g=rx,o=r # مكافئ لـ754
(4) chown — تغيير المالك والمجموعة
# تغيير مالك الملف
sudo chown alice file.txt
# تغيير مجموعة الملف
sudo chown :developers file.txt
# تغيير المالك والمجموعة معًا
sudo chown alice:developers file.txt
# تغيير الدليل ومحتوياته بشكل متكرر
sudo chown -R alice:developers /srv/project/
(5) umask — قناع الصلاحيات الافتراضية
عند إنشاء ملف أو دليل جديد، يطرح لينكس قيمة umask لتحديد الصلاحيات الافتراضية.
# عرض umask الحالي
umask
# Output: 0022
# حساب الصلاحيات الافتراضية:
# الحد الأقصى للملفات: 666 (rw-rw-rw-)
# الحد الأقصى للدلائل: 777 (rwxrwxrwx)
# طرح umask 022:
# افتراضي الملف: 666 - 022 = 644 (rw-r--r--)
# افتراضي الدليل: 777 - 022 = 755 (rwxr-xr-x)
# تغيير umask
umask 007 # صلاحيات افتراضية أكثر تشديدًا
umask 000 # كل المستخدمين يمكنهم الكتابة (غير آمن)
(6) الصلاحيات الخاصة
| الصلاحية الخاصة | الرقم | تأثيرها على الملفات | تأثيرها على الدلائل |
|---|---|---|---|
| SUID | 4xxx | يعمل بهوية مالك الملف | (لا يوجد) |
| SGID | 2xxx | يعمل بهوية مجموعة الملف | الملفات الجديدة ترث مجموعة الدليل |
| Sticky Bit | 1xxx | (لا يوجد) | مالك الملف فقط يمكنه الحذف |
/usr/bin/passwd)، وراجع ملفات SUID بانتظام: find / -perm -4000 -type f 2>/dev/null
# تعيين SUID (4)
chmod u+s /usr/bin/passwd # passwd يعمل كجذر
chmod 4755 /usr/bin/program # الصياغة الرقمية لـSUID
# تعيين SGID (2)
chmod g+s /srv/shared # الملفات المنشأة في هذا الدليل ترث المجموعة
chmod 2775 /srv/shared # الصياغة الرقمية لـSGID
# تعيين Sticky Bit (1)
chmod +t /tmp # مالك الملف فقط يمكنه الحذف
chmod 1777 /tmp # الصلاحيات القياسية لـ/tmp
(7) ▶ مثال: عرض صلاحيات الملفات
# عرض الصلاحيات بالصيغة الطويلة
ls -l /etc/passwd
# -rw-r--r-- 1 root root 2845 Jul 7 10:23 /etc/passwd
# عرض صلاحيات الدليل
ls -ld /tmp
# drwxrwxrwt 1 root root 4096 Jul 7 10:23 /tmp
# الحرف t النهائي يشير إلى Sticky Bit
# عرض صلاحيات الدليل بشكل متكرر
ls -laR /srv/project | head -20
الإخراج:
TEXT/srv/project: total 16 drwxr-xr-x 3 alice developers 4096 Jul 7 10:23 . drwxr-xr-x 4 root root 4096 Jul 7 09:00 .. -rw-r--r-- 1 alice developers 256 Jul 7 10:23 config.yaml -rwxr-xr-x 1 alice developers 512 Jul 7 10:23 deploy.sh drwxr-xr-x 2 alice developers 4096 Jul 7 10:23 src
(8) ▶ مثال: الصياغة الرقمية لـchmod
# 755 — صلاحيات السكريبت القياسية
chmod 755 deploy.sh
ls -l deploy.sh
# -rwxr-xr-x
# 644 — صلاحيات الملف القياسية
chmod 644 index.html
ls -l index.html
# -rw-r--r--
# 600 — ملف خاص
chmod 600 private.key
ls -l private.key
# -rw-------
الإخراج:
TEXT-rwxr-xr-x 1 alice developers 512 Jul 7 10:23 deploy.sh -rw-r--r-- 1 alice developers 256 Jul 7 10:23 index.html -rw------- 1 alice developers 128 Jul 7 10:23 private.key
(9) ▶ مثال: الصياغة الرمزية لـchmod
# إضافة صلاحية تنفيذ
chmod +x script.sh # إضافة +x للجميع (مكافئ لـa+x)
# إضافة صلاحية تنفيذ للمالك فقط
chmod u+x script.sh
# إزالة صلاحية الكتابة من المجموعة والآخرين
chmod go-w config.txt
# تعيين صلاحيات قياسية لسكريبت Shell
chmod u=rwx,g=rx,o=r script.sh
# مكافئ لـchmod 755 script.sh
الإخراج:
TEXT-rwxr-xr-- 1 alice developers 512 Jul 7 10:23 script.sh
(10) ▶ مثال: chown لتغيير المالك
# تغيير مالك الملف
sudo chown www-data index.html
# تغيير المجموعة
sudo chown :www-data /srv/www/
# تغيير الاثنين معًا
sudo chown alice:developers project/
# تغيير شجرة الدليل بالكامل بشكل متكرر
sudo chown -R alice:alice ~alice/
الإخراج:
TEXT-rw-r--r-- 1 www-data www-data 256 Jul 7 10:23 index.html drwxr-xr-x 2 www-data www-data 4096 Jul 7 10:23 /srv/www/ drwxr-xr-x 3 alice developers 4096 Jul 7 10:23 project/
(11) ▶ مثال: umask في الممارسة
# عرض umask الحالي
umask
# Output: 0022
# إنشاء ملف جديد للاختبار
touch test.txt
ls -l test.txt
# -rw-r--r-- ← 644 (666 - 022)
mkdir testdir
ls -ld testdir
# drwxr-xr-x ← 755 (777 - 022)
# إنشاء بعد تغيير umask
umask 0077
touch secret.txt
ls -l secret.txt
# -rw------- ← 600 (666 - 077)
الإخراج:
TEXT0022 -rw-r--r-- 1 alice alice 0 Jul 7 10:23 test.txt drwxr-xr-x 2 alice alice 4096 Jul 7 10:23 testdir -rw------- 1 alice alice 0 Jul 7 10:23 secret.txt
(12) ▶ مثال شامل: إعدادات الصلاحيات الصحيحة لتطبيق وب
# لنفترض أن /var/www/myapp هو دليل تطبيق الوب
# 1. تعيين المالك والمجموعة
sudo chown -R www-data:www-data /var/www/myapp
# 2. صلاحيات الدلائل: 755 (المالك قراءة/كتابة/تنفيذ، الآخرون قراءة/تنفيذ)
find /var/www/myapp -type d -exec chmod 755 {} \;
# 3. صلاحيات الملفات: 644 (المالك قراءة/كتابة، الآخرون قراءة فقط)
find /var/www/myapp -type f -exec chmod 644 {} \;
# 4. السكريبتات التنفيذية: 755
chmod 755 /var/www/myapp/deploy.sh
# 5. الملفات الحساسة: 600
chmod 600 /var/www/myapp/.env
# 6. دليل الرفع: دليل قابل للكتابة
chmod 775 /var/www/myapp/uploads
❓ أسئلة شائعة
س: لماذا
chmod 777غير آمن؟ ج:chmod 777يتيح لكل المستخدمين القراءة والكتابة والتنفيذ. إذا اُخترق أي حساب، يمكن للمهاجم تعديل أو حذف الملف، مما يخلق خطر رفع الصلاحيات. في الإنتاج، استخدم صلاحيات المجموعة (مثل 775) أو ACLs للوصول المشترك بدلًا من 777.
س: لماذا الملفات المنشأة حديثًا افتراضيًا 644 وليس 755؟ ج: بسبب مبدأ الأمان — الملفات الجديدة لا تحصل على صلاحية التنفيذ افتراضيًا. لينكس يفترض أن معظم الملفات لا تحتاج صلاحية تنفيذ؛ إذا احتجتها، أضفها صراحةً بـ
chmod +x.
س: لماذا لا يمكنني الكتابة في
/etcبعد تسجيل الدخول عبر SSH؟ ج:/etcيخص الجذر، والمستخدمون العاديون لديهم صلاحية قراءة فقط (r-x). لتعديل ملفات تحت/etc، يجب استخدامsudoلرفع الصلاحيات. هذا تصميم أمان يحمي النظام.
س: ما مخاطر برامج SUID؟ ج: برامج SUID تعمل بصلاحيات مالك الملف (عادة الجذر). إذا كان برنامج SUID فيه ثغرة، يمكن لمستخدم عادي رفع صلاحياته إلى الجذر. لذا لا تضع SUID إلا على البرامج الضرورية (مثل
passwdوping)، وراجعها بانتظام.
س: هل
chmod -R 755آمن للتغييرات المتكررة للدلائل؟ ج: يعتمد. إذا كان الدليل يحتوي ملفات سكريبت، فـ755 معقول. لكن استخدامfindلتعيين صلاحيات مختلفة للملفات (644) والدلائل (755) أكثر أمانًا ودقة.
📖 ملخص
- العمود الأول من
ls -l:-rwxr-xr-x= نوع ملف + مالك/مجموعة/آخرون × rwx - الصياغة الرقمية لـchmod:
755للسكريبتات، و644للملفات، و600للملفات الخاصة - الصياغة الرمزية لـchmod:
u+xيضيف تنفيذ للمالك، وgo-wيزيل كتابة المجموعة والآخرين - chown يغيّر المالك (
alice:developers)، استخدم-Rللتكرار - umask يتحكم في الصلاحيات الافتراضية؛ القيم الشائعة: 022 (644/755)، 077 (600/700)
- الصلاحيات الخاصة: SUID (4) يرث المالك، وSGID (2) يرث المجموعة، وSticky Bit (1) يمنع الحذف
📝 تمارين
- أساسي (صعوبة ⭐): أنشئ سكريبتًا، أضف صلاحية التنفيذ بـ
chmod +x، وشغّله؛ ثم استخدم الصياغة الرقمية لتعيين ملف إلى 644 ودليل إلى 755 - متوسط (صعوبة ⭐⭐): استخدم الصياغة الرمزية لإزالة كل صلاحيات المجموعة والآخرين من ملف، ثم أنشئ مستخدم اختبار (
sudo useradd testuser) واستخدمchownلنقل ملكية الملف إليه - متقدم (صعوبة ⭐⭐⭐): أنشئ دليلًا مشتركًا، اضبط SGID (
chmod g+s) لترث الملفات الجديدة المجموعة، واستخدمfind+chmodلتعيين ملفات مشروع وب مجمّعًا إلى 644 ودلائله إلى 755