اذهب إلى المحتوى

كيف تُحرِّر ملفّ Sudoers على Ubuntu وCentOS


محمد أحمد العيل

يُمثِّل الفصل بين الامتيّازات Privileges أحد المبادئ الأمنيّة الأساسيّة المُدرجَة في Linux والأنظمة الشّبيهة بيونكس Unix-like. تجسيدًا لهذا المبدأ يعمل المسخدمون العاديّون بامتيّازات محدودة لحدّ دائرة تأثيرهم على بيئتهم الخاصّة وليس على كامل نظام التّشغيل. يوجد مستخدم خاصّ يُسمّى المستخدم الجذر root user ويملك امتيّازات “المستخدم الأعلى”. حساب المستخدم الجذر هو حساب إداريّ لا توجد عليه القيود الموجودة على المستخدمين العاديّين. يُمكن للمستخدمين العاديّين تنفيذ أوامر بامتيّازات المستخدم الأعلى (المستخدم الجذر) بطرق مختلفة.

سنناقش في هذا الدّليل الطّريقة الصّحيحة والآمنة للحصول على امتيّازات المستخدم الجذر، مع التّركيز على ملفّ etc/sudoers/. سنطبّق الخطوات المشروحة هنا على خادوم Ubuntu 14.04؛ يجب أن تكون هذه الخطوات صالحة لأغلب توزيعات لينوكس الحديثة.

نفترض في هذا الدّرس، أنّك أكملت خطوات درس الإعداد الابتدائي لخادوم أوبنتو.سجِّل الدّخول إلى خادوم أوبنتو بحساب مستخدم عادي (غير المستخدم الجذر).

كيف يمكن الحصول على امتيّازات المستخدم الجذر

توجد ثلاث طرق للحصول على امتيّازات المستخدم الجذر، تختلف في مستوى صعوبتها.

1- تسجيل الدّخول بحساب المستخدم الجذر

أسهل طريقة وأكثرها مباشرة للحصول على امتيّازات root هيّ تسجيل الدّخول بدْءًا بحساب المستخدم الجذر. يكون تسجيل الدّخول عن بعد عبر SSH على النّحو التّالي:

ssh root@your_IP_address_or_domain

حيث your_IP_address_or_domain يمثّل عنوان IP العموميّ للخادوم أو نطاق الموقع. سيُطلب منك إدخال كلمة السّر قبل الولوج.

2- الانتقال إلى حساب المستخدم الجذر عن طريق “su”

لا يُنصَح بتسجيل الدّخول إلى الخادوم بحساب المستخدم الجذر؛ إذ قد يؤدّي ذلك إلى استخدام مُدير النّظام (root) في مهامّ غير إداريّة، وهو أمر خطير أمنيًّا. الطّريقة الثّانيّة تسمح بالحصول على امتيّازات المستخدم الجذر في أيّ وقت، حال الحاجة إليها. يؤدّي أمر su، وهو اختصار لsubstitute user (أي “غيّر المستخدم”)، هذه المهمّة:

su

سيُطلب منك إدخال كلمة سرّ حساب المستخدم الجذر، ثمّ تنتقل بعدها إلى جلسة Shell خاصّة بالمستخدم الأعلى. للخروج من جلسة المستخدم الجذر، بعد الانتهاء من أداء المهامّ الّتي تتطلّب امتيّازات إداريّة، نفّذ الأمر التّالي:

exit

3- استخدام “Sudo” لتنفيذ الأوامر بحساب المستخدم الجذر

الطّريقة الأخيرة، والأكثر تعقيدًا للحصول على امتيّازات root هيّ استخدام أمر sudo. يسمح أمر sudo بتنفيذ أمر واحد بامتيّازات root، دون الحاجة لإنشاء جلسة Shell جديدة. تُنفَّذ الأوامر على النّحو التّالي (تُمثِّل command_to_execute الأمر المُراد تنفيذه بامتيّازات المستخدم الجذر):

sudo command_to_execute

