الأمن السيبراني

صلاحيات Linux: chmod وchown وsudo وACL — درس خطوة بخطوة

4 min de lecture

🔝 الدليل الرئيسي: أساسيات Linux 2026

نموذج صلاحيات Unix من أجمل الأفكار التقنية في السبعينيات: 9 bits تكفي لوصف من يستطيع فعل ماذا على أي ملف. بعد 50 سنة، هذا النموذج لا يزال قاعدة Linux وmacOS وFreeBSD، ويخدم يوميًا لعزل المستخدمين وتقوية الخدمات ومنع script رديء من حذف تهيئة démon. يأخذك هذا الدرس من القراءة الحدسية للصلاحيات إلى التلاعب المُتقن، مغطيًا chmod، chown، sudo، setuid، sticky bit، وACL POSIX.

المتطلبات

  • آلة Linux بحساب غير root ووصول sudo
  • معرفة أساسية بسطر الأوامر (راجع سطر الأوامر Linux)
  • المستوى: مبتدئ إلى متوسط
  • الوقت المُقدَّر: 90 دقيقة

الخطوة 1 — قراءة الصلاحيات على مخرج ls

cd /tmp
touch fichier.txt
mkdir dossier
ln -s fichier.txt lien.txt
ls -l

المخرج:

-rw-r--r-- 1 malick malick    0 May 5 09:15 fichier.txt
drwxr-xr-x 2 malick malick 4096 May 5 09:15 dossier
lrwxrwxrwx 1 malick malick   11 May 5 09:15 lien.txt -> fichier.txt

الحرف الأول يُعطي النوع: - ملف عادي، d مجلد، l رابط رمزي، c جهاز حرفي، b جهاز كتلي، s socket، p أنبوب مُسمى. الـ 9 أحرف التالية تُقرأ بمجموعات ثلاث: مالك، مجموعة، آخرون. كل ثلاثي يُشفّر r (قراءة)، w (كتابة)، x (تنفيذ لملف؛ traversée لمجلد). على مجلد، bit x لا يعني تنفيذ — يعني « حق الدخول ». مجلد بدون x غير قابل للوصول حتى لو وُضع r.

الخطوة 2 — فهم notation octale

Linux يُقدّم صياغتين: symbolique (u+w) وoctale (644). الفكرة بسيطة: كل ثلاثي bits يُفسَّر كرقم binaire، إذن قيمة بين 0 و7. r = 4، w = 2، x = 1، نجمع. rwx يُعطي 4+2+1=7، rw- = 6، r-x = 5، r-- = 4.

stat -c "%a %n" /etc/ssh/sshd_config    # affiche : 644 /etc/ssh/sshd_config
stat -c "%a %n" ~/.ssh/id_ed25519        # doit afficher : 600 (sinon SSH refuse)
stat -c "%a %n" /usr/bin/ls              # affiche : 755

للحفظ كـ mantra: 644 لملفات البيانات، 755 للـ exécutables والمجلدات، 600 للأسرار، 700 للمجلدات الخاصة. 90% من حالات الإنتاج تتسع في هذه القيم الأربع.

الخطوة 3 — تعديل الصلاحيات بـ chmod

# Notation symbolique
chmod u+x script.sh             # ajoute le droit d'exécution au propriétaire
chmod g+w fichier.conf          # ajoute le droit d'écriture au groupe
chmod o-r secret.txt            # retire le droit de lecture aux autres
chmod a+r README.md             # ajoute le droit de lecture à tous (a = all)
chmod ug=rw,o= journal.log      # définit propriétaire/groupe rw, autres rien

# Notation octale
chmod 644 /etc/mon-app/config.yml
chmod 755 /opt/mon-app/run.sh
chmod 600 ~/.ssh/id_ed25519
chmod 700 ~/.ssh

# Récursif sur un répertoire
chmod -R 755 /var/www/site/

الوضع التكراري -R قوي وخطير: يضع نفس الصلاحية على ملفات ومجلدات، مما يطرح مشكلة لأن المجلدات تحتاج bit x الذي لا يجب أن تملكه ملفات البيانات. لمعالجة الملفات والمجلدات بشكل مختلف، استخدم find:

find /var/www/site -type d -exec chmod 755 {} \;    # répertoires
find /var/www/site -type f -exec chmod 644 {} \;    # fichiers

هذا التركيب يجوب الشجرة، يُطبّق 755 على المجلدات (rwxr-xr-x) و644 على الملفات. هو التركيبة القياسية لموقع ويب ثابت يخدمه Nginx.

الخطوة 4 — تغيير المالك بـ chown وchgrp

