بحث

الأحد، 16 مايو 2010

كيف نتعامل مع PAM

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

الجزء الاول : تعريف
لماذا PAM

بالعودة الى بدايات لينكس ، اذا كان احد البرامج ، مثل su ، passwd ، login، او xlock ، في حاجة الى توثيق المستخدم ، فانه ببساطة يقوم بقراءة المعلومات الضروريه من /etc/passwd .اما اذا كان يحتاج الى تغيير كلمة المرور للمستخدمين ، فإنه ببساطة يقوم بتحرير /etc/passwd. هذه طريقة بسيطة ولكن ضعيفة من حيث الامان والسيطرة بحيث ادت الى العديد من المشاكل لمديري النظام والتطبيقات. كما وان md5 و shadow passwords أصبحت متزايدة الشعبية ، فكل برنامج يحتاج الى توثيق المستخدم قد يتطلب معرفة كيفية الحصول على المعلومات الصحيحه عند التعامل مع عدد مختلف من نظم التوثيق والتحقق للمستخدم . كما وان اذا كنت تريد ان تغير نظام توثيق المستخدم الخاص بك ، فأن كل هذه البرامج كان لا بد من اعادة تجميع (recompiled) . 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 تحديد ما اذا كان المستخدم هو نفسه الذي يدعي ان يكون ام لا ، عادة عن طريق كلمة سر ، ولكن ربما أكثر وذلك باستخدام وسائل معقدة ، مثل biometrics
  • Auth يوفر آلية للمستخدم كلمة السر.
  • password من الاشياء التي ينبغي القيام به قبل و / او بعدالتحقق من المستخدم, وهذا قد يتضمن اشياء مثل mounting/unmounting المجلد الرئيسي للمستخدم ، تسجيل حالاات الدخول والخروج ،اتاحة اوتقييد الخدمات المتاحة للمستخدم.
  • session في ملف تسجيل الدخول(login) ، نحن نرى نوع واحد على الاقل لكل نوع من انواع الدخول. وبما ان هذا البرنامج الذي يتيح للمستخدم تسجيل الدخول، فإنه من المفهوم انه بحاجة الى الحصول على جميع انواع التوثيق المختلفة انفة الذكر.
    control (التحكم )

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

ما اذا كان هذا النموذج قد نجح او فشل فهو الوحيد الذي يعتد به ، اذا كان هو النموذج الوحيد من نوعه لهذه الخدمة.
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
مثال ١
سأطرح موضوع وهو كيفيه حصر المستخدم بامكانية دخولة النظام فقط بساعات وايام العمل الرسمية ومنعة من استخدامه في غير ذلك كايام العطل وبعد الدوام والعطلة الاسبوعية
لهذا سنتكلم عن ملفين للتحكم بهذه الخاصية

/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 ولكنة فقط يتحدث عن تحديد الوقت لدخول المستخدم الى النظام بشكل مختصر

مثال ٢
كيف نستخد 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 واسع ومتشعب وكبير يحتاج الى متابعة ومطالعة
تم…

ليست هناك تعليقات: