PAM.CONF(5) راهنمای Linux-PAM PAM.CONF(5)

pam.conf, pam.d - فایلها و دایرکتوریهای پیکربندی ماژولهای احراز هویت لینوکس (PAM)

هنگامی که یک برنامهٔ اعطاکنندهٔ دسترسی و آگاه از PAM شروع به کار می‌کند، اتصال خود را به رابط برنامه‌نویسی PAM (یا همان PAM-API) فعال می‌سازد. این فعال‌سازی چندین کار را انجام می‌دهد که مهم‌ترین آن‌ها خواندن فایل(های) پیکربندی است: /etc/pam.conf. به عنوان روشی جایگزین و ترجیح داده شده، پیکربندی می‌تواند توسط فایل‌های پیکربندی مجزا در دایرکتوری pam.d تنظیم شود. وجود این دایرکتوری باعث می‌شود Linux-PAM فایل /etc/pam.conf را نادیده بگیرد (ignore).

این فایل‌ها فهرست PAMهایی را مشخص می‌کنند که وظایف احراز هویت مورد نیاز این سرویس را انجام خواهند داد، و همچنین رفتار مناسب PAM-API را در صورتی که هر یک از PAMها با شکست مواجه شوند، تعیین می‌نمایند.

نحو (Syntax) فایل پیکربندی /etc/pam.conf به شرح زیر است. این فایل از فهرستی از قواعد تشکیل شده است؛ هر قاعده معمولاً در یک خط قرار می‌گیرد، اما می‌تواند با یک پایان خط گریز داده شده (Escaped) به صورت `\<LF>' ادامه یابد. کامنت‌ها با نویسهٔ `#' مشخص می‌شوند و تا انتهای خط امتداد دارند.

قالب هر قاعده، مجموعه‌ای از نشانه‌ها (Tokens) است که با فاصله از هم جدا شده‌اند، و سه تای اول نسبت به بزرگی و کوچکی حروف حساس نیستند (Case-insensitive):

service type control module-path module-arguments

نحو فایل‌های موجود در دایرکتوری /etc/pam.d/ دقیقاً یکسان است، به جز عدم وجود فیلد service. در این حالت، service همان نام فایل در دایرکتوری /etc/pam.d/ است. این نام فایل باید با حروف کوچک باشد.

یک ویژگی مهم PAM این است که تعدادی از قواعد می‌توانند به صورت پشته‌ای (stacked) روی هم قرار گیرند تا سرویس‌های چندین PAM را برای یک وظیفهٔ احراز هویت مشخص ترکیب کنند.

فیلد service معمولاً همان نام آشنای برنامهٔ مربوطه است: login و su نمونه‌های خوبی هستند. نام سرویس other برای ارائهٔ قواعد پیش‌فرض (default) رزرو شده است. تنها خطوطی که به سرویس فعلی اشاره دارند (یا در صورت عدم وجود آن، ورودی‌های other) به برنامهٔ سرویس مورد نظر مرتبط خواهند شد.

فیلد type گروه مدیریتی است که قاعده به آن مربوط می‌شود. این فیلد برای تعیین اینکه ماژول بعدی با کدام یک از گروه‌های مدیریتی مرتبط است به کار می‌رود. مقادیر معتبر عبارتند از:

account

این نوع ماژول مدیریت حساب بدون نیاز به احراز هویت را انجام می‌دهد. معمولاً برای محدود کردن/مجاز ساختن دسترسی به یک سرویس بر اساس زمان روز، منابع در دسترس فعلی سیستم (حداکثر تعداد کاربران) یا شاید مکان کاربر متقاضی -- مانند ورود 'root' فقط از روی کنسول -- استفاده می‌شود.

auth

این نوع ماژول دو جنبه از احراز هویت کاربر را فراهم می‌کند. اولاً، با هدایت برنامه به درخواست گذرواژه یا سایر روش‌های شناسایی از کاربر، مشخص می‌کند که کاربر همان فردی است که ادعا می‌کند. ثانیاً، ماژول می‌تواند از طریق ویژگی‌های اعطای اعتبارنامهٔ خود، عضویت در گروه یا سایر دسترسی‌ها را اعطا نماید.

password

