منبع اصلی نوشتار زیر در این لینک قرار دارد

Pluggable authentication module چیست

PAM مخفف Pluggable authentication module فرایند Authorization پویایی را برای برنامه های کاربردی وسرویس ها در لینوکس فراهم می کند. در بحث مهندسی امنیت و امنیت رایانه، اجازه بخشی از سیستم‌عامل می‌باشد که وظیفهٔ تخصیص منابع سیستم را به وسیلهٔ دادن دسترسی به مصرف کنندگانی که مجاز هستند از آن‌ها استفاده کنند بر عهده دارد. منابع شامل فایل‌های شخصی یا آیتم‌های دیتا، برنامه‌های کامپیوتر، ابزارهای کامپیوتر و قابلیت عملکرد فراهم شده توسط برنامه‌های کاربردی کامپیوتر می‌باشند. کاربران کامپیوتر، برنامه‌های کامپیوتر و ابزارهای دیگر روی کامپیوتر، نمونه‌هایی از مصرف کنندگان منابع هستند. (برگرفته از ویکی پدیای فارسی)برنامه هایی که اجازه دسترسی کاربران به سیستم را می دهند از احراز هویت (Authentication) به منظور بررسی هوست کاربر استفاده می کنند. با احراز هویت بررسی می شود که آیا کاربری که خود را معرفی کرده است واقعا خود کاربر است یا یک کاربر غیر مجاز و نامعتبر است. هر برنامه ای احراز هویت خودش را دارد، اما در توزیع های لینوکسی یک کتابخانه مرکزی به نام PAM برای استفاده برنامه های کاربردی و سرویس به منظور مجاز شناسی و احراز هویت به کار می رود. به طور مثال سرویس SSH می تواند از PAM به منظور احراز هویت استفاده کند و در صورتی که بیش از 3 بار ورود ناموفق داشته باشیم، دیگر اجازه دسترسی داده نشود. با PAM مدیران سیستم قادر به استفاده و اعمال سیاست های احراز هویت به صورت متمرکز برای کلیه برنامه های کاربردی و سرویس ها هستند.

فایل های پیکربندی PAM

فایل etc/pam.conf/، فایل پیکربندی برای هر یک از سرویس ها است که استفاده نمی شود و به جای آن به ازای هر سرویس، در زیر دایرکتوری etc/pam.d/ یک فایل پیکربندی برای آن سرویس وجود دارد که تنظیمات در آن قرار می گیرد. به طور مثال سرویس sshd یک فایل به نام sshd در زیر این دایرکتوری دارد.

ls /etc/pam.d

در هر کدام از فایل های مربوط به هر سرویس ماژول های PAM استفاده شده برای احراز هویت، تعریف می شوند. هر فایل شامل چندین خط که هر خط آن دارای فرمت کلی زیر است

TYPE CONTROL MODULE_PATH  MODULE_ARGS

TYPE نوع ماژول PAM مورد استفاده را نشان می دهد. هر نوع ماژول هدف خودش را دارد و به طور کلی چهار دسته ماژول PAM وجود دارد که می توان استفاده کرد. به طور مثال یک ماژول پسورد (گذرواژه) را بررسی می کند و دیگری محلی که سیستم از آن مورد دسترسی قرار گرفته است را بررسی می کند.

  • auth : درستی و اعتبار (authenticity) کاربر را بررسی می کند که به طور معمول توسط پسورد صورت می گیرد. (البته مکانیزم های دیگری برای تصدیق هویت و درستی و کاربر وجود دارد).
  • account : ماژول های مربوط به این دسته بررسی می کنند که آیا کاربر مجوز لازم برای دسترسی و استفاده از سرویس درخواستی را دارد. برای نمونه باید بررسی شود که هیچ کس نتواند با یک اکانت منقضی شده (expire) بتواند به سیستم لاگین کند.
  • password : هدف از این ماژول برای قادر ساختن به تغییر authentication token است.می توانید درباره authentication token یا security token مطلب ویکی پدیای فارسی را بخوانید.
  • session : ماژول های مربوط به این دسته مسئول پیکربندی و مدیریت جلسه های کاربر هستند. در جلسه کاری متغیرهای محیطی مربوط به کاربر مقداردهی اولیه می شوند. مانند متغیر های مربوط به دایرکتوری خانگی یا همچنین محدودیت های حساب کاربری مربوط به کاربری که لاگین کرده است.