على عكس su، يطلب أمر sudo كلمة سرّ المستخدِم الّذي يُنفّذ الأمر وليس كلمة سرّ حساب المستخدِم الجذر.

لا يعمل أمر sudo افتراضيًّا، نظرًا لتداعيّاته الأمنيّة، ويجب أن يُضبَط قبل أن يؤدّي وظائفه. إذا كنت تابعت خطوات درس الإعداد الابتدائي لخادوم أوبنتو فقد أكملت الإعدادات الأساسيّة لضبط مستخدم بامتيّازات الجذر.

سنناقش في الفقرة التّاليّة كيفيّة ضبط الإعداد بتفصيل أكثر.

ماهو Visudo؟

يُضبَط أمر sudo عبر ملفّ يُتَوَّصل إليه عبر المسار etc/sudoers/.

ملحوظة: لاتحرّر أبدًا هذا الملفّ بمحرّر نصوص عاديّ. استخدِم دائمًا أمر visudo لهذا الغرض.

من المهمّ جدًّا استخدام أمر sudo لتحرير ملفّ sudoers، إذ يمكن أن يؤدّي استعمال صيغة خاطئة في هذا الملفّ إلى جعل نظام التشغيل في وضع لا يصحّ معه الحصول على امتيّازات إداريّة.

يعرض أمر visudo محرّر نصوص شبيهًا بالمحرّرات العاديّة، ولكنّه يُضيف آليّة للتحقّق من صيغة التّعليمات الموجودة في الملفّ؛ تعمل عند محاولة الحفظ. تحول هذه الآليّة دون وجود أخطاء تمنع عمليّات sudo.

ملحوظة: استخدِم الزرّيْن CTRL وO معًا لحفظ الملفّ ثمّ Enter للتّأكيد. للخروج اضغط زرّيْ CTRL وX.

تاريخيًَا، كان أمر visudo يفتح ملفّ etc/sudoers/ في محرّر vi للنّصوص (اسم الأمر visudo هو مزيج من vi وsudo)، إلّا أنّه في أوبنتو مُعَدّ لاستخدام محرّر nano. في حال أردت العودة لاستخدام vi لتحرير ملفّ sudoers فالأمر التّالي يؤدّي هذه المهمّة

sudo update-alternatives --config editor

مثال على النّتيجة:

There are 3 choices for the alternative editor (providing /usr/bin/editor).
    
      Selection    Path                Priority   Status
    ------------------------------------------------------------
    * 0            /bin/nano            40        auto mode
      1            /bin/nano            40        manual mode
      2            /usr/bin/vim.basic   30        manual mode
      3            /usr/bin/vim.tiny    10        manual mode

اختر العدد الموافق للمحرّر الّذي تريد اختيّاره.

على CentOS، يمكن تغيير هذه القيمة بالتّعديل على السّطر التّالي، الموجود في ملفّ bashrc./~ (تمثّل /path/to/editor المسار إلى المحرّر المطلوب):

export EDITOR=/path/to/editor

لأخذ التّغييرات في الحسبان، نفِّذ الأمر:

~/.bashrc

نفّذ الأمر التّالي، بعد الانتهاء من ضبط visudo، للوصول إلى ملفّ etc/sudoers/:

sudo visudo

كيف تحرّر ملفّ Sudoers

سيظهر - بعد تنفيذ أمر visudo - ملفّ sudoers في محرّر النّصوص.

أدناه ملفّ sudoers في أوبنتو 14.04 بعد حذف التّعليقات (يتضمّن الإعدادات الّتي ضبطناها في درس كيف تُضيف أو تحذف المستخدمين على خادوم أوبنتو 14.04).

في CentOS يحوي الملفّ أسطرًا أكثر؛ لن نناقشَها كلَّها في هذا الدّليل.

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

root    ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

فلنلقِ نظرة على عمل هذه الأسطر.

1- أسطر Defaults

