Linux: مشروع المرحلة 2 المصغّر
هذا هو المشروع الختامي للمرحلة 2. ستطبّق معرفتك بإدارة المستخدمين وصلاحيات الملفات ومتغيرات البيئة لتحويل سيناريو "فوضى المستخدم الواحد" إلى خادم تطوير تعاوني متعدد المستخدمين.
📋 المتطلبات المسبقة: يجب إكمال
- الدرس 8: صلاحيات الملفات
- الدرس 9: إدارة المستخدمين والمجموعات
- الدرس 10: متغيرات البيئة وPATH
1. ما ستتعلمه
- تصميم نظام مستخدمي الفريق
- استراتيجية صلاحيات الدليل المشترك
- إعدادات umask موحدة للفريق
- إعدادات Shell فردية لكل مطور
- إدارة صلاحيات sudo بالمجموعات
2. كابوس تعاون فريق شياو مينغ
(1) الألم: ثلاثة أشخاص يتشاركون خادمًا، الملفات تختلط
فريق شياو مينغ المكون من ثلاثة أشهر كان يتشارك خادمًا سحابيًا. الجميع سجّلوا الدخول كجذر ولم يُدِر أحد صلاحيات الملفات — سكريبت شياو مينغ حُذف عرضيًا من قبل زميل ثلاث مرات، ولم يستطع إيجاد ملفاته لأنها كانت مختلطة مع كل شيء في /tmp.
(2) بيئة متعددة المستخدمين معيارية
ساعدهم بوب في تصميم بيئة متعددة مستخدمين قياسية:
# 1. لكل شخص حسابه ودليله المنزلي الخاص
sudo useradd -m -s /bin/bash alice
sudo useradd -m -s /bin/bash bob
sudo useradd -m -s /bin/bash charlie
# 2. دليل مشروع مشترك (SGID يضمن وراثة المجموعة)
sudo mkdir -p /srv/project
sudo chgrp developers /srv/project
sudo chmod 2775 /srv/project
(3) الفائدة: لكل شخص مساحته، والمناطق المشتركة منظمة
الملفات لم تعد تختفي، كل شخص له دليله المنزلي المستقل وإعدادات Shell الخاصة، والدليل المشترك له صلاحيات صحيحة — لن يحذف أحد ملفات شخص آخر عرضيًا.
3. نقاط المعرفة
(1) مبادئ تصميم البيئة متعددة المستخدمين
| المبدأ | الوصف |
|---|---|
| أقل صلاحية | كل مستخدم يحصل على الحد الأدنى فقط من الصلاحيات اللازمة لعمله |
| فصل المهام | أدوار مختلفة تستخدم مستخدمين مختلفين؛ تجنب "جذر واحد لكل شيء" |
| سياسة المجموعات | استخدم المجموعات لإدارة مجموعات الصلاحيات بدلًا من تعيين صلاحيات لكل مستخدم |
| أثر التدقيق | استخدم sudo بدلًا من الجذر المباشر — كل الأوامر مُسجَّلة |
(2) استراتيجية صلاحيات الدليل المشترك
للدلائل المشتركة للفريق، استخدم SGID: الملفات المنشأة حديثًا ترث مجموعة الدليل تلقائيًا.
# /srv/project هو الدليل المشترك
sudo chown root:developers /srv/project
sudo chmod 2775 /srv/project
# 2 = SGID (الملفات الجديدة ترث المجموعة)
# 775 = المالك والمجموعة يمكنهم قراءة/كتابة/تنفيذ، والآخرون قراءة/تنفيذ
> ⚠️ ملاحظة: الرقم `2` في `chmod 2775` يمثل SGID — عند تعيين SGID على دليل مشترك، أي ملف جديد يُنشأ هناك يرث تلقائيًا مجموعة الدليل (بدلًا من المجموعة الأساسية للمنشئ). هذه هي الآلية الأساسية للعمل الجماعي. بدون SGID، ستكون الملفات الجديدة ملكًا للمجموعة الأساسية للمنشئ، وقد لا يتمكن أعضاء الفريق الآخرون من تعديلها.
(3) /etc/skel — دليل قالب المستخدم
الملفات في /etc/skel/ تُنسخ تلقائيًا إلى الدليل المنزلي للمستخدم الجديد عند إنشاء حسابه. يمكنك إضافة إعدادات افتراضية مخصصة:
# عرض محتويات skel الافتراضية
ls -la /etc/skel/
# إضافة إعدادات مخصصة لكل المستخدمين الجدد
sudo tee -a /etc/skel/.bashrc << 'EOF'
# ---- Team standard configuration ----
alias ll='ls -la'
alias ..='cd ..'
export EDITOR=vim
EOF
(4) ▶ مثال: إنشاء نظام مستخدمي فريق كامل
# إنشاء مجموعة مشتركة
sudo groupadd developers
# إنشاء حسابات لثلاثة مطورين
for user in alice bob charlie; do
sudo useradd -m -s /bin/bash "$user"
sudo passwd "$user" # تعيين كلمة المرور تفاعليًا
sudo usermod -aG developers "$user"
echo "User $user created"
done
# التحقق
grep developers /etc/group
الإخراج:
TEXTUser alice created User bob created User charlie created developers:x:1005:alice,bob,charlie
(5) ▶ مثال: إعداد دليل مشترك بـSGID
# إنشاء دليل مشروع مشترك
sudo mkdir -p /srv/project/{src,docs,scripts}
# تعيين المجموعة
sudo chgrp -R developers /srv/project
# تعيين SGID + صلاحيات قياسية
sudo chmod 2775 /srv/project
# 2 = SGID
# 7 = المالك (rwx)
# 7 = المجموعة (rwx)
# 5 = الآخرون (r-x)
# اختبار: إنشاء ملف كمستخدم مختلف والتحقق من وراثة المجموعة
sudo -u alice touch /srv/project/test.txt
ls -l /srv/project/test.txt
# -rw-r--r-- 1 alice developers 0 Jul 7 12:00 test.txt
# الملف يخص مجموعة developers ✅
الإخراج:
TEXT-rw-r--r-- 1 alice developers 0 Jul 7 12:00 test.txt
(6) ▶ مثال: ضبط umask الافتراضي
# تعيين umask موحد للفريق (لكي تكون الملفات المشتركة قابلة للكتابة افتراضيًا)
echo 'umask 002' | sudo tee -a /etc/bash.bashrc
# تأثير 002:
# الملف: 666 - 002 = 664 (rw-rw-r--)
# الدليل: 777 - 002 = 775 (rwxrwxr-x)
# هكذا يمكن لأعضاء المجموعة تعديل ملفات بعضهم البعض
> ℹ️ ملاحظة: للعمل الجماعي، umask موحد بقيمة 002 يتيح لأعضاء المجموعة تعديل ملفات بعضهم. لكن انتبه للأمان — على خادم يتشاركه عدة فرق، قد يكون 002 متساهلًا جدًا. نوصي باستخدام SGID + 002 في الدلائل المشتركة فقط، والإبقاء على 022 كافتراضي في الدلائل المنزلية للمستخدمين.
الإخراج:
TEXTumask 002
(7) ▶ مثال: إعدادات .bashrc مخصصة
# شياو مينغ يحب المحث الملون
cat >> ~/.bashrc << 'EOF'
export PS1='\[\033[1;32m\]\u\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '
alias ll='ls -lah'
EOF
source ~/.bashrc
# بوب يحب البساطة
cat >> ~/.bashrc << 'EOF'
export PS1='\w\$ '
alias l='ls -CF'
EOF
source ~/.bashrc
الإخراج:
TEXTalice:~/projects$ ls -lah drwxr-x--- 2 alice developers 4096 Jul 7 10:30 .
(8) ▶ مثال: إدارة صلاحيات sudo بالمجموعات
# إنشاء مجموعة
sudo groupadd devops
# إضافة شياو مينغ إلى مجموعة devops (يمكنه إدارة خدمات النظام)
sudo usermod -aG devops charlie
# ضبط صلاحيات sudo بالمجموعة
echo '%developers ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/developers
echo '%devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt' | sudo tee /etc/sudoers.d/devops
> 💡 نصيحة: النهج الموصى به لإدارة صلاحيات sudo هو "مبدأ المجموعات" — أنشئ مجموعات حسب الدور (مثل developers وdevops)، ثم أنشئ ملفات منفصلة تحت `/etc/sudoers.d/` لكل مجموعة. هكذا إضافة أو إزالة المستخدمين تتطلب تغيير عضوية المجموعة فقط، دون تعديل متكرر لملفات sudoers.
# تعيين الصلاحيات
sudo chmod 440 /etc/sudoers.d/*
الإخراج:
TEXT%developers ALL=(ALL) ALL %devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt
(9) ▶ مثال شامل: سكريبت نشر بيئة متعددة المستخدمين كامل
#!/bin/bash
# setup-multi-user.sh - إعداد بيئة تطوير فريق متعددة المستخدمين
set -e
echo "=== Setting up multi-user development environment ==="
# 1. إنشاء المستخدمين
TEAM_MEMBERS=("alice" "bob" "charlie")
sudo groupadd developers 2>/dev/null || true
for user in "${TEAM_MEMBERS[@]}"; do
if id "$user" &>/dev/null; then
echo "User $user already exists, skipping creation"
else
sudo useradd -m -s /bin/bash "$user"
echo "Please set password for $user:"
sudo passwd "$user"
fi
sudo usermod -aG developers "$user"
done
echo "✅ Users created"
# 2. إنشاء الدليل المشترك
sudo mkdir -p /srv/project/{src,docs,scripts,tests}
sudo chgrp -R developers /srv/project
sudo chmod 2775 /srv/project
sudo chmod 2775 /srv/project/*/
echo "✅ Shared directory created (SGID set)"
# 3. ضبط umask للفريق
echo 'umask 002' | sudo tee -a /etc/bash.bashrc
echo "✅ Team umask configured"
# 4. ضبط صلاحيات sudo
echo '%developers ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/developers
sudo chmod 440 /etc/sudoers.d/developers
echo "✅ sudo privileges configured"
# 5. إنشاء README
cat | sudo tee /srv/project/README.md << 'EOF'
# Team Project Directory
---
## 4. Directory Structure
- src/ — Source code
- docs/ — Documentation
- scripts/ — Scripts
- tests/ — Tests
---
## 5. Rules
- umask 002, group members can modify each other's files
- Don't use root in this directory
- Confirm before using `sudo` to install software
EOF
echo "✅ README created"
echo ""
echo "=== Environment Ready ==="
echo "Users: ${TEAM_MEMBERS[*]}"
echo "Shared directory: /srv/project"
echo ""
echo "Verification:"
echo " 1. Create files as different users and check group is developers"
echo " 2. Use who to view online users"
echo " 3. Use sudo -l to view privileges"
❓ أسئلة شائعة
س: لماذا يجب أن يكون للدلائل المشتركة SGID؟ ج: SGID يضمن أن أي ملف أو دليل فرعي يُنشأ في دليل مشترك يرث تلقائيًا مجموعة الدليل الأب. بدون SGID، ستكون الملفات التي ينشئها مستخدم ملكًا لمجموعته الخاصة، ولن يكون لأعضاء الفريق الآخرين صلاحية تعديلها. مع SGID، تنتمي الملفات تلقائيًا إلى مجموعة
developers.
س: ماذا يفعل دليل
/etc/skel؟ ج: عند إنشاء مستخدم جديد بـuseradd -m، كل الملفات في/etc/skel/تُنسخ تلقائيًا إلى الدليل المنزلي للمستخدم الجديد. يمكنك وضع قوالب افتراضية مثل.bashrcو.profileو.vimrcهناك.
س: ماذا يحدث إذا ضُبط umask على 007؟ ج: umask بقيمة 007 يعني أن الملفات والدلائل الجديدة لا تحصل على صلاحيات لـ"الآخرين". الملفات: 666-007=660 (rw-rw----)، الدلائل: 777-007=770 (rwxrwx---). مناسب للخوادم المستخدمة حصريًا من قبل فريق.
س: ماذا يجب أن تكون صلاحيات الدليل المنزلي للمستخدم؟ ج: القياسي هو 755 (
rwxr-xr-x) — المالك يتحكم بالكامل، والآخرون يمكنهم القراءة والتنفيذ فقط (يمكنهم cd لكن لا يمكنهم الكتابة). للخصوصية، اضبط على 750 أو 700.
س: كيف أقيّد صلاحيات sudo لمستخدم؟ ج: أنشئ ملفًا مستقلًا تحت
/etc/sudoers.d/يحدد بدقة الأوامر المسموحة:alice ALL=(ALL) /usr/bin/systemctl, /usr/bin/apt. هذا يقيّد المستخدم بـsudo لـsystemctl وapt فقط، ولا شيء آخر.
📖 ملخص
- نظام مستخدمي الفريق: حسابات فردية + مجموعة developers مشتركة
- SGID (
chmod g+sأو الصياغة الرقمية2xxx) يجعل ملفات الدليل المشترك ترث المجموعة تلقائيًا - umask 002 مناسب للعمل الجماعي (قابل للكتابة من المجموعة)
/etc/skelيضبط قوالب الإعدادات الافتراضية للمستخدمين الجدد- إدارة صلاحيات sudo بالمجموعات: مجموعات مختلفة تحصل على مستويات صلاحيات مختلفة
📝 تمارين
- أساسي (صعوبة ⭐): أنشئ مستخدمين
dev1وdev2، أضفهما إلى مجموعةteam، ثم أنشئ دليلًا مشتركًا/srv/team-projectبـSGID (2775) - متوسط (صعوبة ⭐⭐): أنشئ ملفات في الدليل المشترك كـ
dev1وdev2على التوالي، تحقق أن الملفات تنتمي تلقائيًا إلى مجموعةteam، ثم اضبطdev1لتشغيلsudo aptوsudo systemctlفقط (أوامر مقيدة) - متقدم (صعوبة ⭐⭐⭐): اكتب سكريبتًا ينفذ كل الإعدادات أعلاه دفعة واحدة (إنشاء مستخدمين ومجموعات ودلائل وSGID وقيود sudo)، مع فحص المعاملات ومعالجة الأخطاء