إدارة المستخدمين والمجموعات في لينكس: الدليل الشامل من سطر الأوامر إلى هندسة DevOps
النموذج الأمني وهيكلة الهويات داخل نظام لينكس
يقوم أمان أنظمة لينكس على مفهوم العزل الصارم بين العمليات والموارد استناداً إلى هويات المستخدمين والمجموعات، وذلك تطبيقاً لمبدأ الامتياز الأقل (Principle of Least Privilege). لا يتعامل النواة (Kernel) مع الأسماء النصية مثل “root” أو “ahmed”، بل يتعامل حصرياً مع معرّفات رقمية فريدة تُعرف بمعرّف المستخدم (UID) ومعرّف المجموعة (GID). تتوزع هذه الهويات داخل النظام وفق معايير موحدة تضمن عدم تداخل مهام البرمجيات مع المستخدمين البشريين.
تُقسم الحسابات في التوزيعات الحديثة إلى ثلاثة نطاقات رئيسية وفق المعرّف الرقمي UID:
- حساب الجذر الفائق (Superuser – UID 0): يمتلك صلاحيات غير مقيدة لتجاوز كافة تدقيقات الأذونات داخل النواة، ويجب أن يظل الحساب الوحيد الذي يحمل المعرّف صفر.
- حسابات النظام والخدمات (System Users): تُحجز لها المعرّفات من 1 إلى 999 (وفق المحدد
UID_MINفي الأنظمة الحديثة). تُخصص هذه الحسابات لتشغيل خوادم البريد، وقواعد البيانات، وخوادم الويب مثل Nginx أو PostgreSQL، وتُعطّل قدرتها على تسجيل الدخول التفاعلي بتعيين الصدفة إلى/usr/sbin/nologinأو/bin/false. - حسابات المستخدمين العاديين (Regular Users): تبدأ معرّفاتها عموماً من 1000 وما فوق، وتُخصص للبشر للوصول إلى واجهات النظام وأداء المهام اليومية مع إمكانية تصعيد الصلاحيات عند الضرورة.
يرتبط كل مستخدم بنوعين من المجموعات؛ المجموعة الأساسية (Primary Group) وهي المجموعة التي يرثها المستخدم افتراضياً عند إنشائه وتُسجل معرّفها في ملف هويته الشخصي لتكون المالك الافتراضي لأي ملف ينشئه، والمجموعات الثانوية (Supplementary Groups) التي يُضاف إليها المستخدم لاحقاً للحصول على امتيازات إضافية، مثل الوصول إلى أجهزة معينة، أو تشغيل الحاويات، أو إدارة مهام النظام الإدارية.
التشريح الداخلي لقواعد بيانات الهوية المسطحة (Flat-File DBs)
يعتمد نظام لينكس على مجموعة من الملفات النصية في المسار /etc/ لإدارة الهويات وكلمات المرور، وتعمل هذه الملفات كقواعد بيانات مسطحة تقرأها مكتبات النظام ومكتبات PAM عند التحقق من الهوية.
تشريح ملف المستخدمين: /etc/passwd
يمتاز هذا الملف بقابليته للقراءة من قِبل جميع المستخدمين والعمليات (الصلاحية 644)، وذلك لتمكين البرامج من ربط معرّف الـ UID بالاسم المقابل له. يحتوي كل سطر على سبعة حقول مفصولة بنقطتين رأسيتين (:):
- اسم المستخدم (Username): الرمز الأبجدي لتسجيل الدخول.
- حقل كلمة المرور: يحتوي في الأنظمة الحديثة دائماً على الحرف
x، للإشارة إلى أن الهاش المشفر نُقل إلى ملف الظل الآمن لمنع قراءته. - معرّف المستخدم (UID): الرقم التسلسلي للحساب.
- معرّف المجموعة الأساسية (GID): الرقم التسلسلي للمجموعة الابتدائية للمستخدم.
- حقل التعليقات (GECOS): يضم بيانات وصفية مثل الاسم الحقيقي أو رقم الغرفة أو الملاحظات.
- المسار المنزلي (Home Directory): المجلد الخاص بالمستخدم، مثل
/home/username. - صدفة الدخول الافتراضية (Default Shell): المسار التنفيذي للبرنامج الوسيط الذي يتعامل معه المستخدم فور تسجيل الدخول، مثل
/bin/bash.
تشريح ملف كلمات المرور المحمية: /etc/shadow
نظراً لحساسية التجزئات المشفرة لكلمات المرور، خُصص هذا الملف ولا يُسمح بقراءته إلا للمستخدم root (الصلاحية 000 أو 040). يتكون كل سطر من تسعة حقول تفكك دورة حياة كلمة المرور:
- اسم المستخدم المطابق للموجود في
/etc/passwd. - كلمة المرور المشفرة (Password Hash). التوزيعات الحديثة مثل Ubuntu 22.04+ و RHEL 9 تعتمد خوارزمية yescrypt (التي تبدأ بالرمز
$y$)، بدلاً من SHA-512 (التي تبدأ بـ$6$)، وذلك لقدرة yescrypt على مقاومة هجمات التخمين باستخدام البطاقات الرسومية (GPUs) عبر استهلاك كثيف للذاكرة. - تاريخ آخر تغيير لكلمة المرور (محسوباً بعدد الأيام منذ 1 يناير 1970).
- الحد الأدنى لعدد الأيام قبل السماح بتغيير كلمة المرور ثانية.
- الحد الأقصى لصلاحية كلمة المرور بالأيام قبل إجبار المستخدم على تجديدها.
- عدد أيام التحذير الاستباقي قبل انتهاء الصلاحية.
- فترة السماح (Inactivity Days) لتعطيل الحساب إذا لم تُجدد كلمة المرور بعد انتهائها.
- تاريخ انتهاء الحساب بالكامل (محسوباً بالأيام منذ بداية حقبة Unix).
- حقل محجوز للاستخدام المستقبلي.
ملفات المجموعات والإعدادات المسبقة
يحدد ملف /etc/group أسماء المجموعات ومعرّفاتها وأعضاءها الإضافيين، بينما يُخصص /etc/gshadow لكلمات المرور الخاصة بالمجموعات (إن وُجدت). تتحكم ثلاثة مراجع أخرى بسلوك إنشاء الحسابات:
/etc/login.defs: يضبط النطاقات الافتراضية للـ UIDs وسياسات التشفير وصلاحيات كلمات المرور./etc/default/useradd: يحدد الصدفة الافتراضية، والمسار المنزلي المبدئي، وإنشاء صناديق البريد./etc/skel/: مجلد قوالب؛ تُنسخ كافة الملفات بداخله (بما فيها الملفات المخفية مثل.bashrc) إلى المجلد المنزلي لأي مستخدم جديد لحظة إنشائه.
أدوات التحكم وإدارة الحسابات في سطر الأوامر
يوفر لينكس مستويين من الأدوات لإدارة الهويات؛ أدوات منخفضة المستوى قياسية في كافة التوزيعات، وأدوات مرتفعة المستوى تفاعلية.
الأدوات القياسية (Low-Level Utilities)
تعتمد الأنظمة على حزمة shadow-utils الأساسية، وتشمل:
useradd: أداة الإنشاء المباشرة، وتتطلب تمرير المعاملات صراحة (مثل-mلإنشاء المجلد المنزلي، و-sلتحديد الشِل).usermod: تعديل خصائص حساب موجود (المجموعات، المجلد المنزلي، الشِل، حالة القفل).userdel: حذف المستخدمين، مع إمكانية مسح المجلد المنزلي باستخدام الخيار-r.groupaddوgroupdelوgroupmod: إدارة المجموعات الحسابية ومعرّفاتها.
الأدوات التفاعلية (High-Level Utilities)
في توزيعات عائلة Debian وUbuntu، يتوفر سكربت Perl تفاعلي باسم adduser وdeluser، يقوم تلقائياً بإنشاء المجلد المنزلي، نسخ ملفات /etc/skel، تعيين كلمة المرور فوراً، وسؤال المسؤول عن بيانات المستخدم الحقيقية، مستنداً إلى الإعدادات المدونة في /etc/adduser.conf.
إدارة دورة حياة كلمات المرور عبر chage
تُستخدم أداة chage لضبط انتهاء الصلاحية والتنبيهات، وتُعد حجر زاوية في الالتزام بالمعايير الأمنية المؤسسية. على سبيل المثال، إجبار المستخدم على تغيير كلمة مروره فور تسجيل دخوله القادم يُنفذ بالأمر:
sudo chage -d 0 username
إدارة الامتيازات والتفويض عبر نظام Sudo
العمل الدائم بصلاحية root يُعرّض خوادم الإنتاج لمخاطر بشرية وبرمجية بالغة. يتيح نظام الامتيازات التدرج وتوزيع المسؤوليات بالحد الأدنى المطلوب للمهام الإدارية.
الفروق التشغيلية بين أدوات الانتقال والتصعيد
su <user>: يبدّل المستخدم إلى حساب آخر مع الاحتفاظ بمتغيرات البيئة (Environment Variables) ومسار$PATHالخاص بالحساب السابق، مما يسبب مشكلات عند محاولة استدعاء أوامر موجودة في/sbin.su - <user>: ينشئ جلسة تسجيل دخول كاملة (Login Shell)، محمّلاً كافة متغيرات البيئة ومسار العمل الخاص بالمستخدم المستهدف.sudo <command>: ينفذ أمراً واحداً بامتيازات حساب آخر (الجذر افتراضياً) مع تسجيل الحدث في سجلات التدقيق (Syslog) لضمان المساءلة.sudo -i: يحاكي تسجيل دخول كامل كـ root مع استدعاء ملفات بيئته الخاصة.
التفويض المحكم عبر /etc/sudoers
يُدار تفويض الصلاحيات عبر ملف /etc/sudoers والملفات الفرعية في المجلد /etc/sudoers.d/. تختلف المجموعات الإدارية الافتراضية وفق نوع التوزيعة؛ حيث تعتمد عائلة RHEL وFedora وArch Linux على مجموعة wheel، بينما تعتمد عائلة Debian وUbuntu على مجموعة sudo.
القاعدة الصارمة: يُحظر تماماً فتح ملف /etc/sudoers بمحررات النصوص العادية كـ nano أو vim مباشرة. يجب دائماً استخدام الأمر:
sudo visudo
يقوم visudo بقفل الملف لمنع التعديل المتزامن، ويُخضع التعديلات لفحص نحوي برمجي (Syntax Checking) قبل الحفظ؛ حيث إن أي خطأ لغوي بملف الـ sudoers يعطل وصول المسؤولين إلى النظام بالكامل.
مساحات العمل المشتركة وتوريث الصلاحيات المتقدم (SGID)
عندما يعمل فريق تطوير أو عمليات على مشروع محلي داخل مسار مثل /srv/project، فإن أذونات الملفات التقليدية تعيق العمل المشترك؛ إذ يمتلك كل ملف منشأ حديثاً المجموعة الأساسية لمنشئه فقط. للتغلب على هذه المشكلة، يُستخدم بت التنفيذ الخاص للمجموعات Set-GID (SGID).
عند تفعيل بت الـ SGID على مجلد ما عبر الأمر chmod 2770 /path/dir (أو chmod g+s /path/dir)، فإن أي ملف أو مجلد فرعي يُنشأ داخل هذا المجلد سيرث تلقائياً “المجموعة المالكة” للمجلد الأب، بدلاً من المجموعة الأساسية للمستخدم الذي أنشأه. يضمن هذا التوريث، بالتكامل مع ضبط قيمة الـ umask المناسبة (مثل 002 أو 007)، بقاء الملفات قابلة للقراءة والتعديل من قِبل جميع أعضاء المجموعة المشتركة دون تدخل يدوي متكرر.
تطبيق عملي: سكربت أتمتة بيئة عمل تعاونية
السكربت التالي بلغة Bash مؤتمت بالكامل وقابل لإعادة التشغيل (Idempotent). يقوم بإنشاء بيئة فريق مهندسي DevOps، وضبط صلاحيات SGID على مسار العمل المشترك، مع إجبار المستخدمين الجدد على تحديث كلمات مرورهم الافتراضية فور تسجيل الدخول:
#!/usr/bin/env bash
set -euo pipefail
# Ensure the script is executed with root privileges
if [[ $EUID -ne 0 ]]; then
echo "[-] This script must be run as root or via sudo" >&2
exit 1
fi
TARGET_GROUP="devops_engineers"
SHARED_DIR="/srv/devops_workspace"
TEAM_MEMBERS=("eng_tareq" "eng_mona")
echo "[+] Step 1: Configuring user group..."
if ! getent group "$TARGET_GROUP" >/dev/null 2>&1; then
groupadd "$TARGET_GROUP"
echo " -> Created group: $TARGET_GROUP"
fi
echo "[+] Step 2: Provisioning users and supplementary groups..."
for member in "${TEAM_MEMBERS[@]}"; do
if ! id -u "$member" >/dev/null 2>&1; then
useradd -m -s /bin/bash "$member"
echo "${member}:TempSecretKey987!" | chpasswd
chage -d 0 "$member"
echo " -> Created user: $member (Password must be changed upon first login)"
fi
usermod -aG "$TARGET_GROUP" "$member"
echo " -> Added user $member to group $TARGET_GROUP safely"
done
echo "[+] Step 3: Setting up collaborative directory with SGID..."
mkdir -p "$SHARED_DIR"
chown root:"$TARGET_GROUP" "$SHARED_DIR"
# Mode 2770: SetUID=0, SetGID=1, Owner=rwx, Group=rwx, Others=none
chmod 2770 "$SHARED_DIR"
echo "[✓] Directory configured successfully with SGID at: $SHARED_DIR"
شرح تعليمات السكربت
set -euo pipefail: ضبط أمني يوقف تشغيل السكربت فوراً عند مواجهة أي خطأ برمجي، أو عند استدعاء متغير غير معرف، لمنع تنفيذ أوامر غير محسوبة بامتيازات إدارية.if [[ $EUID -ne 0 ]]: التحقق من المعرّف الرقمي الفعلي للمستخدم الذي يُنفذ السكربت لضمان أنه يملك صلاحيات الجذر.getent group "$TARGET_GROUP": الاستعلام الآمن عن وجود المجموعة عبر نظام NSS دون الاعتماد حصرياً على فحص ملف/etc/groupيدوياً.useradd -m -s /bin/bash "$member": إنشاء الحساب وتجهيز مجلده المنزلي بنسخ قوالب/etc/skelوتعيين صدفة bash كبيئة تشغيل له.chage -d 0 "$member": تصفير تاريخ آخر تحديث لكلمة المرور، مما يجعلها منتهية الصلاحية فوراً، فيُجبر المستخدم على إدخال كلمة سر جديدة قبل الوصول لأي أمر بالنظام.usermod -aG "$TARGET_GROUP" "$member": إضافة المستخدم للمجموعة مع الحفاظ الصارم على كافة مجموعاته الثانوية الحالية دون مساس.chmod 2770 "$SHARED_DIR": تطبيق نمط الأذونات المثمن، حيث يمثل الرقم الأول2تفعيل راية SGID، والرقم7الأول صلاحيات كاملة للجذر، والرقم7الثاني صلاحيات كاملة لأعضاء المجموعة، والصفر الأخير يمنع أي وصول لبقية المستخدمين غير المصرح لهم.
الهويات في بيئات DevOps الحديثة: الحاويات و systemd-homed
شهدت منظومة إدارة المستخدمين تطورات جذرية لتلبية متطلبات هندسة المنصات الحديثة وتأمين الحاويات المعزولة.
تأمين الحاويات غير الجذرية (Rootless Containers)
في بيئات العمل المعاصرة التي تعتمد Podman أو Docker Rootless، ظهر مفهوما /etc/subuid و/etc/subgid. تسمح هذه الآلية بتخصيص نطاق معرّفات فرعية للمستخدم العادي (عادة 65,536 معرّفاً). يتمكن المطور من العمل كحساب root داخل بيئة الحاوية (UID 0 افتراضياً)، لكن النواة تعيد رسم خارطة هذا المعرّف خارج الحاوية إلى UID فرعي عادي، مما يمنع نهائياً أي إمكانية للهروب خارج الحاوية للسيطرة على خادم التشغيل المستضيف.
إعادة هيكلة الحسابات المنقولة عبر systemd-homed
قدّم نظام systemd خدمة systemd-homed وأداة homectl، والتي تنقل إدارة المستخدمين من السجلات الثابتة في /etc/passwd إلى سجلات هوية محمولة مشفرة بصيغة JSON داخل ~/.identity. في هذا النموذج، يُشفر المجلد المنزلي للمستخدم بالكامل بواسطة تقنية LUKS2، ولا يُفك تشفيره إلا عند تسجيل الدخول الفعلي بواسطة كلمة المرور أو مفتاح FIDO2، مما يوفر عزلاً تاماً للبيانات على محركات الأقراص المنقولة والمحمولة المشتركة بين عدة خوادم.
الأخطاء الشائعة في إدارة حسابات لينكس وكيف تتفاداها
-
استخدام
usermod -Gوتجاهل خيار الإلحاق-a:المشكلة: تنفيذ
sudo usermod -G docker eng_aliدون إضافة المعامل-aيؤدي إلى استبدال كافة المجموعات الثانوية التي ينتمي إليها المستخدم بالمجموعة الجديدة فقط. إذا كان المستخدم ينتمي لمجموعةsudoأوwheel، فسيُطرد منها ويفقد امتيازاته الإدارية فوراً.الحل: استخدام التركيبة
-aGدائماً، أو استخدام الأداة البديلة الأكثر أماناً:sudo gpasswd -a eng_ali docker. -
تعديل ملفات النظام الحساسة بمحررات النصوص العادية:
المشكلة: فتح
/etc/sudoersباستخدامnanoأوvimدون فحص البنية اللغوية، مما يسبب أخطاء تمنع استدعاء أمرsudo، أو تعديل/etc/passwdيدوياً دون توفير ميزة القفل (Locking).الحل: استخدم
visudoلتعديل ملفات التفويض، واستخدمvipwوvigrلتعديل ملفات المستخدمين والمجموعات؛ حيث تمنع هذه الأدوات التضارب عند التعديل المتزامن وتدقق المدخلات قبل الكتابة. -
تجاهل تحديث الجلسة بعد تعديل المجموعات:
المشكلة: إضافة مستخدم لمجموعة ما وظهور رسالة “Permission Denied” للمستخدم عند محاولة تنفيذ الأوامر، على الرغم من تأكيد المسؤول لإضافته.
الحل: تُحمّل مصفوفة مجموعات المستخدم في الذاكرة أثناء توليد رمز الوصول عند تسجيل الدخول المبدئي. يجب على المستخدم تسجيل الخروج بالكامل وإعادة الدخول، أو استخدام الأمر
newgrp <group_name>لتجديد المجموعات بالجلسة الحالية لسطر الأوامر. -
حذف الحسابات دون تصفية الملفات المتروكة (Orphaned Files):
المشكلة: تنفيذ
userdel usernameبدون الخيار-rيبقي المجلد المنزلي والملفات الخاصة به مخزنة على القرص ولكن بدون مالك مسجل (تظهر ملكيتها برقم الـ UID القديم). عند إنشاء مستخدم مستقبلي يحمل نفس الرقم العشوائي، سيرث تلقائياً ملكية هذه الملفات والوصول إلى أسرارها.الحل: احذف المستخدم ومجلده معاً عبر
userdel -r username، أو ابحث دورياً عن الملفات التي لا مالك لها عبر الأمر:find / -nouser -o -nogroup.
متى تعتمد الإدارة المحلية للمستخدمين ومتى تتجاوزها؟
الإدارة المحلية عبر /etc/passwd وshadow-utils هي الخيار الأمثل والوحيد للخوادم الفردية المعزولة، والأنظمة المدمجة (Embedded Systems)، وتهيئات البنية التحتية للحاويات البسيطة، أو لإنشاء حسابات النظام المخصصة لتشغيل الخدمات المحلية ذاتية الاحتواء.
في المقابل، عندما يتجاوز حجم البنية التحتية لديك بضعة خوادم، أو عند العمل ضمن فرق تقنية تتطلب دورات انضمام ومغادرة مستمرة، يصبح الاعتماد على إدارة الحسابات المحلية عائقاً تشغيلياً وثغرة أمنية تدقيقية. في هذه البيئات، يجب تجاوز الملفات المسطحة والاعتماد على حلول الهوية المركزية مثل FreeIPA، أو LDAP، أو الربط مع Active Directory عبر خدمات SSSD (System Security Services Daemon)، مما يوفر إدارة موحدة للصلاحيات وتدقيقاً أمنياً مركزياً يمتد عبر كافة مزارع الخوادم والسحابة بنقرة واحدة.


