شرح صلاحيات ملفات لينكس: chmod 755 و644 و777
تحدّد صلاحيات ملفات لينكس مَن يستطيع قراءة كل ملف ومجلد على النظام أو الكتابة فيه أو تشغيله. لكل عنصر ثلاث فئات من المستخدمين (المالك، ومجموعة واحدة، وبقية الجميع)، وتحصل كل فئة على ثلاث بتّات من الصلاحيات: القراءة (r) والكتابة (w) والتنفيذ (x). أي تسع بتّات لكل ملف. الأمر chmod هو ما يضبطها، والاختصار الذي تراه في كل مكان هو النظام الثماني: تنطوي rwx لكل فئة في رقم واحد من 0 إلى 7 (قراءة 4 + كتابة 2 + تنفيذ 1).
ثلاثة أنماط تغطّي كل ما ستكتبه تقريباً:
- 755 (
rwxr-xr-x) — المجلدات والسكربتات: يستطيع المالك تعديلها، ويستطيع الجميع قراءتها وتشغيلها. - 644 (
rw-r--r--) — الملفات العادية: المالك يكتب، والجميع يقرأ. - 777 (
rwxrwxrwx) — وصول كامل للجميع. خاطئ في كل الحالات تقريباً؛ إنه ثغرة أمنية لا حلّ.
بدّل أي تركيبة في حاسبة chmod المجانية وشاهد القيمة الثمانية وسلسلة rwx والأمر الدقيق تتحدّث معاً. تشرح بقية هذا الدليل كيف تعمل تلك الأرقام وأين ينتمي كل رقم.
صلاحيات ملفات لينكس في 30 ثانية
| القيمة الثمانية | الرمزي | الاستخدام المعتاد |
|---|---|---|
| 400 | r-------- | مفتاح SSH خاص، للقراءة فقط |
| 600 | rw------- | ملفات خاصة، مفاتيح SSH، .env |
| 644 | rw-r--r-- | صفحات الويب، الإعداد، معظم الملفات |
| 700 | rwx------ | المجلدات الخاصة (~/.ssh) |
| 755 | rwxr-xr-x | السكربتات، الملفات التنفيذية، مجلدات الويب |
| 775 | rwxrwxr-x | المجلدات المشتركة ضمن مجموعة |
| 777 | rwxrwxrwx | الجميع، كل شيء — تجنّبه |
| 1777 | rwxrwxrwt | مجلدات مؤقتة مشتركة مثل /tmp |
قاعدة عامة: 644 للملفات، و755 للمجلدات، ثم شدّد انطلاقاً من ذلك. لا تُرخِ نمطاً إلا حين يتعطّل شيء ملموس، ولا تفعل ذلك استباقاً أبداً.
نموذج الصلاحيات: المالك والمجموعة والآخرون
ثلاث فئات تتشارك ملفاً واحداً. المالك (عادةً من أنشأه)، ومجموعة واحدة، والآخرون، أي كل حساب ليس المالك ولا عضواً في المجموعة. تحصل كل فئة على القراءة والكتابة والتنفيذ باستقلال:
- القراءة (r) — عرض محتويات ملف، أو سرد مدخلات مجلد.
- الكتابة (w) — تغيير ملف، أو إضافة مدخلات إلى مجلد وحذفها منه.
- التنفيذ (x) — تشغيل ملف كبرنامج، أو الدخول إلى مجلد (عبر
cd).
المفاجأة التي توقع الناس: على المجلد تعني البتّات شيئاً مختلفاً. تتيح لك r سرد الأسماء، وتتيح لك w إنشاء المدخلات بداخله وحذفها، وتتيح لك x الاجتياز للوصول إلى الملفات تحته كي تتمكن من cd إليه. يمكن أن تملك r دون x على مجلد، وتشغّل ls عليه، ومع ذلك تحصل على «Permission denied» لحظة محاولتك الدخول. لهذا بالضبط تكون المجلدات 755 لا 644.
قراءة سطر ls -l
شغّل ls -l فيبدأ كل مدخل بكتلة من عشرة أحرف:
$ ls -l
-rw-r--r-- 1 jack staff 1400 Jul 17 10:00 index.html
drwxr-xr-x 5 jack staff 160 Jul 17 10:00 assets
اقرأه من اليسار إلى اليمين. الحرف الأول هو نوع الملف، لا صلاحية: - ملف عادي، وd مجلد، وl رابط رمزي، وc أو b جهاز، وp أنبوب مُسمّى، وs مقبس. الأحرف التسعة التالية هي ثلاث مجموعات من rwx: المالك، والمجموعة، والآخرون. إذن -rw-r--r-- ملف عادي يقرأ فيه المالك ويكتب (rw-) بينما تقرأ المجموعة والآخرون فقط (r-- وr--)، وهو ما يساوي 644. وdrwxr-xr-x مجلد بالنمط 755.
تُلحق بعض الأنظمة علامةً بعد البتّات التسع. النقطة . في النهاية تشير إلى سياق SELinux، وعلامة + تعني أن هناك ACL (قائمة تحكّم بالوصول) يضيف قواعد تتجاوز البتّات الأساسية، وعلى macOS ترمز @ إلى السمات الممتدة. لا شيء منها يغيّر القيمة الثمانية. تجاهل العلامة واقرأ الأحرف التسعة.
الترميز الثماني: كيف يصبح 755 هو rwxr-xr-x
يعمل الترميز الثماني للصلاحيات لأن كل صلاحية هي قوة من قوى العدد اثنين:
- القراءة = 4
- الكتابة = 2
- التنفيذ = 1
اجمع البتّات التي تملكها الفئة فتحصل على رقمها. rwx هي 4 + 2 + 1 = 7. وr-x هي 4 + 1 = 5. وr-- هي 4. إذن rwxr-xr-x تُقرأ، بالثلاثات، 7 5 5. افعل الشيء نفسه مع rw-r--r-- فتحصل على 4 + 2 و4 و4 ← 644. تلك هي الحيلة كلها؛ لا شيء في الصلاحيات الثمانية أكثر من ثلاثة مجاميع مستقلة.
أرقام الصلاحيات من 0 إلى 7 بلمحة
| الرقم | الثنائي | الصلاحيات |
|---|---|---|
| 0 | 000 | لا صلاحيات |
| 1 | 001 | التنفيذ فقط |
| 2 | 010 | الكتابة فقط |
| 3 | 011 | كتابة + تنفيذ |
| 4 | 100 | قراءة فقط |
| 5 | 101 | قراءة + تنفيذ |
| 6 | 110 | قراءة + كتابة |
| 7 | 111 | قراءة + كتابة + تنفيذ |
النظام الثماني هو ببساطة الأساس 8، لذا يحزم كل رقم ثلاث بتّات دون أي تداخل مع الفئة التالية. إن بدا الحساب الموضعي صدئاً، يوضّح محوّل الأنظمة العددية كيف يُسقَط الأساس 8 على الثنائي بالطريقة نفسها التي يفعلها كل رقم صلاحية.
chmod 755 مقابل 644 مقابل 777: الأنماط التي ستكتبها فعلاً
إليك المقارنة التي تجيب مباشرةً عن chmod 755 مقابل 644 مقابل 777:
| القيمة الثمانية | الرمزي | المالك | المجموعة | الآخرون | الاستخدام المعتاد | الخطر |
|---|---|---|---|---|---|---|
| 644 | rw-r--r-- | قراءة/كتابة | قراءة | قراءة | الملفات العادية | افتراضي آمن |
| 755 | rwxr-xr-x | الكل | قراءة/تنفيذ | قراءة/تنفيذ | مجلدات، سكربتات | افتراضي آمن |
| 600 | rw------- | قراءة/كتابة | — | — | ملفات خاصة، مفاتيح | آمن جداً |
| 700 | rwx------ | الكل | — | — | مجلدات خاصة | آمن جداً |
| 775 | rwxrwxr-x | الكل | الكل | قراءة/تنفيذ | مجلدات مشتركة ضمن مجموعة | المجموعة تستطيع الكتابة |
| 777 | rwxrwxrwx | الكل | الكل | الكل | (تجنّبه) | قابل للكتابة من الجميع |
الفرق بين 755 و644 بتّة واحدة: التنفيذ. تحتاج المجلدات والسكربتات والملفات التنفيذية إلى x كي يُدخل إليها أو تُشغَّل، فتستقر عند 755. أما الملف العادي مثل صفحة HTML أو صورة أو ملف إعداد فلا سبب لأن يكون قابلاً للتنفيذ، فيبقى عند 644. والخلط بينهما هو سبب معظم أخطاء الصلاحيات اليومية.
لماذا 777 خطير. إنه يسلّم صلاحية الكتابة لكل حساب على الجهاز، بما في ذلك حساب خدمة مخترَق أو عملية ويب مختطَفة. وجذر مستندات قابل للكتابة من الجميع هو الطريق النموذجي إلى موقع مشوَّه أو برمجية خبيثة محقونة، لأن أي شخص يصل إليه يستطيع الكتابة فوق شيفرتك. وحين تخبرك مشاركة في منتدى بأن تنفّذ chmod 777 على شيء «كي يعمل»، تكون المشكلة الحقيقية دائماً تقريباً في الملكية، وهي مغطّاة أدناه.
استثناء 1777. المجلد /tmp قابل للكتابة من الجميع عن قصد، لكن مع ضمانة. يضيف النمط 1777 البتّة اللاصقة (sticky bit)، التي تتيح للجميع إنشاء الملفات بينما تمنع المستخدمين من حذف أو إعادة تسمية ملفات لا يملكونها. لهذا تكون المجلدات المؤقتة المشتركة آمنة عند 1777 لكن ليس أبداً عند 777 المجرّد. اكتب 777 في حاسبة chmod فتؤشّر عليه لوحة الخطر فوراً، بينما يُعرَف 1777 بوصفه النمط القياسي للمجلدات المشتركة.
النمط الرقمي مقابل الرمزي
يقبل chmod البتّات نفسها بطريقتين.
يذكر النمط الرقمي (المطلق) النتيجة الكاملة. فـ chmod 755 file يضبط البتّات التسع كلها إلى rwxr-xr-x بصرف النظر عمّا كان موجوداً قبله. هذا ما تريده في السكربتات والنشر، حيث تفرض حالة معروفة الصحّة.
يصف النمط الرمزي (النسبي) تغييراً. فـ chmod u+x file يقلب بتّة واحدة (إضافة التنفيذ للمالك) ويترك كل شيء آخر كما هو. وchmod u=rwx,go=rx file يضبط فئات كاملة صراحةً. يناسب النمط الرمزي التعديلات العابرة حيث يكون إعادة ذكر النمط بأكمله مبالغة.
# Numeric: overwrite the whole mode
$ chmod 644 report.txt
# Symbolic: change only what you name
$ chmod u+x deploy.sh # add execute for the owner
$ chmod go-w shared.conf # remove write from group and others
$ chmod u=rw,go=r notes.md # set each class explicitly → 644
مزلق واحد مع النمط الرمزي: chmod +x دون تحديد فئة تُرشّحه قيمة umask لديك. مع umask الشائعة 022، يضيف chmod +x script.sh التنفيذ للجميع، فيطابق chmod a+x. وتحت umask أكثر تشدداً مثل 077 لا يؤثّر إلا على المالك. حين تريد نتيجة مضمونة، سمِّ الفئة: u+x للمالك وحده، وa+x للجميع.
الصلاحيات الخاصة: setuid وsetgid والبتّة اللاصقة
وراء البتّات التسع القياسية، يحمل رقم ثماني رابع في المقدمة ثلاثة أنماط خاصة، ثلاثي setuid وsetgid والبتّة اللاصقة:
- setuid = 4000 — يعمل البرنامج بامتيازات مالك الملف لا بامتيازات المستدعي. هكذا يتيح
passwd، المملوك لـ root، لمستخدم عادي أن يحدّث قاعدة كلمات مرور مملوكة لـ root. - setgid = 2000 — الفكرة نفسها للمجموعة. وعلى المجلد يجعل أيضاً الملفات الجديدة ترث مجموعة المجلد، ما يُبقي مشروعاً مشتركاً مملوكاً لمجموعة واحدة باتساق.
- البتّة اللاصقة = 1000 — على مجلد مشترك، تقيّد الحذف بحيث لا يستطيع المستخدمون إزالة إلا ملفاتهم. والمجلد
/tmpعند 1777 هو المثال النموذجي.
$ chmod 4755 /usr/local/bin/mytool # setuid
$ chmod 2775 /srv/shared # setgid on a shared dir
$ chmod 1777 /tmp # sticky bit
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Jul 17 10:00 /usr/bin/passwd
قاعدة حالة الأحرف s/S و t/T
في ls -l، تعيد البتّات الخاصة استخدام خانة التنفيذ، وتخبرك حالة الحرف بما إن كان التنفيذ مضبوطاً أيضاً. الحرف الصغير s (setuid/setgid) أو t (اللاصقة) يعني أن البتّة الخاصة والتنفيذ كليهما مفعّلان، وهي الحالة الطبيعية. أما الحرف الكبير S أو T فيعني أن البتّة الخاصة مضبوطة لكن التنفيذ ليس كذلك، وهو خطأ عادةً، لأن بتّة خاصة على ملف غير قابل للتنفيذ لا تفعل شيئاً مفيداً.
قارن rwsr-xr-x (4755، setuid مع التنفيذ، صحيح) بـ rwSr--r-- (4644، setuid دون تنفيذ، مريب). وكلما رأيت S أو T كبيراً، تحقّق مما إن كان أحدهم قد أسقط بتّة التنفيذ سهواً.
مزلق مجلدات GNU الذي لا يذكره أحد
إليك فارق المنصّة الذي يخطئ فيه كل درس تعليمي تقريباً. على لينكس (GNU coreutils)، فإن chmod 755 dir الرقمي لا يمسح بتّة setuid أو setgid موجودة على ذلك المجلد. بل يحافظ عليها. فإن كان مجلد ما مضبوطاً أصلاً على 2755 (setgid) ونفّذت chmod 755 متوقعاً لوحاً نظيفاً، تبقى بتّة setgid، ويظل المجلد في الحقيقة 2755.
لمسحها فعلاً، كن صريحاً:
$ chmod 00755 dir # five-digit form zeroes the special digit
$ chmod =755 dir # = clears every bit not listed
$ chmod u-s,g-s dir # remove setuid and setgid by name
BSD وmacOS يفعلان العكس: فـ chmod 755 الرقمي يمسح البتّات الخاصة افتراضياً. لذا فإن سكربت نشر «يعيد ضبط» الصلاحيات بـ chmod -R 755 يتصرّف على حاسوب Mac المحمول تصرفاً مختلفاً عنه على خادم Linux. وهذا الاحتفاظ موثّق في دليل GNU coreutils؛ وعند الشك، استخدم الصيغة الخماسية أو u-s,g-s كي تكون النتيجة متطابقة في كل مكان.
umask: ما تحصل عليه الملفات المُنشأة حديثاً
نادراً ما تنفّذ chmod على كل ملف يدوياً؛ إذ يحصل معظمها على نمطه عند الإنشاء، و**umask** هي ما يقرره. قيمة umask هي مجموعة بتّات تُطفَأ. تبدأ الملفات الجديدة من الأساس 666 والمجلدات الجديدة من 777، وتحجب umask بتّاتٍ منها:
effective mode = base & ~umask
تبدأ الملفات عند 666، لا 777، لأن ملفاً جديداً تماماً لا شأن له بأن يكون قابلاً للتنفيذ افتراضياً. تُضاف تلك البتّة عمداً بـ chmod +x.
| umask | الملفات الجديدة | المجلدات الجديدة | المعنى |
|---|---|---|---|
| 022 | 644 | 755 | افتراضي — الآخرون يقرؤون لا يكتبون |
| 077 | 600 | 700 | خاص بالمالك |
| 002 | 664 | 775 | تعاون ضمن مجموعة |
احسب 022 الافتراضية يدوياً: 666 & ~022 = 666 & 755 = 644، و777 & ~022 = 755. تحقّق من قيمتك الحالية بـ umask، واضبط افتراضياً للجلسة، مثلاً umask 077، على جهاز لا ينبغي أن يكون فيه أي شيء مقروءاً للمجموعة أو للعالم.
chmod مقابل chown: الصلاحيات مقابل الملكية
يجيب chmod وchown عن سؤالين مختلفين. chmod يغيّر ما يجوز للمالك والمجموعة والآخرين فعله: بتّات الصلاحيات. chown يغيّر مَن هو المالك والمجموعة فعلاً. واللجوء إلى 777 كثيراً ما يكون مشكلة ملكية ترتدي زيّ الصلاحيات.
الحالة الكلاسيكية: خادم ويب يعمل بهوية www-data لا يستطيع الكتابة في مجلد الرفع الخاص به. يجعل chmod 777 الخطأ يختفي بأن يسمح للعالم كله بالكتابة، ويترك ثغرة وراءه. الإصلاح الصحيح يُسنِد الملكية إلى العملية التي تحتاجها:
# Wrong: opens the directory to every account on the box
$ sudo chmod -R 777 /var/www/uploads
# Right: give it to the web user, keep a tight mode
$ sudo chown -R www-data:www-data /var/www/uploads
$ sudo find /var/www/uploads -type d -exec chmod 755 {} +
$ sudo find /var/www/uploads -type f -exec chmod 644 {} +
ترتيب التشخيص حين يتعذّر قراءة شيء على غير المتوقع: شغّل ls -l لترى من يملكه أولاً، وفكّ النمط ثانياً، ثم قرّر ما إن كان الإصلاح chown أو chmod أو إضافة مستخدم إلى مجموعة.
الصلاحيات التعاودية بالشكل الصحيح
إن chmod -R 755 . الشامل يجعل كل ملف عادي قابلاً للتنفيذ، وهو ضجيج في أحسن الأحوال وخطر صامت في أسوئها. تعاود بحسب النوع بدلاً من ذلك:
$ find . -type d -exec chmod 755 {} + # directories → 755
$ find . -type f -exec chmod 644 {} + # files → 644
يوفّر chmod في GNU اختصاراً من سطر واحد بـ الحرف الكبير X، الذي يضيف التنفيذ فقط إلى المجلدات وإلى الملفات التي تحمل أصلاً بتّة تنفيذ:
$ chmod -R u+rwX,go+rX .
تولّد حاسبة chmod أوامر find الخاصة بالمجلدات فقط وبالملفات فقط لأي نمط تختاره، فتنسخ التقسيم الصحيح بدلاً من اللجوء إلى -R مجرّد.
أفضل الممارسات في صلاحيات ملفات لينكس
- امنح أقل امتياز يفي بالغرض. ابدأ من أضيق نمط وافتح فقط ما يتعطّل. كل بتّة كتابة إضافية هي سطح هجوم.
- اجعل الافتراضي ملفات 644 داخل مجلدات 755. يخدم هذا الاقتران كل جذر ويب ونسخة مستودع تقريباً. نادراً ما تحتاج الملفات العادية إلى التنفيذ؛ أما المجلدات فدائماً.
- لا تترك أبداً 777 على أي شيء يمكن لخادم الوصول إليه. إن وجب أن تكتب عدة حسابات، فاستخدم مجموعة مشتركة بـ 775 أو 2775 (تُبقي setgid ملكية المجموعة متسقة) بدلاً من فتح النمط للعالم.
- أبقِ مفاتيح SSH الخاصة عند 600، أو 400 بمجرد أن تصير نهائية. يرفض OpenSSH رفضاً قاطعاً المفاتيح الخاصة المقروءة للمجموعة أو للعالم. راجع دليل OpenSSH لمعرفة الاشتراط الدقيق لملف المفتاح. أما المفاتيح العامة و
authorized_keysفلا بأس بها عند 644. - اجمع أنماط الملفات مع ضوابط أخرى في طبقات. الصلاحيات هي الأساس؛ اقرنها بمصادقة أساسية من مولّد htpasswd حين يحتاج مجلد إلى تسجيل دخول، وعامل أنماط الملفات بوصفها قطعة واحدة من الصورة التي يغطّيها دليل أساسيات أمان الويب.
الأسئلة الشائعة
ماذا يعني d أو l في بداية drwxr-xr-x؟
الحرف الأول في سطر ls -l هو نوع الملف، لا صلاحية. d يرمز إلى مجلد، وl إلى رابط رمزي، و- إلى ملف عادي، وc أو b إلى جهاز، وp إلى أنبوب مُسمّى، وs إلى مقبس. الأحرف التسعة بعده وحدها تُرمّز بتّات القراءة والكتابة والتنفيذ الفعلية.
ما الفرق بين s الصغير وS الكبير في الصلاحيات؟
كلٌّ من s الصغير وS الكبير يعني أن بتّة setuid أو setgid مضبوطة. s الصغير يعني أن التنفيذ مضبوط أيضاً، وهي الحالة العاملة الطبيعية. أما S الكبير فيعني أن البتّة الخاصة مفعّلة لكن التنفيذ مُطفأ (كما في 4644)، وهو خطأ تهيئة في كل الحالات تقريباً، إذ إن بتّة خاصة بلا تنفيذ عديمة المعنى.
ما هي umask وكيف تقرّر الصلاحيات الافتراضية؟
umask هي مجموعة بتّات الصلاحيات التي تُطفأ عند إنشاء ملف. تبدأ الملفات الجديدة من الأساس 666 والمجلدات من 777، ثم يزيل effective = base & ~umask البتّات المحجوبة. تنتج 022 الافتراضية ملفات 644 ومجلدات 755؛ شغّل umask لرؤية قيمتك، أو umask 077 لافتراضي أكثر خصوصية.
متى ينبغي أن أستخدم 400 أو 700 بدلاً من 644 أو 755؟
استخدم 400 أو 700 حين يجب أن يبقى ملف أو مجلد خاصاً تماماً. فـ 400 (r--------) ملف خاص للقراءة فقط، مثالي لمفتاح SSH خاص نهائي لا تعدّله أبداً. و700 (rwx------) مجلد لا يستطيع الدخول إليه إلا المالك، مثل ~/.ssh أو ~/.gnupg. وخلافاً لـ 644 و755، لا يمنحان شيئاً لأي أحد آخر.
لماذا أستطيع سرد مجلد لكن لا أستطيع cd إليه؟
تفصل صلاحيات المجلد السردَ عن الاجتياز: تتيح لك بتّة r سرد الأسماء، وتتيح لك بتّة x الدخول. المجلد الذي يملك r دون x (مجلد 644) يُظهر أسماءه تحت ls لكنه يمنع cd وأي وصول إلى الملفات بداخله. أضف التنفيذ (اجعله 755) لتجعله قابلاً للدخول.
هل تعمل صلاحيات الملفات على macOS كما على Linux؟
تتشارك صلاحيات الملفات نموذج rwx والنموذج الثماني الأساسي نفسه على الاثنين، لأن كليهما يتبع POSIX، لكن التفاصيل تختلف. يمسح BSD وmacOS بتّة setuid/setgid لمجلد عند chmod رقمي افتراضياً، بينما يحافظ عليها Linux. كما تختلف قراءة النمط أيضاً: stat -c '%a' file على Linux، وstat -f '%Lp' file على macOS، ويضيف macOS قوائم ACL وأعلام الملفات.
هل أستطيع تغيير صلاحيات الملفات دون سطر الأوامر؟
يمكنك حساب الصلاحيات وفكّها دون طرفية. تتيح لك حاسبة chmod المجانية أن تؤشّر مصفوفة صلاحيات، أو تكتب قيمة ثمانية، أو تلصق سطر ls -l، ثم تنسخ لك الأمر chmod الدقيق. أما تطبيقه على ملف حقيقي فما زال يحتاج ذلك الأمر على الخادم، أو عميل GUI أو FTP يُظهر حقول الصلاحيات.