Linux: صلاحيات الملفات — chmod / chown / umask بالشرح

لينكس نظام تشغيل متعدد المستخدمين. صلاحيات الملفات هي أساس نموذج أمانه — تتحكم فيمن يمكنه القراءة والكتابة والتنفيذ لكل ملف ودليل.

📋 المتطلبات المسبقة: يجب إكمال

1. ما ستتعلمه


2. قصة "Permission denied"

(1) الألم: سكريبت لا يعمل

كتب شياو مينغ سكريبت deploy.sh، لكن عندما حاول تشغيله:

BASH
./deploy.sh
# bash: ./deploy.sh: Permission denied

فحص صلاحيات الملف:

TEXT
ls -l deploy.sh
# -rw-r--r-- 1 charlie charlie 50 Jul 7 10:23 deploy.sh

(2) إضافة صلاحية التنفيذ

قال بوب: "سكريبتك يملك صلاحيات قراءة وكتابة، لكن بدون صلاحية تنفيذ. أضف +x فقط."

BASH
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:

TEXT

-  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 --- (بدون صلاحيات)

مجموعات الصلاحيات الشائعة:

BASH
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

BASH
# الصياغة: 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 — تغيير المالك والمجموعة

BASH
# تغيير مالك الملف
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 لتحديد الصلاحيات الافتراضية.

TEXT
# عرض 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    # كل المستخدمين يمكنهم الكتابة (غير آمن)
💡 نصيحة: حساب umask ليس طرحًا بسيطًا — هو "قناع" صلاحيات. الحد الأقصى لصلاحيات الملفات هو 666 (بدون تنفيذ افتراضيًا)، وللدلائل 777. umask بقيمة 022 يزيل صلاحية الكتابة لـ"المجموعة" و"الآخرين"، نتيجًا ملف 644 ودليل 755، وهو الأكثر أمانًا كافتراضي.

(6) الصلاحيات الخاصة

الصلاحية الخاصة الرقم تأثيرها على الملفات تأثيرها على الدلائل
SUID 4xxx يعمل بهوية مالك الملف (لا يوجد)
SGID 2xxx يعمل بهوية مجموعة الملف الملفات الجديدة ترث مجموعة الدليل
Sticky Bit 1xxx (لا يوجد) مالك الملف فقط يمكنه الحذف
⚠️ ملاحظة: برامج SUID/SGID تعمل بصلاحيات مالك الملف أو مجموعته. إذا كان في مثل هذا البرنامج ثغرة، يمكن للمهاجم رفع صلاحياته إلى الجذر. لذا لا تضع SUID إلا على البرامج الضرورية (مثل /usr/bin/passwd)، وراجع ملفات SUID بانتظام: find / -perm -4000 -type f 2>/dev/null

BASH
# تعيين 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) ▶ مثال: عرض صلاحيات الملفات

BASH
# عرض الصلاحيات بالصيغة الطويلة
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

BASH
# 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

BASH
# إضافة صلاحية تنفيذ
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 لتغيير المالك

BASH
# تغيير مالك الملف
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 في الممارسة

BASH
# عرض 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)

الإخراج:

TEXT
0022
-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) ▶ مثال شامل: إعدادات الصلاحيات الصحيحة لتطبيق وب

BASH
# لنفترض أن /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) أكثر أمانًا ودقة.


📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): أنشئ سكريبتًا، أضف صلاحية التنفيذ بـchmod +x، وشغّله؛ ثم استخدم الصياغة الرقمية لتعيين ملف إلى 644 ودليل إلى 755
  2. متوسط (صعوبة ⭐⭐): استخدم الصياغة الرمزية لإزالة كل صلاحيات المجموعة والآخرين من ملف، ثم أنشئ مستخدم اختبار (sudo useradd testuser) واستخدم chown لنقل ملكية الملف إليه
  3. متقدم (صعوبة ⭐⭐⭐): أنشئ دليلًا مشتركًا، اضبط SGID (chmod g+s) لترث الملفات الجديدة المجموعة، واستخدم find + chmod لتعيين ملفات مشروع وب مجمّعًا إلى 644 ودلائله إلى 755
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%