docs:pam

~~ODT~~

مواثقة المستخدمين

تشرح هذه المقالة كيف تخزن معلومات المستخدمين والمجموعات وكيف يتم مواثقة المستخدمين في نظام لينكس (عبر وحدات المواثقة المدمجة Pluggable Authentication Modules وتختصر PAM) وكيف تعمل على تأمين المواثقة في النظام.

مقدمة

كيف تخزن معلومات المستخدمين

ملف ‪/etc/passwd‬

تقريبا على جميع توزيعات لنوكس ( والتجارية أيضا مثل يونكس) ، تخزن معلومات عن المستخدم فى /etc/passwd, ، وهو الملف النص الذي يحتوي على حساب المستخدم لتسجيل الدخول ، كلمة السر مشفره ، رقم كود المستخدم (يسمى رمز المستخدم) فريد من نوعه (لا يمكن استخدامه من قبل مستخدم اخر) ، عدديه رقم تعريف المجموعة (تسمى رمز المجموعة) ، حقل اختياري التعليق والملاحظات (وعادة ما تحتوي على بنود مثل الاسم الحقيقي ، رقم الهاتف ، الخ) ، الصفحه الرئيسية مثل (home/john/)، واجهة الدخول التي يفضلونها(text mode).

نموذج لما سبق فى /etc/passwd تبدو كهذا :

pete:K3xcO1Qnx8LFN:1000:1000:Peter Hernberg,,,1-800-FOOBAR:/home/pete:/bin/bash

وكما ترون ، انها ببساطة خطية ولا تحوي فراغ . ويتضمن كل ادخال ستة خانات او حقول الوارد وصفها اعلاه ، مع فصل بينها بواسطة (:). واذا كان هذا يعتبر معقد كما التوثيق للمستخدم ، لن تكون هناك حاجة لهذا الشرح.

كلمات سر الظل

بالنظر في /etc/passwd ، فانه من المحتمل ان تشاهد شيئا كهذا :

pete:x:1000:1000:Peter Hernberg,,,1-800-FOOBAR:/home/pete:/bin/bash

اين ذهبت كلمة السر المشفره؟ قبل ان اقول لكم اين ذهبت ، اعتقد انه يتطلب قليلا من التوضيح.

الملف/etc/passwd ، الذي يتضمن معلومات عن جميع المستخدمين ، بما فيها كلمة السر مشفره ، يمكن قراءته من قبل جميع المستخدمين ، مما يجعل من الممكن لاي مستخدم الحصول على كلمة سر مشفره للجميع على النظام. ورغم ان كلمات السر هي مشفره بالاصل، الا ان برامج كسر كلمات السر متاحة على نطاق واسع. لتفادي هذا التهديد الامني المتزايد ، طور ملف الظل ليحوي كلمات السر.

وعند تشغيل نظام الظل ،فأن كلمة السر فى ملف /etc/passwd يستعاض عنها بالحرف “X” و كلمة السر الحقيقية للمستخدم يتم تخزينها مشفره فىملف /etc/shadow.. لان /etc/shadow. لا يمكن قراءته الا من قبل المستخدم الجذر (root،) اي مستخدم ماكر لا يستطيع كسر كلمات السر للمستخدمين الاخرين . في كل حقل (سطر) في /etc/shadow تتضمن اسم المستخدم ، كلمة السر مشفره ، وعدد من المجالات المتعلقة بانتهاء صلاحية كلمة السر. حقل نموذجي يشبه هذا :

pete:/3GJllg1o4152:11009:0:99999:7:::

ملفي ‪/etc/group‬ و ‪/etc/gshadow‬

مجموعة المعلومات التي يتم حفظها في /etc/group. الشكل مماثل لملف /etc/passwd, ، مع المدخلات التي تحتوي على حقول لاسم المجموعة ، كلمة السر ، رقم تعريف رقمية (رمز المجموعة) ، قائمة المجموعات تفصلها فاصلة . اي حقل (سطر) /etc/group سيبدو هكذا :

pasta:x:103:spagetti,fettucini,linguine,vermicelli

وكما ترون من “x” فى كلمة السر ،في حقل كلمة السر للمجموعة يمكن ان تكون كذلك. كما وان معظم المجموعات تقريبا ليس لها كلمات سر خاصة بها ، ومن الجدير بالذكر ان المعلومات الخاصة بكلمة السر للمجموعات تخزن فى /etc/gshadow.

كلمات السر المشفرة MD5

تقليديا ، كانت كلمات السر في يونيكس مشفره مع crypt() function القياسية. (لمزيد من المعلومات عن crypt() function القياسية ، انظر crypt(3) manpage.) وكما تطورت الحواسيب واصبحت سريعة، كلما اصبح كسر كلمات السر المشفره بهذه الطريقة اسهل. وكما وفرت شبكة الانترنت ، الأدوات المهمة لكسر كلمات السر - عبر عدة مواقع استضافه. كثير من احدث التوزيعات توزع مع خيار تشفير كلمات السر مع خوارزميه MD5 hash اقوى. (لمزيد من المعلومات حول الخوارزميه MD5 hash ، انظر RFC 1321). في حين كلمات السر بواسطة MD5 لن تزيل خطر كسر كلمة السر ، فانها سوف تجعل كسر كلمات السر اكثر صعوبة.

التخبط في الفوضى

وكما ترون ، هناك عدد من الطرق المختلفة لتحقق من معلومات المستخدم التي يمكن تخزينها على جهازك (كلمات سر الظل دون تشفيرmd5ـ ، /etc/passwd مع تشفيرmd5 ، الخ). كيف يمكن لبرامج مثل login و su معرفة كيفية التحقق من كلمة السر؟ والاسوأ من ذلك ، ما اذا كنت تريد تغيير الطريقة التي يتم تخزين كلمات السر على جهازك؟ كيف للبرامج التي بحاجة الى كلمة السر ان نعلم ان كلمات السر يتم تخزينها بشكل مختلف؟ PAM هو الحل.

وحدات المواثقة المدمجة Pluggable Authentication Modules

تعتبر PAM لب نظام المواثقة في أي توزيعة لينكس حديثة

لماذا ؟

بالعودة الى بدايات لينكس ، اذا كان احد البرامج ، مثل su ، passwd ، login، او xlock ، في حاجة الى توثيق المستخدم ، فانه ببساطة يقوم بقراءة المعلومات الضروريه من /etc/passwd .اما اذا كان يحتاج الى تغيير كلمة المرور للمستخدمين ، فإنه ببساطة يقوم بتحرير /etc/passwd. هذه طريقة بسيطة ولكن ضعيفة من حيث الامان والسيطرة بحيث ادت الى العديد من المشاكل لمديري النظام والتطبيقات. كما وان md5 و shadow passwords أصبحت متزايدة الشعبية ، فكل برنامج يحتاج الى توثيق المستخدم قد يتطلب معرفة كيفية الحصول على المعلومات الصحيحه عند التعامل مع عدد مختلف من نظم التوثيق والتحقق للمستخدم . كما وان اذا كنت تريد ان تغير نظام توثيق المستخدم الخاص بك ، فأن كل هذه البرامج كان لا بد من اعادة تجميع (recompiled) . PAM يزيل هذه الفوضى من خلال تمكين البرامج التحقق من المستخدمين بشفافيه ومرونة ، بغض النظر عن الكيفيه التي يتم تخزين معلومات عن المستخدم.

نقلا عن دليل نظام لينوكس-PAM : “ان الغرض من مشروع لينكس-PAM هو الفصل بين منح امتياز تطوير البرمجيات من تطوير خطط التوثيق آمنة وملائمة. ويتم ذلك عن طريق توفير مكتبات وظائف في حال ان التطبيق يمكن ان يستخدمه للتوثق من المستخدم ”. مع PAM ، ولا يهم ما اذا كانت كلمة السر الخاصة بك مخزنه فى /etc/passwd او على خادم في هونغ كونغ. عندما يحتاج برنامج لتوثيق المستخدم ، PAM يوفر المكتبه التي تحتوي على مهام التوثيق السليم . لأن هذه المكتبه تحمل بشكل ديناميكي ، وتغيير خطط التوثيق ويمكن أن يتم ببساطة بتحرير ملف التهيءه.

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