السّطر الأوّل Defaults env_reset يُعيد تعيين بيئة عمل الطّرفيّة من أجل حذف المتغيّرات الخاصّة بالمستخدمين من بيئة العمل. هذا الإجراء احترازيّ لمسح متغيّرات قد تكون مضرّة من جلسة sudo، Sudo session. تعليمة Defaults mail_badpass تطلب إرسال بريد إلى عنوان إلكتروني تُحدّده تعليمة أخرى (mailto) عندما يُدخل مستخدم كلمة سرّ خاطئة أثناء تنفيذ أمر sudo. هذه التّعليمة مُعطَّلة افتراضيًّا. أمّا التّعليمة الّتي تبدأ ب =Defaults secure_path فتحدّد المسارات Paths الآمنة الّتي سيُبحَث فيها عن أمر sudo. يحول هذا الإجراء دون استخدام مسارات قد تحوي برامج ضارّة.

2- أسطر امتيّازات المستخدم

يتعلّق السّطر الرّابع بالامتيّازات الّتي ينالها المستخدم عند تنفيذه أمر sudo.

root  ALL=(ALL:ALL) ALL

يُشير الحقل الأوّل من السّطر إلى المستخدِم الّذي تنطبق عليه التّعليمة (المستخدِم الجذر في هذه الحالة).

  • قيمة الحقل التّالي (ALL) تُشير إلى أنّ القاعدة تُطبَّق على جميع المستضيفات Hosts.
  • الحقل الثّالث يُعيّن المستخدمين الّذين يُمكن للمستخدم المحدّد في الحقل الأوّل من السّطر (root في هذه الحالة) تنفيذُ أوامر بامتيّازاتهم. قيمة ALL تعني “كلّ المستخدمين”.
  • الحقل الرّابع يُعيّن مجموعات المستخدمين Groups الّتي يُمكن للمستخدم المحدّد في الحقل الأوّل من السّطر (root في هذه الحالة) تنفيذُ أوامر بامتيّازاتهم. قيمة ALL هنا تعني “كلّ المجموعات”.
  • الحقل الأخير يُشير إلى الأوامر الّتي ينال المستخدم المحدّد في الحقل الأوّل من السّطر امتيّاز تنفيذها بامتيّازات إداريّة. قيمة ALL هنا تعني “جميع الأوامر”.

يُمكن تفسير السّطر على النّحو التّالي: لدى المستخدم root امتيّاز تنفيذ sudo على أي أمر بشرط تقديمه لكلمته للسّر.

3- أسطر امتيّازات مجموعات المستخدمين

يُشبه السّطران الأخيران سطرَ امتيّازات المستخدِم، لكنّها تحدّد امتيّازات مجموعة من المستخدمين. تُشير الكلمات الّتي تسبقها علامة % إلى أسماء مجموعات مستخدمين. نلاحِظ أن مجموعة المستخدمين admin يُمكنها تنفيذ أيّ أمر بامتيّازات أي مستخدم على جميع المستضيفات؛ أمّا مجموعة admin فلديها، زيّادةً على امتيّازات مجموعة admin، إمكانيّة تنفيذ أوامر بامتيّازات أي مجموعة مستخدمين.

كيف تضبُط قواعد مخصَّصة

نتناول، بعد التّعرف على الصّيغة العامة لقواعد ملفّ sudoers، في هذه الفقرة طريقة إنشاء قواعد جديدة.

1- كيف تُنشئ كِنى Aliases

يُمكن تنظيم ملفّ sudoers عن طريق تجميع بعض التّعليمات بواسطة كِنى مختلفة. يُنشئ المثال التّالي ثلاث مجموعات مستخدمين (تعليمة User_Alias)، بعضويّات متداخلة:

User_Alias      GROUPONE = abby, brent, carl
User_Alias      GROUPTWO = brent, doris, eric, 
User_Alias      GROUPTHREE = doris, felicia, grant

يجب أن يبدأ اسم المجموعة بحرف كبير Capital letter.