موارد بالا چهار دسته بندی کلی از ماژول ها هستند که هر کدام ماژول های خاص خود را دارند. دومین فیلد از بالا CONTROL است که اشاره به رفتار ماژول دارد. هر ماژول می تواند رفتار های کنترلی زیر را داشته باشد.

  • required : ماژول های با این flag باید پیش از اهرا هویت، به طور موفقیت آمیز پردازش شده باشند. پس از failure در ماژول هایی با این flag،تمامی ماژول های دیگر با flag مشابه پردازش خواهند شد، پیش از اینکه کاربر پیغامی مبنی بر failure دریافت کند.
  • requisite : همانند رفتار required، ماژول هایی با این flag نیز باید پیش از احراز هویت پردازش شوند اما در این flag در صورت رخداد failure بلافاصله خطایی به کاربر اعلام شده و دیگر هیچ ماژولی پردازش نخواهد شد. توجه کنید که پردازش ماژول ها به ترتیب از اولین خط است و به ترتیب از بالا به پایین تا آخرین خط پردازش می شوند. ماژول ها با رفتار requisite در صورت بروز failure در انها، در همان نقطه پردازش خاتمه و دیگر ماژول های زیرین پردازش نمی شوند . اما در ماژول ها با required ماژول های با flag مشابه در صورت بروز failure پردازش خواهند شد.
  • sufficient : این flag کنترلی به این معنی است که اگر این خط به طور موفقیت آمیز پردازش شد، یک پیغام فوری مبنی بر موفقیت آمیز بودن احراز هویت صادر شده و دیگر ماژول های باقی مانده (ماژول های زیرین همین خط) دیگر پردازش نخواهند شد. در صورتی که failure رخ دهد به سراغ خط بعدی خواهد رفت.
  • optional : موفقیت یا عدم موفقیت مازول ها با این flag، هیچ اثر و نتیجه مستقیمی ندارند. در واقع تنها برای اعلان یک پیغام، مناسب هستند و هیچ عکس العملی را انجام نمی دهند.

 فیلد MODULE_PATH اشره با مسیر و نام ماژول می کند. البته نیازی به تعیین میر کامل ماژول نیست و آوردن نام ماژول کافی است زیرا تمامی ماژول ها در داریکتوری lib/security/ در تهای 32 بیتی و lib64/security/ در توزیع های 64 بیتی ذخیره شده اند. MODULE_ARGS آرگومان اختیاری است که به ماژول پاس داده می شود. گاهی لازم است که ماژول بداند چه عملی را در صورت موفقیت انجام دهد.

مثال نخست از تنظیم PAM

هر خط آن شامل یک نوع ماژول به همراه رفتار و نام ماژول است. آرگومان MODULE-ARGS نیز اختیاری است.

OUTPUT

auth      required  pam_securetty.so

auth      required  pam_unix.so shadow nullok

auth      required  pam_nologin.so

account   required  pam_unix.so

password  required  pam_cracklib.so retry=3

password  required  pam_unix.so shadow nullok use_authtok

session   required  pam_unix.so

در خروجی بالا، خطوط نخست، دوم و سوم برای احراز هویت ورود به سیستم استفاده شده است. توجه کنید که هر سه خط از دسته auth و از نوع flag کنترلی required هستند. نام ماژول خط نخست، pam_securetty.so، نام ماژول خط دوم pam_unix.so است که دو آرگومان به آن پاس داده شده است و هر آرگومان ها با فاصله از نام ماژول و یکدیگر جدا شده اند. نام ماژول خط سوم pam_nologin.so است.

