انتقل إلى المحتوى الرئيسي

الوحدة 15 – مكافأة: مستخدمو النظام مقابل المستخدمين العاديين في لينكس

+==============================================================================+
| الوحدة 15 (مكافأة) : حسابات النظام مقابل الحسابات البشرية |
| المدة المقدرة: 1-2 ساعات | المستوى: متوسط |
+==============================================================================+

جدول المحتويات​

  1. مقدمة
  2. اتفاقية UID في لينكس
  3. مستخدمو النظام (حسابات الخدمة)
  4. المستخدمون العاديون (الحسابات البشرية)
  5. إنشاء مستخدم نظام باستخدام useradd -r
  6. الفرق بين -r و -s في useradd
  7. أمثلة عملية على حسابات النظام
  8. الرابط مع الوحدة 14 – حسابات wikijs_*
  9. أوامر لعرض وتحديد المستخدمين
  10. أفضل الممارسات في الإنتاج
  11. مخطط تلخيصي
  12. تمارين عملية

مقدمة​

في لينكس، ليست كل حسابات المستخدمين متساوية. هناك فئتان رئيسيتان:

الفئةUID نموذجيالدورمثال
مستخدم النظام (حساب الخدمة)< 1000تشغيل الخدمات/daemonwww-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)
كلمة المرورمعطلة (مقفلة)
اتصال تفاعليغير ممكن (أو غير مرغوب فيه)

لماذا مستخدمو النظام؟​

  1. مبدأ أقل امتياز: كل خدمة تعمل بصلاحياتها المحدودة، وليس كـ root
  2. العزل: إذا تم اختراق خدمة، فإن المهاجم لديه فقط حقوق هذا الحساب
  3. التتبع: نعرف أي خدمة قامت بأي إجراء في السجلات
  4. الأمان: نتجنب الاتصال التفاعلي (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: تحديد أنواع الحسابات (مبتدئ)​

  1. عرض نطاقات UID:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
  1. عرض حسابات النظام:
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
  1. عرض الحسابات البشرية:
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