sudo chown www-data /var/www/site/index.html             # change le propriétaire
sudo chown www-data:www-data /var/www/site/index.html    # change propriétaire ET groupe
sudo chown :developers /opt/projets/                     # change uniquement le groupe
sudo chown -R deploy:deploy /opt/mon-app/                # récursif

بعد نشر، الخطأ الأكثر شيوعًا ترك ملفات تعود لـ root بينما يجب أن تعود لحساب خدمة (www-data لـ Nginx، nginx لنسخة RHEL، deploy لمستخدم تطبيقي). الخدمة تحاول كتابة cache، لا تستطيع، تفشل صامتةً أو صاخبةً. الانعكاس الصحيح: بعد scp أو rsync أو git clone في root، نفّذ فورًا chown -R للمستخدم الصحيح.

الخطوة 5 — رفع الصلاحيات بـ sudo (بنظافة)

القاعدة الذهبية على خادم Linux: لا تعمل في root افتراضيًا. تتصل بحساب شخصي، تُدير بحساب شخصي، تصعد ظرفيًا لـ root.

sudo apt update                 # exécute apt update en root
sudo -u postgres psql           # exécute psql sous l'utilisateur postgres
sudo -i                         # ouvre un shell root interactif
sudo visudo                     # édite /etc/sudoers en mode protégé
sudo -l                         # liste ce que je suis autorisé à faire

ثلاث ممارسات تُقوّي الأمن سريعًا. أولًا، أضف حسابك لمجموعة sudo (Debian/Ubuntu) أو wheel (Alma/Rocky) بدلًا من كتابة قواعد فردية في sudoers. ثانيًا، استخدم sudo visudo لتحرير التهيئة. ثالثًا، اضبط Defaults timestamp_timeout=15. لـ automatisations، أنشئ حساب خدمة مخصص بقاعدة sudoers مُستهدفة مثل deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart mon-app.

الخطوة 6 — فهم setuid وsetgid والـ sticky bit

ما وراء 9 bits الكلاسيكية، ثلاثة bits خاصة تُعدّل سلوك ملف. setuid على binary يجعله يُنفَّذ بصلاحيات المالك، لا المُستدعي. setgid يفعل المثل للمجموعة؛ على مجلد، له أثر آخر: كل ملف يُنشأ بداخله يرث مجموعة المجلد. sticky bit على مجلد يمنع مستخدمًا من حذف ملفات آخر، حتى لو كان له حق الكتابة في المجلد — حماية مُطبَّقة على /tmp.

ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root 68208 ... /usr/bin/passwd
#    ^^ le 's' signale setuid : passwd s'exécute toujours en root

ls -ld /tmp
# drwxrwxrwt 12 root root 4096 ... /tmp
#          ^^ le 't' final signale le sticky bit

chmod u+s binaire               # active setuid
chmod g+s repertoire            # active setgid sur un répertoire
chmod +t /shared/repo           # active le sticky bit
chmod 4755 binaire              # notation octale, le 4 préfixe = setuid
chmod 2755 repertoire           # le 2 préfixe = setgid
chmod 1777 /shared/tmp          # le 1 préfixe = sticky

setuid قوي جدًا وبالتالي خطر جدًا. binary setuid root مكتوب سيئًا يُنفّذ أمرًا خارجيًا دون تعطيل \$PATH، أو يُحمّل مكتبة من مسار مُتحكَّم فيه من المُستدعي، يصبح مَتجَهًا لرفع الصلاحيات. القاعدة الحذرة في 2026: لا تضع setuid root أبدًا على script أو binary لم تكتبه وتدقّقه. لـ audit binaries setuid: find / -perm -u=s -type f 2>/dev/null.

الخطوة 7 — توسيع النموذج بـ ACL POSIX

getfacl /opt/donnees/rapport.csv                           # affiche les ACL effectives
sudo setfacl -m u:alice:rw /opt/donnees/rapport.csv        # accorde à alice rw
sudo setfacl -m g:auditeurs:r /opt/donnees/rapport.csv     # accorde au groupe auditeurs r
sudo setfacl -x u:alice /opt/donnees/rapport.csv           # retire l'ACL d'alice
sudo setfacl -b /opt/donnees/rapport.csv                   # retire toutes les ACL

عندما يحمل ملف ACLs، ls -l يعرض علامة + في نهاية سلسلة الصلاحيات: -rw-r--r--+. هذا الدليل الوحيد المرئي. على خادم إنتاج يخلط عدة فرق، انعكاس audit ACLs مهم كانعكاس audit bits. للمجلدات، setfacl -d -m يُعرّف ACLs افتراضية موروثة من قبل أي ملف جديد يُنشأ بداخله.