ماژول pam_securetty.so اطمینان حاصل می کند که اگر شخصی می خواهد به عنوان root به سیستم وارد شود، به یکی از ترمینال های موجود در فایل etc/securetty/ وارد شود (این در صورتی است که این فایل وجود داشته باشد). می توانید از اینجا بیشتر درباره ماژول pam_securetty.so بخوانید.

ماژول pam_unix.so اعلانی را برای وارد کردن پسورد از سمت کاربر نشان می دهد و سپس پسورد را با طلاعات ذخیره شده در فایل های etc/passwd/  و etc/shadow/ بررسی می کند. فایل passwd نام کاربری را در خود دارد و در دمین فیلد هر خط یک اشاره گر به خطی از فایل shadow است. به عبارتی در فیلد نخست هر خط از فایل passwd نام کاربری و در دمین فیلد هم یک x وجود دارد که به خطی مشابه با نام کاربری در فایل shadow اشاره می کند که پسورد رمز شده را در خود دارد. می توانید از اینجا بیشتر درباره ماژول pam_unix.so بخوانید. می بینید که دو آرگومان nullok و shadow با یک فاصله از هم و از نام ماژول به ماژول پاس داده شده اند. آرگومان nullok برای ورود پسورد های خالی استفاده می شود.

ماژول pam_nologin.so در خطوط بالا آخرین گام احراز هویت است و بررسی می کند که آیا فایل etc/nologin/ وجود دارد یا نه و در صورت وجود فایل و root نبودن کاربری (کاربری غیر از root) که برای ورود تلاش می کند، احراز هویت fail می شود. یعنی از ورود کاربران غیر root جلوگیری می کند. می توانید از اینجا بیشتر درباره pam_nologin.so بخوانید.

سه دسته (سه خط) auth بالا همگی بررسی می شوند حتی اگر نخستین خط fail شود و این به خاطر ماهست رفتار required است و به دلیل ماهیت required کاربر در هیچ گامی در صورتی که failure رخ دهد مطلع نخواهد شد (همان تفاوت با requisite که یک اعلان بلافاصله نشان داده می شد)

خط چهارم از دسته account و از ماژول pam_unix.so برای تصدیق و تایید حساب کاربری استفاده شده است. در خط دوم ماژول pam_unix.so و آرگومان های پاس داده شده به آن پسورد ورودی را بررسی کرد، اما در این خط ماژول pam_unix.so و با استفاده از نوع account حساب کاربری را برای مسائلی مانند اینکه آیا حساب کاربری expire شده و یا اینکه کاربر پسوردش را در مدت زمانی معیین تعیین شده از قبل تعویض کرده یا نه. توجه کنید که به طور ماژول pam_unix.so دارای دو مولفه auth و account است که هر کدام وظیفه خاصی را انجام می دهند و رفتار های کنترلی مانند require چگونگی رفتار آنها را نشان می دهد.

خط پنجم و مازول pam_cracklib.so از دسته (نوع) password و از flag کنترلی required است. مازول pam_cracklib.so بررسی می کند که اگر کاربر expire شده باشد اعلانی برای وارد کردن پسورد جدید نشان داده می شود. سپس بررسی (تست) می کند که آیا پسورد جدید وارد شده بسیار ساده است و قابل تشخیص است توسط برنامه هایی که از دیگشنری هایی برای پیدا کردن پسورد استفاده می کنند. اگر برای بار نسخت این تست fail شود، کاربر دو مرتبه دیگر می تواند برای وارد کردن پسورد تلاش کند که این امر توسط پاس دادن آرگومان retry=3 انجام می شود. می توانید از اینجا بیشتر درباره pam_craclib.so بخوانید. توجه کنید که این عملیات توسط مولفه password از ماژول pam_cracklib.so انجام شد.

