AzLearn

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

Permissions and Ownership

مفهوم ~22 دقيقة

الصلاحيات والملكية — Permissions and Ownership

نظام الملفات في Unix يحمي نفسه بثلاث طبقات: المالك (owner)، المجموعة (group)، الباقي (other). لكل طبقة ثلاث صلاحيات: قراءة r، كتابة w، تنفيذ x. كثير من حوادث الإنتاج — تسريب .env، سكربت لا يعمل، ملف حساس يقرأه أي مستخدم — أصلها سطر chmod خاطئ أو umask غير منتبه له.

قراءة ls -l

-rw-r--r--  1 aziz staff   245 Apr 30 12:10 .env
-rwxr-xr-x  1 aziz staff  1842 Apr 30 12:11 deploy.sh
drwxr-xr-x  3 aziz staff    96 Apr 30 12:09 logs

العمود الأول من 10 خانات:

  • الخانة 1: نوع المدخل (- ملف، d مجلد، l رابط).
  • الخانات 2-4: صلاحيات المالك (rw-).
  • الخانات 5-7: صلاحيات المجموعة (r--).
  • الخانات 8-10: صلاحيات الباقي (r--).

ملف .env أعلاه قابل للقراءة من أي مستخدم على الخادم. هذا خطأ.

chmod بالطريقة الرمزية

الكتابةالمعنى
chmod u+x script.shأضف تنفيذ للمالك
chmod go-w fileأزل الكتابة من المجموعة والباقي
chmod a+r doc.txtأعطِ الجميع قراءة
chmod u=rw,go= fileالمالك يقرأ ويكتب، الباقي لا شيء

u=user، g=group، o=other، a=all. + يضيف، - يزيل، = يضبط بدقة.

chmod بالطريقة العددية

كل صلاحية بت: r=4، w=2، x=1. اجمعها لكل طبقة:

الكودالمعنىالاستخدام
600المالك يقرأ ويكتب فقطأسرار: .env، مفاتيح SSH
644المالك يكتب، الكل يقرأملفات وثائق عامة
755المالك يكتب، الكل يقرأ وينفذسكربتات قابلة للتنفيذ ومجلدات عامة
700المالك فقط — قراءة وكتابة وتنفيذمجلدات شخصية حساسة
750المالك كامل، المجموعة قراءة وتنفيذسكربتات فريق
chmod 600 .env          # سر — لا يقرأه أحد غيرك
chmod 755 deploy.sh     # سكربت تشغيل
chmod 700 ~/.ssh        # مجلد مفاتيح SSH

chown — تغيير المالك والمجموعة

sudo chown aziz:staff /var/www/site
sudo chown -R www-data:www-data /var/www/uploads

-R يطبق على كل المحتوى. التحويل الخاطئ للمالك يكسر الخدمات بسرعة — تحقق قبل أن تنفذ على /var أو /etc.

umask — الصلاحيات الافتراضية

كل ملف جديد يأخذ صلاحيات افتراضية محسوبة من قناع umask. الافتراضي 022 على معظم الأنظمة:

  • ملف جديد يبدأ من 666 ثم يطرح 022644.
  • مجلد جديد يبدأ من 777 ثم يطرح 022755.

اضبط umask 077 في جلسة تتعامل مع أسرار حتى لا يفلت ملف بصلاحيات قراءة عامة:

umask 077
echo "DB_PASS=secret" > .env
ls -l .env   # -rw------- (600)

umask 002 شائع في بيئات تشاركية (أعضاء المجموعة يكتبون).

البتات الخاصة: setuid، setgid، sticky

  • setuid (4xxx، يظهر s مكان x للمالك): البرنامج يعمل بصلاحيات مالكه لا مشغّله. passwd يستخدمه — لذلك يستطيع المستخدم العادي تعديل /etc/shadow المملوك للجذر.
  • setgid (2xxx): على ملف، يعمل بصلاحيات المجموعة. على مجلد، الملفات الجديدة ترث مجموعة المجلد — مفيد للمشاركات.
  • sticky (1xxx، يظهر t مكان x للباقي): على مجلد، فقط مالك الملف يستطيع حذفه. /tmp يستخدمه (1777) ليتشارك الجميع المجلد دون أن يحذف أحدهم ملفات الآخر.
chmod +s /usr/local/bin/special   # setuid (احذر — أمنياً حساس)
chmod g+s shared_dir              # setgid على مجلد
chmod +t /shared/uploads          # sticky bit

setuid على سكربت Bash لا يعمل على معظم الأنظمة الحديثة — يُتجاهل لأسباب أمنية. للسكربتات استخدم sudoers بدلاً منه.

تدقيق الصلاحيات في الإنتاج

ابحث عن ملفات قابلة للكتابة من العالم — ثغرة شائعة:

script.sh

شغّل هذا في /var/www أو مسار التطبيق قبل النشر.

نمط حماية الأسرار

عندما تنشئ .env على خادم، اضبط الصلاحيات قبل أن تكتب البيانات الحساسة:

script.sh

install -m 600 ينشئ الملف بصلاحياته النهائية مباشرة — لا توجد لحظة يكون فيها مقروءاً للعالم.

التحدي

اكتب الأمر الذي يحمي ملف .env من القراءة من غير المالك.

تحدي — Challenge