این نوع ماژول برای به‌روزرسانی نشانهٔ احراز هویت مرتبط با کاربر مورد نیاز است. معمولاً برای هر نوع احراز هویت مبتنی بر 'challenge/response' (auth) یک ماژول وجود دارد.

session

این نوع ماژول با انجام کارهایی مرتبط است که باید قبل یا بعد از ارائهٔ سرویس به کاربر انجام شوند. چنین مواردی شامل ثبت گزارش اطلاعات مربوط به باز کردن/بستن تبادل داده با یک کاربر، سوار کردن دایرکتوری‌ها (Mount) و غیره است.

اگر مقدار type از لیست بالا با یک نویسهٔ - آغاز شود، در صورتی که بارگذاری ماژول به دلیل موجود نبودن در سیستم امکان‌پذیر نباشد، کتابخانهٔ PAM خطایی در گزارش‌های سیستم ثبت نخواهد کرد. این ویژگی می‌تواند به ویژه برای ماژول‌هایی مفید باشد که همیشه روی سیستم نصب نیستند و برای احراز هویت و مجوزدهی صحیح نشست ورود به سیستم ضروری نمی‌باشند.

فیلد سوم، control، رفتار PAM-API را در صورتی که ماژول در وظیفهٔ احراز هویت خود با شکست مواجه شود، مشخص می‌کند. دو نوع نحو برای این فیلد کنترل وجود دارد: نحو ساده دارای یک کلمهٔ کلیدی منفرد است؛ نحو پیچیده‌تر شامل انتخابی از جفت‌های value=action درون کروشه است.

برای نحو ساده (سنتی)، مقادیر معتبر control عبارتند از:

required

شکست چنین PAMی در نهایت منجر به بازگرداندن شکست توسط PAM-API خواهد شد، اما فقط پس از اینکه باقی ماژول‌های پشته‌بندی‌شده (stacked) برای این service و type فراخوانی شدند.

requisite

مانند required است؛ با این حال، در صورتی که چنین ماژولی شکست بازگرداند، کنترل بلافاصله به برنامه یا به پشتهٔ مافوق PAM بازگردانده می‌شود. مقدار بازگشتی همان مقداری است که به اولین ماژول required یا requisite که شکست خورده مربوط می‌شود. توجه داشته باشید که این پرچم می‌تواند برای جلوگیری از این احتمال استفاده شود که کاربر فرصت ورود گذرواژه را از طریق یک بستر ناامن پیدا کند. قابل تصور است که چنین رفتاری ممکن است یک مهاجم را از حساب‌های کاربری معتبر در سیستم آگاه سازد. این احتمال باید در برابر نگرانی‌های نه چندان ناچیز افشای یک گذرواژهٔ حساس در یک محیط خصمانه سنجیده شود.

sufficient

اگر چنین ماژولی موفق شود و هیچ ماژول قبلی required شکست نخورده باشد، چارچوب PAM بلافاصله و بدون فراخوانی ماژول‌های بعدی در پشته، موفقیت را به برنامه یا پشتهٔ مافوق PAM برمی‌گرداند. شکست یک ماژول sufficient نادیده گرفته می‌شود و پردازش پشتهٔ ماژول‌های PAM بدون تأثیر ادامه می‌یابد.

optional

موفقیت یا شکست این ماژول تنها در صورتی اهمیت دارد که تنها ماژول موجود در پشتهٔ مرتبط با این service+type باشد.

include

شامل کردن تمام خطوط از نوع داده‌شده از فایل پیکربندی که به عنوان آرگومان برای این کنترل مشخص شده است.

substack

شامل کردن تمام خطوط از نوع داده‌شده از فایل پیکربندی که به عنوان آرگومان برای این کنترل مشخص شده است. این مورد با include متفاوت است، زیرا ارزیابی عملیات‌های done و die در یک زیرپشته (Substack) باعث رد شدن از بقیهٔ کل پشتهٔ ماژول نمی‌شود، بلکه تنها از آن زیرپشته رد می‌شود. همچنین پرش‌ها در یک زیرپشته نمی‌توانند ارزیابی را به خارج از آن هدایت کنند، و کل زیرپشته هنگام انجام پرش در پشتهٔ والد به عنوان یک ماژول محاسبه می‌شود. عملیات reset وضعیت پشتهٔ ماژول را به وضعیتی که در ابتدای ارزیابی زیرپشته داشت بازنشانی می‌کند.