يُمكننا الآن إنشاء قاعدة في ملفّ sudoers تسمح لأعضاء المجموعة GROUPTWO تحديث قاعدة بيانات apt-get :

GROUPTWO    ALL = /usr/bin/apt-get update

إن لم نُحدّد مستخدمًا أو مجموعة مستخدمين يُنفّذ بامتيّازاتها الأمر، فإن sudo تأخذ المستخدم الجذر root لتنفيذ الأوامر باسمه.

في المثال أدناه نمنح أعضاء GROUPTHREE صلاحيّة إيقاف وإعادة تشغيل الجهاز؛ عبر إنشاء “كنية أوامر” Command alias (تعليمة Cmnd_Alias) واستخدامها في قاعدة للمجموعة GROUPTHREE:

Cmnd_Alias      POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE  ALL = POWER

أنشأنا في السّطر الأوّل كنية باسم POWER تحوي أوامر لإيقاف وإعادة تشغيل الجهاز. ثمّ نعطي لأعضاء المجموعة GROUPTHREE امتيّاز تنفيذ هذه الأوامر.

توجد أيضًا إمكانيّة إنشاء كنية بأسماء مستخدمين لتنفيذ الأوامر بامتيّازاتهم (Runas_Alias)، ثمّ إبدال جزء القاعدة الّذي يحدّد المستخدم الّذي لديه صلاحيّة تنفيذ الأمر بكنية أسماء المستخدمين.

Runas_Alias     WEB = www-data, apache
GROUPONE    ALL = (WEB) ALL

في المثال السّابق، أنشأنا كنية WEB لتنفيذ أوامر بامتيّازات www-data أو apache؛ ثمّ قاعدة تسمح لكلّ عضو في GROUPONE بتنفيذ أوامر بامتيّازات العضوَيْن المذكورَيْن.

يجب الانتباه إلى أنّه في حال وجود تناقض بين قاعدتَيْن في ملفّ sudoers فإنّ القاعدة الأخيرة هيّ الّتي ستُطبَّق.

2- كيف تؤمِّن القواعد

توجد طرُق عدّة لتمكين تحكّم أكبر حول كيفيّة تفاعل sudo مع المستخدم.

إذا أردنا مثلًا السّماح للمستخدمين بتنفيذ أمر updatedb، وهو أمر آمِن نسبيًّا، بامتيّازات المستخدم الجذر دون الحاجة لإدخال كلمة سرّ root فالقاعدة التّاليّة تؤدّي هذه المهمّة:

GROUPONE    ALL = NOPASSWD: /usr/bin/updatedb

يظهر في القاعدة أعلاه وسم tag هو NOPASSWD والّذي يعني أنّه لن يُطلَب من المستخدم إدخال كلمة سرّ root. يوجد وسم آخر مصاحِب هو PASSWD (سلوك افتراضيّ) والّذي يطلُب إدخال كلمة السّر. ينطبق الوسم على بقيّة القاعدة ما لم يُذكر توءَمُه بعده. يُمكِن أن نجد قاعدةً على الشّكل التّالي مثلًا:

GROUPTWO    ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill

يوجد وسم آخر مهمّ هو NOEXEC والّذي يُستخدم لمنع السّلوك غير الآمن لبعض البرامج. على سبيل المثال؛ تسمح بعض البرامج، مثل less، بتنفيذ أوامر أخرى داخل واجهتها:

less file

حيثُ file اسم ملفّ يُنفَّذ عليه أمر less. الآن يُمكن تنفيذ أمر بنفس الصّلاحيّات الّتي نفّذنا بها less على النّحو التّالي (حيثُ command_to_run اسم أمر):

!command_to_run

لمنع هذا الأمر من الحصول، يُمكن كتابة قاعدة كالتّالية:

username    ALL = NOEXEC: /usr/bin/less

معلومات متفرّقة

نعرض في هذه الفقرة لمعلومات إضافيّة مفيدة عند التّعامل مع أمر sudo.