الخطوة 8 — التحقق والعادات الجيدة

sudo useradd -r -s /usr/sbin/nologin -d /opt/mon-app -m mon-app
sudo mkdir -p /opt/mon-app/{bin,data,logs,config}
sudo chown -R mon-app:mon-app /opt/mon-app
sudo chmod 750 /opt/mon-app
sudo chmod 700 /opt/mon-app/data
sudo chmod 750 /opt/mon-app/bin
sudo chmod 644 /opt/mon-app/config/*.yml 2>/dev/null || true
sudo chmod 600 /opt/mon-app/config/secrets.env 2>/dev/null || true
sudo find /opt/mon-app -type f -name "*.sh" -exec chmod 750 {} \;
ls -laR /opt/mon-app | head -30

المخرج المتوقّع يُظهر المستخدم mon-app في كل مكان، مجلد data بـ 700 (خاص)، configs بـ 644 قابلة للقراءة، الأسرار مُقفَلة بـ 600. هذا الانضباط — مستخدم مخصص، مجلدات مُقسَّمة، أسرار معزولة — يُميّز تثبيتًا هاويًا عن تثبيت جدير بـ audit.

أخطاء شائعة

الخطأ السبب الحل
Permission denied عند فتح ملف bits صارمة أو مالك خاطئ ls -l، stat، عدّل بـ chmod أو chown
SSH يرفض المفتاح: Bad permissions ~/.ssh/ أو id_ed25519 مفتوحة جدًا chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519
خدمة systemd لا تستطيع كتابة logs مجلد يعود لـ root بينما User= مختلف chown -R user:group /var/log/mon-app/
chmod -R 777 كسر كل شيء « حل سحري » يضع المجلدات في world-writable أعد بـ find -type d 755 وfind -type f 644
مستخدم مُضاف لمجموعة بلا أثر المجموعة لا تُحمَّل إلا في الجلسة التالية قطع/إعادة اتصال أو newgrp groupe
sudo: command not found حساب خارج مجموعة sudo/wheel في root: usermod -aG sudo user

الأسئلة الشائعة

لماذا لا نستخدم chmod 777؟
لأن 777 يفتح الكتابة لكل العالم. هو معادل ترك الباب مفتوحًا. النهج الصحيح: افهم أي مستخدم يحاول الوصول، عدّل المالك أو المجموعة. strace -f -e openat commande 2>&1 | grep EACCES يتتبّع استدعاءات النظام التي تفشل.

ما الفرق بين المجموعة الأولية والثانوية؟
كل مستخدم له مجموعة أولية واحدة (في /etc/passwd) تصبح المالك للمجموعة افتراضيًا. يمكنه الانتماء لعدة مجموعات ثانوية (في /etc/group). id يسرد المجموعات الفعّالة، groups utilisateur يسرد كل مجموعات مستخدم.

لماذا sudo يطلب كلمة مروري لا root؟
هو تصميم sudo: تُثبت أنك أنت، والنظام يستشير /etc/sudoers ليُقرّر إذا كان لك حق تنفيذ الأمر كـ root. هذه الآلية تتجنّب مشاركة كلمة مرور root وتُتتبّع في logs من فعل ماذا.

كيف نجد الملفات world-writable؟
sudo find / -xdev -type f -perm -o+w 2>/dev/null يسرد كل الملفات. على خادم سليم، هذه القائمة قصيرة جدًا.

هل صلاحيات ext4/XFS تُطبَّق في حاويات Docker؟
نعم، نظام ملفات الحاوية عمومًا overlay ext4. الـ bits تُطبَّق كنظام كلاسيكي. للحاويات الآمنة، خيار --user لـ Docker وdirective USER في Dockerfile تفرضان تنفيذًا غير root.

كيف نُؤتمت audit دوريًا للصلاحيات الحرجة؟
script يُطلقه timer systemd أسبوعيًا يكفي: يتحقق من صلاحيات مسارات حساسة (/etc/sudoers يجب أن يكون 440، /etc/shadow 640، /root 700)، يُقارن بحالة متوقّعة، يُرسل إيميل عند انحراف. لتعميق، auditd يتتبّع التعديلات في الزمن الحقيقي.

مقالات ذات صلة

Sponsoriser ce contenu

Cet emplacement est à vous

Position premium en fin d'article — c'est l'instant où les lecteurs sont le plus engagés. Réservez cet espace pour votre marque, votre formation ou votre offre.

Recevoir nos tarifs
Publicité