برای نحو پیچیده‌تر، مقادیر معتبر control دارای قالب زیر هستند:

[value1=action1 value2=action2 ...]

جایی که valueN مربوط به کد بازگشتی از تابع فراخوانی‌شده در ماژولی است که خط برای آن تعریف شده است. این مقدار از میان یکی از موارد زیر انتخاب می‌شود: success، open_err، symbol_err، service_err، system_err، buf_err، perm_denied، auth_err، cred_insufficient، authinfo_unavail، user_unknown، maxtries، new_authtok_reqd، acct_expired، session_err، cred_unavail، cred_expired، cred_err، no_module_data، conv_err، authtok_err، authtok_recover_err، authtok_lock_busy، authtok_disable_aging، try_again، ignore، abort، authtok_expired، module_unknown، bad_item، conv_again، incomplete و default.

آخرین مورد از این‌ها، default، بیانگر «تمام valueNهای ذکر نشده به صورت صریح» است. توجه داشته باشید که فهرست کامل خطاهای PAM در /usr/include/security/_pam_types.h موجود است. actionN می‌تواند یکی از قالب‌های زیر را داشته باشد:

ignore

هنگامی که با پشته‌ای از ماژول‌ها استفاده می‌شود، وضعیت بازگشتی ماژول در کد بازگشتی دریافتی توسط برنامه نقشی نخواهد داشت.

bad

این اقدام نشان می‌دهد که کد بازگشتی باید به عنوان نشانه‌ای از شکست ماژول در نظر گرفته شود. اگر این ماژول اولین ماژول شکست‌خورده در پشته باشد، مقدار وضعیت آن برای کل پشته استفاده خواهد شد. این اقدام پیش‌فرض برای تمام کدهای بازگشتی است.

die

معادل bad است همراه با این اثر جانبی که پشتهٔ ماژول را خاتمه می‌دهد و PAM بلافاصله به برنامه بازمی‌گردد.

ok

این به PAM می‌گوید که مدیر سیستم معتقد است این کد بازگشتی باید مستقیماً در کد بازگشتی کل پشتهٔ ماژول‌ها سهم داشته باشد. به عبارت دیگر، اگر وضعیت قبلی پشته منجر به بازگرداندن PAM_SUCCESS می‌شد، کد بازگشتی این ماژول این مقدار را بازنویسی (Override) خواهد کرد. توجه داشته باشید اگر وضعیت قبلی پشته حاوی مقداری باشد که نشان‌دهندهٔ شکست ماژول است، این مقدار 'ok' برای بازنویسی آن مقدار استفاده نخواهد شد.

done

معادل ok است با این اثر جانبی که پشتهٔ ماژول خاتمه می‌یابد و PAM بلافاصله به برنامه بازمی‌گردد، مگر اینکه قبلاً شکست ماژولی رخ داده باشد که نادیده گرفته نشده است.

N (یک عدد صحیح بدون علامت)

پرش از روی N ماژول بعدی در پشته. توجه داشته باشید که N برابر با 0 مجاز نیست و در چنین حالتی به عنوان ignore در نظر گرفته می‌شود. اثر جانبی بستگی به فراخوانی تابع PAM دارد: برای pam_authenticate، pam_acct_mgmt، pam_chauthtok و pam_open_session به صورت ignore است؛ برای pam_setcred و pam_close_session بسته به مقدار بازگشتی ماژول، یکی از موارد ignore، ok یا bad خواهد بود.

reset

پاک کردن تمام حافظهٔ مربوط به وضعیت پشتهٔ ماژول و شروع دوباره با ماژول پشته‌بندی‌شدهٔ بعدی.

اگر اقدام مربوط به یک کد بازگشتی به طور مشخص از طریق نشانهٔ valueN تعریف نشده باشد و مقدار default نیز تعیین نشده باشد، اقدام آن کد بازگشتی به طور پیش‌فرض bad خواهد بود.

هر یک از چهار کلمهٔ کلیدی: required؛ requisite؛ sufficient؛ و optional، یک عبارت معادل در قالب نحو [...] دارند که به شرح زیر است:

required

[success=ok new_authtok_reqd=ok ignore=ignore default=bad]

requisite

[success=ok new_authtok_reqd=ok ignore=ignore default=die]

sufficient

[success=done new_authtok_reqd=done default=ignore]

optional

[success=ok new_authtok_reqd=ok default=ignore]

module-path یا نام کامل فایل PAM است که باید توسط برنامه استفاده شود (با یک '/' شروع می‌شود)، یا یک مسیر نسبی از محل پیش‌فرض ماژول‌ها: /lib/security/ یا /lib64/security/ بسته به معماری سیستم.

module-arguments فهرستی از نشانه‌ها هستند که با فاصله از هم جدا شده‌اند و می‌توانند برای اصلاح رفتار خاص PAM مورد نظر استفاده شوند. این آرگومان‌ها برای هر ماژول به صورت جداگانه مستندسازی می‌شوند. توجه داشته باشید که اگر می‌خواهید فاصله‌ها را در یک آرگومان بگنجانید، باید آن آرگومان را در کروشه قرار دهید.

squid auth required pam_mysql.so user=passwd_query passwd=mada \
      db=eminence [query=select user_name from internet_service \
      where user_name='%u' and password=PASSWORD('%p') and \
      service='web_proxy']

هنگام استفاده از این قاعده، می‌توانید نویسه‌های `[' را در داخل رشته بگنجانید، و اگر می‌خواهید نویسهٔ `]' را در داخل رشته بگنجانید به طوری که در فرآیند تجزیهٔ آرگومان حفظ شود، باید از `\]' استفاده کنید. به عبارت دیگر:

[..[..\]..]    -->   ..[..]..

هر خطی در (یکی از) فایل(های) پیکربندی که به درستی قالب‌بندی نشده باشد، به طور کلی (با احتیاط بیشتر) منجر به شکست فرآیند احراز هویت خواهد شد. خطای متناظر با فراخوانی syslog(3) در فایل‌های گزارش سیستم نوشته می‌شود.

انعطاف‌پذیرتر از فایل پیکربندی واحد، پیکربندی libpam از طریق محتویات دایرکتوری‌های pam.d است. در این حالت، دایرکتوری‌ها با فایل‌هایی پر می‌شوند که نام هر یک از آن‌ها برابر با نام یک سرویس (با حروف کوچک) است: این فایل، فایل پیکربندی اختصاصی برای سرویس نام‌برده است.

فایل‌های پیکربندی PAM ارائه‌شده توسط توزیع‌کننده (Vendor) ممکن است به جای دایرکتوری پیکربندی ماشین /etc/pam.d/، در دایرکتوری سیستم /usr/lib/pam.d/ یا دایرکتوری خاص توزیع‌کننده که قابل پیکربندی است نصب شوند. اگر فایل پیکربندی ماشین یافت نشود، از فایل ارائه‌شده توسط توزیع‌کننده استفاده می‌شود. تمام فایل‌های موجود در /etc/pam.d/ فایل‌های هم‌نام در سایر دایرکتوری‌ها را بازنویسی (Override) می‌کنند.

نحو هر فایل در pam.d مشابه فایل /etc/pam.conf است و از خطوطی با قالب زیر تشکیل شده است:

type  control  module-path  module-arguments

تنها تفاوت این است که نام سرویس (service-name) وجود ندارد. نام سرویس البته همان نام فایل پیکربندی داده‌شده است. به عنوان مثال، /etc/pam.d/login شامل پیکربندی برای سرویس login است.

/etc/pam.conf

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

/etc/pam.d

دایرکتوری پیکربندی Linux-PAM. به طور کلی اگر این دایرکتوری وجود داشته باشد، فایل /etc/pam.conf نادیده گرفته می‌شود.

/usr/lib/pam.d

دایرکتوری پیکربندی ارائه‌شده توسط توزیع‌کننده برای Linux-PAM. فایل‌های موجود در /etc/pam.d فایل‌های هم‌نام در این دایرکتوری را بازنویسی (Override) می‌کنند.

pam(3), PAM(8), pam_start(3)

06/29/2025 Linux-PAM