ملفات اعدادات PAM

يتم تخزين ملفات الاعدادات فى المجلد /etc/pam.d/.. وبالقاء نظرة سريعة على المجلد قد نجد التالي بالزيادة او النقصان حسب التوزيعة المستخدمة

~$ cd /etc/pam.d
/etc/pam.d/$ ls
  chfn	chsh	login	other	passwd	su	xlock    sshd 
/etc/pam.d/$

لنلقي نظر على تركيبة اعدادات PAM ولناخذ الملف login على سبيل المثال

/etc/pam.d/$ cat login
  # PAM configuration for login
  auth       requisite  pam_securetty.so
  auth       required   pam_nologin.so
  auth       required   pam_env.so
  auth       required   pam_unix.so nulok
  account    required   pam_unix.so
  session    required   pam_unix.so
  session    optional   pam_lastlog.so
  password   required   pam_unix.so nullok obscure min=4 max=8

صيغة الاعدادات

اعدادات ملفات PAM تأخذ الشكل التالي

type  control  module-path  module-arguments

بالعودة الى المثال السابق فتحنا ملف التوثيق التابع للامر login فان التركيبة للملف تكون على النحو التالي

  • type: يحدد ما هو نوع التوثيق لاستخدامها لهذه الوحدة. كما وان وحدات من نفس النوع يمكن وضعها في رزم ، والتي تحتاج الى توثيقات متعددة للمستخدم .وهذه تقسم الى اربعة انواع :
    • account يقرر ما اذا كان يسمح للمستخدم الوصول الى الخدمة ، وفي ما اذا كانت كلمات السر قد انتهت صلاحيتها ، الخ.
    • auth تحديد ما اذا كان المستخدم هو نفسه الذي يدعي ان يكون ام لا ، عادة عن طريق كلمة سر ، ولكن ربما أكثر وذلك باستخدام وسائل معقدة ، مثل biometrics .ا
    • Password يوفر آلية للمستخدم كلمة السر.
    • session من الاشياء التي ينبغي القيام به قبل و / أو بعدالتحقق من المستخدم, وهذا قد يتضمن اشياء مثل mounting/unmounting المجلد الرئيسي للمستخدم ، تسجيل حالاات الدخول والخروج ،اتاحة أو تقييد الخدمات المتاحة للمستخدم.

في ملف إعداد الولوج login، نحن نرى نوع واحد على الاقل لكل نوع من انواع الدخول. وبما ان هذا البرنامج الذي يتيح للمستخدم تسجيل الدخول، فإنه من المفهوم انه بحاجة الى الحصول على جميع انواع التوثيق المختلفة انفة الذكر.

  • control (التحكم): يحدد ما ينبغي القيام به في التوثيق في حال فشل هذا النموذج. تقسم الى اربعة انواع :
    • requisite ( أساسي, ضروري)عدم التصديق على النتائج عن طريق هذا النموذج ينتهي بنفي فوري للتوثيق.
    • required ( مطلوب) فشل في نتائج التوثيق يؤدي ايضا على رفض التوثيق ، ولكن PAM وعلى الرغم من النتائج الاولية فانه سيكمل تفحص كل النماذج الأخرى المدرجه لهذه الخدمة قبل رفض التوثيق.
    • sufficient (كافي)اذا كان التوثيق من خلال هذا النموذج هو النجاح ، يتم منح النجاح التوثيق ، حتى وان فشل نموذج (required ) في السابق .
    • optional (اختياري)ما اذا كان هذا النموذج قد نجح او فشل فهو الوحيد الذي يعتد به ، اذا كان هو النموذج الوحيد من نوعه لهذه الخدمة.