إذا حدّدت مستخدمين، أو مجموعة مستخدمين، لتنفيذ أوامر بامتيّازاتهم عبر تعليمة Runas_Alias في ملفّ الإعداد؛ فيُمكنك تنفيذ أوامر بامتيّازات هؤلاء المستخدمين عن طريق خيّار u- أو g- على التّوالي:

sudo -u run_as_user command
sudo -g run_as_group command

حيثُ run_as_user وrun_as_group اسم المستخدم أو مجموعة المستخدمين على التّوالي، و command الأمر المُراد تنفيذه.

يحفظ أمر sudo بعد استخدامه تفاصيلَ الاستيثاق Authentication (كلمة السّرّ) في الطّرفيّة الّتي نُفِّذ فيها لفترة من الوقت. يعني هذا أنّك لن تحتاج لإعادة كتابة كلمة السّرّ في كلّ مرّة تستخدم فيها sudo، ما لم تنقضِ فترة الحفظ. إن أردت تصفير المؤقّت، لأغراض أمنيّة مثلًا، نفّذ الأمر التّالي:

sudo -k

إذا رغبت في معرفة الامتيّازات المُعيَّنة للحساب الّذي تستخدمه فخيّار l- يعطيك هذه المعلومة:

sudo -l

سيعرض الأمر قائمة بالقواعد الّتي تعني حساب المستخدم ضمن ملفّ etc/sudoers/، وهو ما يُعطي فكرة جيّدة عن المسموح وغير المسموح به لمستخدم عند تنفيذ sudo.

يحدُث أن تنسى كتابة sudo أمام أمر تريد تنفيذه بامتيّازات إداريّة، ممّا يؤدّي إلى فشل الأمر. يوجد الاختصار التّالي لتفادي كتابة الأمر مجدّدًا:

sudo !!

علامة التّعجّب مرّتين تعني “أعد تنفيذ الأمر الأخير”، وبما أنّها مسبوقة ب sudo فالأمر يُصبح “أعد تنفيذ الأمر الأخير بامتيّازات إداريّة”.

إذا كنت تتمتّع بحسّ الفكاهة فيُمكنك إضافة تعليمة Defaults insults إلى ملفّ sudoers؛ عمل هذه التّعليمة يتلخّص في كتابة تقريع (بالإنجليزيّة) عندما يُخطئ المستخدم في كلمة السرّ عند تنفيذ أوامر بsudo:

sudo visudo

أضف التّعليمة التّاليّة بعد تعليمات Defaults الأخرى:

Defaults    insults

لتجربة الإعداد الأخير، نمسح كلمة السّرّ المحفوظة حتّى نتأكّد من أنّ sudo سيطلُب إدخال كلمة السّرّ:

sudo -k

ثمّ ننفّذ الأمر التّالي، ونكتب كلمة سرّ خاطئة في المرّة الأولى:

sudo ls

مثال على النّتيجة:

[sudo] password for demo:    # أدخِل  كلمة سرّ خاطئة
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo: 
My mind is going. I can feel it.

خاتمة

يجب أن يكون لديك بعد إكمال هذا الدّرس فهمٌ جيّد لأساسيّات التّعامل مع ملفّ sudoers وطريقة قراءة وتعديل هذا الملفّ؛ إضافةً إلى معرفة طُرُق الحصول على امتيّازات إداريّة. تذكّر أنّه يوجد سبب لعدم منح امتيّازات المستخدم الأعلى للمستخدمين العاديّين؛ لذا من المهمّ جدًّا فهم آليّة عمل أيّ أمر قبل تنفيذه بامتيّازات root. لا تستهِر في التّعامل مع الصّلاحيّات الإداريّة، وتعلّم أفضل الطّرق لاستخدام هذه الأدوات لتلبيّة حاجاتك. احظُر أي ميزة لا ترى حاجة لاستخدامها.

ترجمة بتصرّف لمقال How To Edit the Sudoers File on Ubuntu and CentOS لصاحبه Justin Ellingwood.


تفاعل الأعضاء

أفضل التعليقات



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...