الصلاحيات والملكية
Permissions and Ownership
الصلاحيات والملكية — 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ثم يطرح022→644. - مجلد جديد يبدأ من
777ثم يطرح022→755.
اضبط 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 بدلاً منه.
تدقيق الصلاحيات في الإنتاج
ابحث عن ملفات قابلة للكتابة من العالم — ثغرة شائعة:
شغّل هذا في /var/www أو مسار التطبيق قبل النشر.
نمط حماية الأسرار
عندما تنشئ .env على خادم، اضبط الصلاحيات قبل أن تكتب البيانات الحساسة:
install -m 600 ينشئ الملف بصلاحياته النهائية مباشرة — لا توجد لحظة يكون فيها مقروءاً للعالم.
التحدي
اكتب الأمر الذي يحمي ملف .env من القراءة من غير المالك.