في ملف الاعدادات لتسجيل الدخول login ، نرى ما يقرب من جميع مختلف أنواع الرقابة. معظم النماذج المطلوبة pam_unix.so (الوحدة الرئيسية التوثيق) ، والوحدة المطلوبة requisite الوحيدة هي pam_securetty.so (التفحص للتأكد من ان المستخدم يستخدم او يعمل على console امنه (، والنموذج الاختياري الوحيد هو pam_lastlogin.so (الوحدة التي تسترجع معلومات عن احدث دخول للمستخدم).

  • module-path: يحدد اي وحدة تستخدام و (اختياريا) أين تجدها. معظم الاعدادات تحتوي فقط على اسم الوحدة ، كما هو الحال في ملف التسجيل login المذكور سابقا. عندما يكون هذا هو الحال ، PAM يقوم بالبحث عن الوحدات في المجلد الافتراضي ، عادة يكون /usr/lib/security. ومع ذلك ، لو كان لديك توزيعة لينكس مطابقة لنظام ملفات لينكس القياسيه ، فان وحدات PAM يمكن العثور عليها فى /lib/security.
  • module-arguments: هي الخيارات التي تمرر الى الوحدة لتدقيقها, فكل وحدة لها خياراتها الخاصة . فمثلا في ملف الاعدادات login يمكننا ان نمرر الخيار “nulok” ( “null ok”, يمرر هذا الخيار الى pam_unix.so للدلالة على ان كلمة السر الفارغة مقبولة

أمثلة على ملفات الإعدادات

امثلة على استخدام PAM

مثال 1

حصر المستخدم بامكانية دخولة النظام باوقات معينة

سأطرح موضوع وهو كيفيه حصر المستخدم بامكانية دخولة النظام فقط بساعات وايام العمل الرسمية ومنعة من استخدامه في غير ذلك كايام العطل وبعد الدوام والعطلة الاسبوعية لهذا سنتكلم عن ملفين للتحكم بهذه الخاصية

/etc/security/time.conf
/etc/pam.d/login

لذلك نحتاج ان نغير في الملف /etc/pam.d/login وذلك باضافة pam_time.so

كالتالي

account          required             /lib/security/pam_time.so

وكذلك تغير الملف /etc/security/time.conf

على سبيل المثال في هذا المثال هناك خدمتان وهما امكانة الدخول للنظام (login) والمحطة الطرفية التي ينطبق عليها هذا الشرط ليتمكن المستخدم من استعمالها للدخول الى النظام (ttyp*)وهي في المثال كل المحطات الطرفية.في المثال التالي كل المستخدمين باستثناء المستخدم user1 بامكانهم الدخول الى النظام من اي محطة طرفية في خلال كل الايام من الساعة 9 صباحا الى الساعة 6والنصف مساءا

login;tty*;!user1;Al0900-1830

مثال اخر فقط المستخدم ستيف بامكانة الدخول خلال ايام العطل من الساعة 7 صباحا وحتى الساعة 5 مساءا

login;*;steve;Wk0700-1700

مثال اخر المستخدم بيبلو والمستخدم فرودو بامكانهم الدخول للنظام مابين الساعة 8 صباحا والساعة 5 مساءا ماعدا يوم الاحد

login;*;bilbo|frodo;AlSu0800-1700

صيغة الجملة كالتالي

services;ttys;users;times

التعابير المنطقية &|! تطبق على user و terminal و time بحيث تاتي اشارة ! قبل المستخدم والمحطة الطرفية والوقت لدلالة على الا ستثناء وتأتي اشارة & و | للدلالة على و , او services وهي قائمة الخدمات التي يمكن ان تطبق عليها القواعد والشروط ttys قائمة المحطات الطرفية التي تنطبق عليه الاحكام والشروط من قبل PAM users قائمة المستخدمين الذين تطبق عليهم الاحكام والشروط times الوقت : وهو قائمة الايام والفترة التي ينطبق بها احكام وشروط PAMبحيث ان اليوم يرمز له بحرفين مثلا MoTuSa يرمز ليوم الاثنين والثلاثاء والسبت لاحظ ان تكرار اسم اليوم كالتالي MoMo تعني باستثناء يوم الاثنين مثال اخر MoWk تعني كل ايام الاسبوع باستثناء الاثنين لانة تكرر بذكرة مباشرة وانة ضمن كل ايام الاسبوع فبهذا تم استثناءة الحروف التي ترمز للايام هي

Mo:Monday
Tu: Thursday
We: Wednesday
Th: Thursday
Fr: Friday
Sa: Saturday
Su: Sunday
Wk: week days without week end
Wd: week end
Al: all 7 days

مدى الوقت ويقسم الى خانتين تفصلهنا اشارة (-) كل جزء يتكون من توقيت 24 ساعة بصورة HHMM بحيث ان الجزء الاول يرمز للبداية والجزء الاخر يرمز للنهاية ملاحظة هذا المثال لا يغطي كل استخدامات PAM ولكنة فقط يتحدث عن تحديد الوقت لدخول المستخدم الى النظام بشكل مختصر

مثال 2

كيف نستخد PAM للتحكم بالخدمات

خلال عملي واجهني تحدي كيف امنع المستخدم رووت من الدخول على النظام مباشرة من خلال خدمة SSH

تحت /etc/pam.d هناك ملفات ترتبط باي خدمة (service ) او امر ما موجود على النظام مثل sudo, login, sshd كما في المشاركة السابقة تحدثنا عن login لذ في هذه الحالة سنفتح ملف /etc/pam.d/sshd كل مافي الامر هو اضافة السطر التالي في بداية الملف

auth       required     pam_listfile.so item=user sense=allow file=/etc/sshd/sshd.allow onerr=fail

هذا السطر يقوم بالتدقيق على الاسم المستخدم من خلال الخدمة ssh (ﻻحظ ان الملف اسمه sshd لذا فهو يرتبط بالخدمة مباشرة) فاذا كان ضمن المستخدمين المصرح لهم بهذه الخدمة والمذكورين في ملف /etc/sshd/sshd.allow فانة يستجيب لطلبه ويفتح له الخدمة

ﻻحظ استخدمنا شرط التدقيق required اي ان تحقيق هذا الشرط ﻻ بد منه واﻻ فان التدقيق لن يكمل للتحقق من الشروط في السطور التالية في الملف.

في الملف sshd.allow المذكور انفا علينا ان نفتحه وندرج في كل سطر اسم المستخدمين المصرح لهم باستخدام هذه الخدمة وبما اننا نريد ان نمنع المستخدم root من استخدام هذه الخدمة فانة يترتب علينا ان ندرج اسماء المستخدين المسموح لهم بذلك فقط

onerr=fail اذا كان الملف غير موجود او هيئة الملف غير صحيحة فان العم PAM لا ولن يسمح بلاتصال

التحدي الان هو كيف اعمل العكس فلا يعقل ان نقوم بسرد جميع المستخدمين في حين اننا نريد ان نمنع مستخدم واحد او اثنين

قما قلنا سابقا لتفادي ادراج جميع اسماء المستخدمين في ملف المستخدمين المسموح لهم باستخدام خدمة معينه علينا ان ننظر الى الوضع العكسي وذلك بتشغيل PAM لمنع المستخدمين المدرجين في ملف ما لذا نقوم بعكس الية التحقق لتكون كالتالي

auth  required   pam_listfile.so item=user sense=deny file=/etc/sshd/sshd.deny onerr=succeed

غيرنا نوع التدقيق من مسموح sense=allow الى غير مسموح sense=deny انشاء ملف جديد يحوي اسماء المستخدمين الغير مسموح لهم باستخدام هذه الخدمة file=/etc/sshd/sshd.deny

onerr=succeed اذا حصل خطا ما فان العم PAM وفي جيع الحالات لن يسمح بلاتصال ويرجع رساله PAM_SUCCESSلدلالة على ان حاسة التدقيق نجحت والتي هي sense=deny

ملاحظة امر PAM واسع ومتشعب وكبير يحتاج الى متابعة ومطالعة

تم….

زياد حسين دبش 2008/06/03 14:11

نقاش

Janay, 2012/08/29 03:18

God, I feel like I shloud be takin notes! Great work

Pokey, 2012/10/06 03:54

What libetranig knowledge. Give me liberty or give me death.

Debra, 2012/12/15 22:24

The accident of finding this post has birhgtened my day

ti amostafa alrasol , 2017/02/22 11:44
بلأبى هناك شخص قام بتغير باس وورد يوم الاثنين يبدو ان اعرفه ومعاقبته فى انتهاك خاصتى
أدخل تعليقك:
 
آخر تعديل:: 23 نيسان 2015 الساعة 00:20 (تحرير خارجي)