الوحدة 15 – مكافأة: مستخدمو النظام مقابل المستخدمين العاديين في لينكس
+==============================================================================+
| الوحدة 15 (مكافأة) : حسابات النظام مقابل الحسابات البشرية |
| المدة المقدرة: 1-2 ساعات | المستوى: متوسط |
+==============================================================================+
جدول المحتويات
- مقدمة
- اتفاقية UID في لينكس
- مستخدمو النظام (حسابات الخدمة)
- المستخدمون العاديون (الحسابات البشرية)
- إنشاء مستخدم نظام باستخدام
useradd -r - الفرق بين
-rو-sفيuseradd - أمثلة عملية على حسابات النظام
- الرابط مع الوحدة 14 – حسابات
wikijs_* - أوامر لعرض وتحديد المستخدمين
- أفضل الممارسات في الإنتاج
- مخطط تلخيصي
- تمارين عملية
مقدمة
في لينكس، ليست كل حسابات المستخدمين متساوية. هناك فئتان رئيسيتان:
| الفئة | UID نموذجي | الدور | مثال |
|---|---|---|---|
| مستخدم النظام (حساب الخدمة) | < 1000 | تشغيل الخدمات/daemon | www-data, mysql, nobody |
| مستخدم عادي (حساب بشري) | ≥ 1000 | شخص طبيعي يتصل بالنظام | alice, bob, etudiant |
هذه ليست قاعدة مطلقة: إنها اتفاقية تعتمد على التوزيعة وتكوين /etc/login.defs.
اتفاقية UID في لينكس
ما هو UID؟
الـ UID (معرف المستخدم) هو رقم فريد يُخصص لكل حساب مستخدم. هذا الرقم (وليس الاسم) هو ما يستخدمه نواة لينكس لإدارة الأذونات.
نطاقات UID
┌──────────────────────────────────────────────────────────────────┐
│ نطاقات UID في لينكس │
├──────────┬───────────────────────────────────────────────────────┤
│ UID 0 │ root (المستخدم الفائق) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1-999 │ حسابات النظام / الخدمات / <span dir="ltr">daemon</span> │
│ │ (www-data, mysql, sshd, daemon, nobody, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1000+ │ حسابات عادية / بشرية │
│ │ (alice, bob, etudiant, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 65534 │ nobody (مستخدم بدون امتيازات) │
└──────────┴───────────────────────────────────────────────────────┘
أين تُحدد هذه النطاقات؟
ملف /etc/login.defs يحدد النطاقات الرسمية على نظامك:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
نتيجة نموذجية على Ubuntu/Debian:
SYS_UID_MIN 201
SYS_UID_MAX 999
UID_MIN 1000
UID_MAX 60000
التفسير:
- SYS_UID_MIN (201) → SYS_UID_MAX (999) : نطاق مخصص لحسابات النظام
- UID_MIN (1000) → UID_MAX (60000) : نطاق للحسابات البشرية
- UID 0 : دائمًا
root - UID 1-200 : غالبًا ما تُخصص لحسابات النظام الحرجة (حسب التوزيعة)
مستخدمو النظام (حسابات الخدمة)
التعريف
مستخدم النظام (أو حساب الخدمة) هو حساب يُنشأ لتشغيل خدمة، شيطان أو مكون من النظام. إنه ليس مخصصًا للبشر.
الخصائص النموذجية
| الخاصية | القيمة النموذجية |
|---|---|
| UID | < 1000 (غالبًا بين 1 و 999) |
| Shell | /usr/sbin/nologin أو /bin/false |
| Home | لا يوجد home، أو دليل تقني (مثل: /var/www) |
| كلمة المرور | معطلة (مقفلة) |
| اتصال تفاعلي | غير ممكن (أو غير مرغوب فيه) |
لماذا مستخدمو النظام؟
- مبدأ أقل امتياز: كل خدمة تعمل بصلاحياتها المحدودة، وليس كـ
root - العزل: إذا تم اختراق خدمة، فإن المهاجم لديه فقط حقوق هذا الحساب
- التتبع: نعرف أي خدمة قامت بأي إجراء في السجلات
- الأمان: نتجنب الاتصال التفاعلي (shell
nologin)
أمثلة شائعة
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
mysql:x:114:120:MySQL Server,,,:/nonexistent:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
root (UID 0) هو حالة خاصة: إنه حساب نظام مع shell تفاعلي وصلاحيات كاملة.
المستخدمون العاديون (الحسابات البشرية)
التعريف
المستخدم العادي هو حساب يُنشأ لشخص طبيعي يتصل بالنظام.
الخصائص النموذجية
| الخاصية | القيمة النموذجية |
|---|---|
| UID | ≥ 1000 |
| Shell | /bin/bash أو /bin/sh |
| Home | /home/<nom_utilisateur> |
| كلمة المرور | محددة (نشطة) |
| اتصال تفاعلي | نعم |
كيف يتم إنشاؤهم؟
sudo useradd -m -s /bin/bash alice
id alice
الـ -m ينشئ دليل home (/home/alice) والـ -s /bin/bash يعطي shell تفاعلي.
إنشاء مستخدم نظام باستخدام useradd -r
العلم -r (حساب النظام)
العلم -r في useradd ينشئ حساب نظام:
sudo useradd -r monservice
ما يفعله -r:
- يخصص UID في النطاق النظامي (حسب
/etc/login.defs) - بشكل افتراضي، لا ينشئ دليل home (إلا إذا أضفنا
-m)
أمثلة
sudo useradd -r monservice
sudo useradd -r -m monservice
sudo useradd -r -m -s /usr/sbin/nologin monservice
sudo useradd -r -m -s /bin/bash monservice
التحقق
id monservice
getent passwd monservice
الفرق بين -r و -s في useradd
إنها تفرقة أساسية:
| الخيار | الدور | التأثير |
|---|---|---|
-r | يعلن الحساب كـ نظام | UID في النطاق النظامي |
-s | يحدد shell الاتصال | البرنامج الذي يتم تشغيله عند الاتصال |
-r لا يغير الـ shell
sudo useradd -r svc_web
-s لا يغير نوع الحساب
sudo useradd -s /usr/sbin/nologin alice
التوصية المجمعة لخدمة
sudo useradd -r -m -s /usr/sbin/nologin svc_web
-r = نوع الحساب (نظام) ؛ -s = shell (تسجيل الدخول / عدم تسجيل الدخول). كلاهما مستقلان.
أمثلة عملية على حسابات النظام
Apache / Nginx
id www-data
getent passwd www-data
MySQL / MariaDB
id mysql
getent passwd mysql
SSHD
id sshd
الرابط مع الوحدة 14 – حسابات wikijs_*
في التطبيق العملي للوحدة 14، قمنا بإنشاء:
sudo useradd -r -m -s /bin/bash wikijs_dev
sudo useradd -r -m -s /bin/bash wikijs_test
sudo useradd -r -m -s /bin/bash wikijs_prod
هذه الحسابات هي نظام لأننا استخدمنا -r.
التحقق:
id wikijs_dev
id wikijs_test
id wikijs_prod
الرابط مع systemd:
[Service]
User=wikijs_dev
أوامر لعرض وتحديد المستخدمين
1) عرض نطاقات UID
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
2) عرض المستخدمين البشريين (UID ≥ UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
3) عرض مستخدمي النظام (UID < UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
4) عرض الحسابات غير القابلة لتسجيل الدخول (الخدمات النموذجية)
awk -F: '($7 ~ /(nologin|false)$/) {print $1" -> "$7}' /etc/passwd
5) عرض الحسابات البشرية المحتملة (home + shell تفاعلي)
awk -F: '($6 ~ /^\/home\//) && ($7 ~ /(bash|sh)$/) {print $1" home="$6" shell="$7}' /etc/passwd
أفضل الممارسات في الإنتاج
1) دائمًا استخدم -r لحسابات الخدمة
sudo useradd -r -m -s /usr/sbin/nologin mon_service
2) تجنب الـ shells التفاعلية للخدمات
sudo usermod -s /usr/sbin/nologin wikijs_dev
3) لا تشغل خدمة كـ root أبدًا
[Service]
User=www-data
مخطط تلخيصي
تدفق القرار: كيف تحدد نوع الحساب؟
تمارين عملية
تمرين 1: تحديد أنواع الحسابات (مبتدئ)
- عرض نطاقات UID:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
- عرض حسابات النظام:
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
- عرض الحسابات البشرية:
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
تمرين 2: إنشاء ومقارنة الحسابات (متوسط)
sudo useradd -m -s /bin/bash test_humain
sudo useradd -r -m -s /usr/sbin/nologin test_service
id test_humain
id test_service
تم إنشاء TP Bonus في: فبراير 2026