خط ششم و بازهم ماژول pam_unix با سه آرگومان shadow, nullok و use_authtok که به آن پاس داده شده است و از مولفه password استفاده می کند. همانطور که گفته شد پردازش از بالا به پایین است و این شبیه به یک stack یا پشته است. پشته ساختاری است که از بالای آن خوانده یا پردازش می شود تا به انتهای آن برسیم. آرگومان use_authok از ماژول برای این است که دیگر به کاربر اعلانی برای ورود پسورد نشان داده نمی شود و از پسورد های موفق وارد شده در بالای پشته یعنی در خطوط بالاتر، برای انتخاب پسورد به طور خودکار انجام می شود.

خط آخر و با استفاده از مولفه session از ماژول pam_unix.so برای مدیریت جلسه کاری کاربر استفاده می شود. این ماژول رخدادی از نام کاربری و نام سرویس را در فایل var/log/message/ در توزیع های مبتنی بر RHLE ثبت می کند. یعنی رکوردی ثبت می کند که زمان دسترسی موفق به سرویس و اینکه توسط چه کاربری صورت گرفته است را به همراه نام سرویس در فایل مربوطه درج می کند. این کار در ابتدا و انتهای جلسه (ورود به و خروج از جلسه) صورت می گیرد. خطوطی که با # شروع شوند توضیح یا Comment هستند.

مثال دوم از پیکربندی PAM

این مثال برای فایل پیکربندی دستور reboot در توزیع 5 CentOS است.

less /etc/pam.d/reboot

OUTPUT

auth    sufficient    pam_rootok.so

auth    required    pam_console.so

auth    include    system-auth#

account    required    pam_permit.so

خط اول با استفاده از ماژول pam_rootok.so بررسی می کند که آیا کاربر فعلی که لاگین کرده، root است یا خیر. این کار توسط User ID یا شناسه کاربر root صورت می گیرد. در تمامی سیستم عامل های یونیکسی (مثل سولاریس، لینوکس، بی اس دی ها و مکینتاش) و در تمامی توزیع های لینوکس شناسه کاربر root عدد صفر است و هیچ کاربر دیگری این عدد را ندارد. به دلیل استفاده از flag کنترلی sufficient در صورتی که این تست موفق (بررسی root بودن توسط ماژول pam_rootok) باشد، هیچ کدام از ماژول های زیرین دیگر تست و بررسی نمی شوند. اما اگر تست ناموفق بود، ماژول بعدی (خط دوم) تست و بررسی می شود. می توانید از اینجا بیشتر درباره pam_rootok.so بخوانید.

خط دوم با استفاده از ماژول pam_console.so سعی در احراز هویت کاربر می کند. اگر این کاربر که به کنسول لاگین کرده است، ماژول pam_console بررسی می کند که آیا فایل یک فایل همنام با سرویس یعنی reboot زیر دایرکتوری etc/security/console.apps/ وجود دار. اگر وجود داشت، احرا هویت (احرا هویت و وجود یک فایل توسط مولفه auth) موفق بوده و دنباله عملیات برای پردازش خط بعدی خواهد بود. می توانید از اینجا می توانید درباره pam_console.so بیشتر بخوانید.

خط سوم یک توضیح و یا Comment است و پردازش نخواهد شد.

خط چهارم با استفاده از ماژول pam_permit.so به کاربر root یا هر کاربر دیگری که به کنسول لاگین کرده است اجازه اجرا و reboot کردن سیستم را می دهد. این ماژول هیچ کاری جز اجازه دسترسی را انجام نمی دهد.

در این مطلب سعی شد که ساختار PAM به همراه دو مثال نشان داده شود تا با مفهوم و استفاده PAM آشنا شوید. در صورتی که بخواهید راهنمای هر ماژول به همراه توصیفی از ماژول و همچنین آرگومان های موجود برای آن ماژولو همچنین اینکه ماژول از کدام دسته گفته شده پشتیبانی می کند را مطالعه کنید از دستور man به همراه نام مازول و بدون پسوند so. در نام ماژول (مانند مثال) زیر استفاده کنید.

man pam_unix



برچسب ها : , , , , , ,