PAM_SYSTEMD(8) pam_systemd PAM_SYSTEMD(8)

pam_systemd - ثبت نشست‌های کاربری در مدیریت ورود سیستم‌دی (systemd-logind)

pam_systemd.so

pam_systemd نشست‌های کاربر را در مدیر ورود سیستم‌دی systemd-logind.service(8) و در نتیجه در سلسله‌مراتب گروه کنترلی (cgroup) سیستم‌دی ثبت می‌کند.

این ماژول همچنین پارامترهای مختلف مدیریت منابع و زمان اجرا را، همان‌گونه که در رکوردهای کاربری JSON (JSON User Records)[1] کاربر (در صورت تعریف شدن) پیکربندی شده است، بر نشست جدید اعمال می‌کند.

هنگام ورود (login)، این ماژول — در تعامل با systemd-logind.service — موارد زیر را تضمین می‌کند:

1.اگر دایرکتوری زمان اجرای کاربر /run/user/$UID هنوز وجود نداشته باشد، ایجاد می‌شود یا به عنوان یک سیستم فایل جدید "tmpfs" همراه با اعمال سهمیه (quota) سوار (mount) می‌گردد و مالکیت آن به کاربری که در حال ورود است تغییر می‌یابد.
2.متغیر محیطی $XDG_SESSION_ID مقداردهی اولیه می‌شود. اگر قابلیت بازرسی (auditing) در دسترس باشد و pam_loginuid.so پیش از این ماژول اجرا شده باشد (که به شدت توصیه می‌شود)، مقدار این متغیر از شناسه نشست بازرسی (/proc/self/sessionid) مقداردهی اولیه می‌گردد. در غیر این صورت، از یک شمارنده نشست مستقل استفاده می‌شود.
3.یک واحد دامنه (scope unit) جدید سیستم‌دی برای نشست ایجاد می‌شود. اگر این نخستین نشست همزمان کاربر باشد، یک واحد قطعه (slice unit) ضمنی برای هر کاربر در زیر user.slice به‌طور خودکار ایجاد شده و دامنه درون آن قرار می‌گیرد. نمونه‌ای از سرویس سیستمی user@.service که نمونه مدیر کاربر سیستم‌دی را اجرا می‌کند، راه‌اندازی می‌شود.
4.متغیرهای محیطی "$TZ"، "$EMAIL" و "$LANG" بر اساس داده‌های مربوطه از رکورد JSON کاربر (در صورت تعریف) برای کاربر پیکربندی می‌شوند. علاوه بر این، هرگونه متغیر محیطی که صریحاً در رکورد کاربر پیکربندی شده باشد وارد (import) می‌گردد و umask، سطح nice و محدودیت‌های منابع مقداردهی اولیه می‌شوند.

هنگام خروج از سیستم (logout)، این ماژول موارد زیر را تضمین می‌کند:

1.اگر در logind.conf(5) فعال شده باشد (KillUserProcesses=)، تمامی پردازه‌های نشست خاتمه می‌یابند. اگر آخرین نشست همزمان یک کاربر پایان یابد، نمونه سیستم‌دی کاربر نیز متوقف خواهد شد و واحد قطعه (slice) کاربر نیز به همین ترتیب بسته می‌شود.
2.اگر آخرین نشست همزمان کاربر به پایان برسد، دایرکتوری زمان اجرای کاربر /run/user/$UID و تمام محتویات آن نیز حذف می‌شوند.

اگر سیستم با سیستم‌دی به عنوان سیستم init بوت نشده باشد، این ماژول هیچ کاری انجام نمی‌دهد و بلافاصله مقدار PAM_SUCCESS را برمی‌گرداند.

گزینه‌های زیر پشتیبانی می‌شوند:

class=

یک آرگومان رشته‌ای می‌گیرد که کلاس نشست را تعیین می‌کند. متغیر محیطی XDG_SESSION_CLASS (در ادامه را ببینید) اولویت دارد. برای روش استعلام کلاس یک نشست، sd_session_get_class(3) را ببینید. کلاس‌های نشست زیر تعریف شده‌اند:

جدول 1. کلاس‌های نشست

نام توضیح
user یک نشست کاربری تعاملی معمولی. این کلاس پیش‌فرض برای نشست‌هایی است که هنگام ثبت نشست، یک TTY یا نمایشگر X برای آن‌ها مشخص است.
user-early مشابه user است، اما نشست‌های این کلاس پس از systemd-user-sessions.service(8) مرتب نمی‌شوند؛ یعنی ممکن است پیش از مجاز شدن برقراری نشست‌های معمولی راه‌اندازی شوند. این کلاس نشست پیش‌فرض برای نشست‌های کاربر ریشه (root) است که در غیر این صورت واجد شرایط کلاس user بودند، بالا را ببینید. (افزوده‌شده در نگارش ۲۵۶.)
user-light مشابه user است، اما نشست‌های این کلاس واحد user@.service(5) کاربر را فراخوانی نمی‌کنند و در نتیجه احتمالاً هیچ مدیر سرویس کاربری در حال اجرا نخواهند داشت. (افزوده‌شده در نگارش ۲۵۸.)
user-early-light مشابه user-early است، اما نشست‌های این کلاس واحد user@.service(5) کاربر را فراخوانی نمی‌کنند و در نتیجه احتمالاً هیچ مدیر سرویس کاربری در حال اجرا نخواهند داشت. (افزوده‌شده در نگارش ۲۵۸.)
user-incomplete مشابه user است، اما برای نشست‌هایی که هنوز به‌طور کامل برپا نشده‌اند؛ یعنی هیچ دایرکتوری خانگی سوارشده‌ای ندارند یا موارد مشابه. این مورد توسط systemd-homed.service(8) استفاده می‌شود تا به کاربران اجازه دهد پیش از سوار شدن دایرکتوری خانگی خود از طریق ssh(1) وارد شوند و سوار کردن آن را تا زمانی که کاربر گذرواژه بازگشایی را وارد کند به تاخیر می‌اندازد. پس از فعال شدن دایرکتوری خانگی، نشست‌های این کلاس به کلاس معمولی user ارتقا می‌یابند.
greeter مشابه user است، اما برای نشست‌هایی که به شکل موقت و گذرا توسط یک مدیر نمایشگر (display manager) ایجاد می‌شوند و اطلاعات احراز هویت ورود را از کاربر درخواست می‌کنند.
lock-screen مشابه user است، اما برای نشست‌هایی که به شکل موقت توسط یک مدیر نمایشگر ایجاد می‌شوند و یک صفحه قفل را نشان می‌دهند که می‌تواند برای بازگشایی حساب‌ها یا نشست‌های قفل‌شده کاربر استفاده شود.
background برای نشست‌های پس‌زمینه استفاده می‌شود، مانند نشست‌هایی که توسط cron(8) و ابزارهای مشابه فراخوانی می‌شوند. این کلاس پیش‌فرض برای نشست‌هایی است که هنگام ثبت نشست، هیچ TTY یا نمایشگر X برای آن‌ها مشخص نیست.
background-light مشابه background است، اما نشست‌های این کلاس واحد user@.service(5) کاربر را فراخوانی نمی‌کنند و در نتیجه احتمالاً هیچ مدیر سرویس کاربری در حال اجرا نخواهند داشت. (افزوده‌شده در نگارش ۲۵۶.)
manager سرویس user@.service(5) کاربر ذیل این کلاس نشست ثبت می‌شود. (افزوده‌شده در نگارش ۲۵۶.)
manager-early مشابه manager است، اما برای کاربر ریشه (root). با وضعیت user در مقایسه با user-early مقایسه کنید. (افزوده‌شده در نگارش ۲۵۶.)
none از ثبت این نشست در logind صرف‌نظر می‌کند. هیچ دامنه (scope) نشستی ایجاد نخواهد شد و مدیر سرویس کاربر راه‌اندازی نمی‌شود. (افزوده‌شده در نگارش ۲۵۸.)

اگر هیچ کلاس نشستی از طریق گزینه ماژول PAM یا از طریق متغیر محیطی
$XDG_SESSION_CLASS مشخص نشده باشد، کلاس بر اساس پارامترهای مختلف نشست به‌طور خودکار انتخاب می‌شود؛ مانند نوع نشست (در صورت مشخص بودن)، اینکه آیا نشست دارای TTY یا نمایشگر X11 است یا خیر، و وضعیت کاربر. توجه داشته باشید که ابزارهای مختلف اجازه می‌دهند کلاس نشست برای نشست‌های تازه تخصیص‌یافته PAM صریحاً از طریق متغیر محیطی $XDG_SESSION_CLASS تنظیم شود. برای نمونه، کرون‌جاب‌های کلاسیک یونیکس از انتساب متغیرهای محیطی پشتیبانی می‌کنند (ببینید crontab(5))، که می‌تواند برای انتخاب جداگانه کلاس نشست background یا background-light برای هر کرون‌جاب استفاده شود، یا run0 --setenv=XDG_SESSION_CLASS=user-light می‌تواند برای انتخاب بین user و user-light برای نشست‌های دارای امتیاز فراخوانی‌شده به کار رود.

افزوده‌شده در نگارش ۱۹۷.

type=

یک آرگومان رشته‌ای می‌گیرد که نوع نشست را مشخص می‌کند. متغیر محیطی XDG_SESSION_TYPE (در ادامه را ببینید) اولویت دارد. یکی از مقادیر unspecified، tty، x11، wayland، mir یا web. برای جزئیات درباره نوع نشست، sd_session_get_type(3) را ببینید.

افزوده‌شده در نگارش ۲۰۹.

desktop=

یک شناسه رشته‌ای منفرد و کوتاه برای محیط میزکار می‌گیرد. متغیر محیطی XDG_SESSION_DESKTOP (در ادامه را ببینید) اولویت دارد. در جاهایی که کاربرد داشته باشد و در صورت موجود بودن این اطلاعات، ممکن است برای مشخص کردن میزکار استفاده‌شده در نشست به کار رود؛ به عنوان مثال: GNOME یا KDE. توصیه می‌شود از همان شناسه‌ها و حروف بزرگ/کوچک همانند $XDG_CURRENT_DESKTOP، مطابق تعریف‌شده در مشخصات مدخل دسکتاپ (Desktop Entry Specification)[2] استفاده شود. (با این حال، توجه داشته باشید که این گزینه تنها یک مورد می‌پذیرد، نه یک لیست جداشده با دونقطه مانند $XDG_CURRENT_DESKTOP.) برای جزئیات بیشتر sd_session_get_desktop(3) را ببینید.

افزوده‌شده در نگارش ۲۴۰.

area=

یک نام فایل را به عنوان پارامتر می‌گیرد. در صورت تعیین و هنگام ورود کاربر به حساب خود، متغیر محیطی $HOME روی ~/Areas/ با پسوند رشته مشخص‌شده تنظیم می‌شود، اما تنها در صورتی که آن دایرکتوری وجود داشته باشد. علاوه بر این، متغیر $XDG_AREA روی پارامتر (بدون پیشوند) تنظیم خواهد شد.

این قابلیت می‌تواند برای نگهداری چندین دایرکتوری خانگی ثانویه مجزا درون دایرکتوری خانگی اصلی کاربر استفاده شود. معمولاً ناحیه‌ای که قرار است به آن وارد شوید، در صورت مجاز بودن توسط حساب کاربری، هنگام ورود مشخص می‌شود (حساب‌های ارائه‌شده توسط pam_systemd_home(8) این امکان را دارند)، اما این پارامتر می‌تواند برای تعریف یک مقدار پیش‌فرض در صورت مشخص نشدن آن استفاده شود.

توجه داشته باشید که این فقط $HOME را در هنگام ورود تنظیم می‌کند و بر دایرکتوری خانگی گزارش‌شده کاربر در جاهای دیگر تأثیری نمی‌گذارد. به طور خاص این بدان معناست که sshd(8) همچنان کلیدهای SSH کاربر را تنها در دایرکتوری خانگی اصلی کاربر جستجو می‌کند، نه در هیچ‌یک از نواحی آن.

توجه داشته باشید که ناحیه پیش‌فرض برای ورود می‌تواند به عنوان بخشی از حساب کاربری نیز پیکربندی شود. ناحیه مشخص‌شده از طریق area= بر ناحیه پیش‌فرض پیکربندی‌شده در آنجا برتری دارد. همچنین توجه داشته باشید که اگر ناحیه به طور صریح توسط کاربر هنگام ورود مشخص شود، بر هر دو برتری خواهد داشت. همچنین توجه داشته باشید که تنظیم این پارامتر روی یک رشته خالی، اثر هرگونه ناحیه پیش‌فرض پیکربندی‌شده به عنوان بخشی از رکورد کاربر را خنثی می‌کند؛ یعنی تضمین می‌کند که کاربر به دایرکتوری خانگی اصلی حساب خود وارد شود.

برای جزئیات درباره مفهوم ناحیه (area)، pam_systemd_home(8) را ببینید.

افزوده‌شده در نگارش ۲۵۸.

default-capability-bounding-set=, default-capability-ambient-set=

یک فهرست جداشده با کاما از قابلیت‌های پردازه (process capabilities) (مانند CAP_WAKE_ALARM، CAP_BLOCK_SUSPEND و غیره) را می‌گیرد تا برای پردازه‌های نشست فراخوانی‌شده تنظیم شوند، در صورتی که رکورد کاربر مجموعه‌های مناسب قابلیت‌ها را مستقیماً کدگذاری نکرده باشد. برای جزئیات در مورد مفهوم قابلیت‌ها، capabilities(7) را ببینید. در صورت عدم تعیین، مجموعه محدودکننده پیش‌فرض (bounding set) دست‌نخورده باقی می‌ماند (یعنی معمولاً شامل مجموعه کامل قابلیت‌ها است). مجموعه محیطی پیش‌فرض (ambient set) برای کاربران عادی در صورتی که نشست PAM با یک جایگاه (seat) محلی مرتبط باشد یا برای سرویس کاربری سیستم‌دی user@.service فراخوانی شود، روی CAP_WAKE_ALARM تنظیم می‌شود. در غیر این صورت، پیش‌فرض آن مجموعه خالی است.

افزوده‌شده در نگارش ۲۵۴.

debug[=]

یک آرگومان بولی اختیاری می‌گیرد. در صورت مقدار yes یا بدون آرگومان، ماژول در حین کار اطلاعات اشکال‌زدایی را لاگ می‌کند.

فقط session ارائه می‌شود.

متغیرهای محیطی زیر توسط ماژول مقداردهی اولیه می‌شوند و برای پردازه‌های نشست کاربر در دسترس هستند:

$XDG_SESSION_ID

یک شناسه کوتاه نشست که برای استفاده در نام فایل‌ها مناسب است. خود این رشته باید به عنوان یک مقدار مات (opaque) تلقی شود، هرچند اغلب صرفاً شناسه نشست بازرسی (audit) است که توسط /proc/self/sessionid گزارش می‌شود. هر شناسه فقط یک بار در طول زمان روشن بودن سیستم (uptime) اختصاص داده می‌شود. از این رو ممکن است برای برچسب‌گذاری یکتای فایل‌ها یا سایر منابع این نشست استفاده شود. این شناسه را با شناسه بوت، که توسط sd_id128_get_boot(3) برگردانده می‌شود، برای یک شناسه سراسری یکتا ترکیب کنید.

$XDG_RUNTIME_DIR

مسیر به یک دایرکتوری خصوصی کاربر و قابل نوشتن توسط کاربر که به زمان ورود کاربر به دستگاه مقید است. این دایرکتوری نخستین باری که کاربر وارد می‌شود به‌طور خودکار ایجاد شده و با خروج نهایی کاربر حذف می‌شود. اگر یک کاربر به طور همزمان دو بار وارد شود، هر دو نشست همان $XDG_RUNTIME_DIR و همان محتویات را خواهند دید. اگر کاربری یک بار وارد شود، سپس خارج شده و دوباره وارد شود، محتویات دایرکتوری در این بین از دست رفته خواهد بود؛ با این حال برنامه‌ها نباید به این رفتار وابسته باشند و باید بتوانند با فایل‌های کهنه کنار بیایند. برای ذخیره داده‌های خصوصی نشست در این دایرکتوری، کاربر باید مقدار $XDG_SESSION_ID را در نام فایل بگنجاند. این دایرکتوری باید برای اشیای سیستم فایل زمان اجرا مانند سوکت‌های AF_UNIX، لوله‌های FIFO، فایل‌های PID و موارد مشابه استفاده شود. تضمین می‌شود که این دایرکتوری محلی بوده و بالاترین مجموعه ویژگی‌های سیستم فایل را که سیستم‌عامل ارائه می‌دهد داراست. برای جزئیات بیشتر، مشخصات دایرکتوری پایه XDG (XDG Base Directory Specification)[3] را ببینید. اگر کاربر فعلی، کاربر اصلی نشست نباشد، $XDG_RUNTIME_DIR تنظیم نمی‌شود.

$TZ, $EMAIL, $LANG

اگر یک رکورد کاربری JSON برای کاربر در حال ورود مشخص باشد، این متغیرها از داده‌های مربوطه در آن رکورد مقداردهی اولیه می‌شوند.

افزوده‌شده در نگارش ۲۴۵.

$SHELL_PROMPT_PREFIX, $SHELL_PROMPT_SUFFIX, $SHELL_WELCOME

این متغیرهای محیطی از اعتبارهای سرویس (service credentials) "shell.prompt.prefix"، "shell.prompt.suffix" و "shell.welcome" (در صورت تنظیم بودن) مقداردهی اولیه می‌شوند. آن‌ها به پردازه‌های نشست فراخوانی‌شده تحویل داده می‌شوند، جایی که در اعلان پوسته (shell prompt) وارد می‌شوند (به‌طور خاص $SHELL_PROMPT_PREFIX به عنوان پیشوند به $PS1 و $SHELL_PROMPT_SUFFIX به عنوان پسوند افزوده می‌شود) یا در نخستین راه‌اندازی پوسته بر روی صفحه نمایش چاپ می‌شوند.

افزوده‌شده در نگارش ۲۵۷.

متغیرهای محیطی زیر توسط ماژول خوانده می‌شوند و ممکن است توسط سرویس PAM برای انتقال فراداده (metadata) به ماژول استفاده شوند. اگر این متغیرها در هنگام فراخوانی ماژول PAM تنظیم نشده باشند اما بتوان آن‌ها را به روش دیگری تعیین کرد، توسط ماژول تنظیم می‌شوند تا در صورت مشخص بودن، برای نشست و برنامه‌ها مقداردهی اولیه گردند.

$XDG_SESSION_TYPE

نوع نشست. این متغیر می‌تواند به جای type= در خط پارامترهای ماژول استفاده شود و معمولاً ترجیح داده می‌شود.

افزوده‌شده در نگارش ۲۰۹.

$XDG_SESSION_CLASS

کلاس نشست. این متغیر می‌تواند به جای class= در خط پارامترهای ماژول استفاده شود و معمولاً ترجیح داده می‌شود.

افزوده‌شده در نگارش ۲۰۹.

$XDG_SESSION_DESKTOP

شناسه میزکار. این متغیر می‌تواند به جای desktop= در خط پارامترهای ماژول استفاده شود و معمولاً ترجیح داده می‌شود.

افزوده‌شده در نگارش ۲۰۹.

$XDG_SEAT

نام جایگاه (seat) که نشست باید برای آن ثبت شود (در صورت وجود).

افزوده‌شده در نگارش ۲۰۹.

$XDG_VTNR

شماره VT که نشست باید برای آن ثبت شود (در صورت وجود). (تنها در مورد جایگاه‌هایی با VT در دسترس، مانند "seat0" اعمال می‌شود).

افزوده‌شده در نگارش ۲۰۹.

$XDG_AREA

اگر یک ناحیه (دایرکتوری‌های خانگی ثانویه کاربر، درون دایرکتوری خانگی اصلی) برای ورود انتخاب شده باشد، این متغیر روی نام ناحیه (بدون هیچ پیشوند مسیری) تنظیم می‌شود. در غیر این صورت تنظیم‌نشده است. برای جزئیات بیشتر درباره نواحی، بخش بالا را ببینید.

افزوده‌شده در نگارش ۲۵۸.

$XDG_SESSION_EXTRA_DEVICE_ACCESS

مجموعه دستگاه‌های سخت‌افزاری اضافی که باید به نشست اجازه دسترسی به آن‌ها داده شود. به ازای هر "ID" در فهرست، دسترسی به تمام دستگاه‌هایی که با "xaccess-ID" در udev علامت‌گذاری شده‌اند به نشست اعطا می‌شود.

افزوده‌شده در نگارش ۲۶۰.

در صورت تنظیم نشدن، pam_systemd متغیرهای $XDG_SEAT و $XDG_VTNR را بر اساس متغیر $DISPLAY (در صورت تنظیم بودن دومی) مقداردهی اولیه خواهد کرد.

ماژول‌های PAM قبلی در پشته، یعنی ماژول‌هایی که پیش از pam_systemd.so می‌آیند، می‌توانند محدودیت‌های دامنه نشست را با استفاده از اشیای بافتار (context) PAM تنظیم کنند. داده‌های این اشیاء به صورت رشته‌های C با پایان NUL ارائه می‌شوند و مستقیماً به دستورالعمل‌های کنترل منبع واحد مربوطه نگاشت می‌شوند. توجه داشته باشید که این محدودیت‌ها بر نشست‌های فردی کاربر اعمال می‌شوند و به کل پردازه‌های کاربر به صورت یک کل واحد اعمال نمی‌گردند. به ویژه، نمونه واحد به ازای هر کاربر user@.service که فرآیند مدیر systemd --user و فرزندان آن را اجرا می‌کند، و خارج از هر نشستی ردیابی می‌شود و بین تمام نشست‌های کاربر به اشتراک گذاشته می‌شود، تحت پوشش این محدودیت‌ها قرار نمی‌گیرد.

برای اطلاعات بیشتر درباره منابع، systemd.resource-control(5) را ببینید. همچنین برای اطلاعات بیشتر درباره نحوه تنظیم اشیای بافتار، pam_set_data(3) را ببینید.

systemd.memory_max=

دستورالعمل واحد MemoryMax= را تنظیم می‌کند.

افزوده‌شده در نگارش ۲۳۹.

systemd.tasks_max=

دستورالعمل واحد TasksMax= را تنظیم می‌کند.

افزوده‌شده در نگارش ۲۳۹.

systemd.cpu_weight=

دستورالعمل واحد CPUWeight= را تنظیم می‌کند.

افزوده‌شده در نگارش ۲۳۹.

systemd.io_weight=

دستورالعمل واحد IOWeight= را تنظیم می‌کند.

افزوده‌شده در نگارش ۲۳۹.

systemd.runtime_max_sec=

دستورالعمل واحد RuntimeMaxSec= را تنظیم می‌کند.

افزوده‌شده در نگارش ۲۴۴.

نمونه داده‌هایی که می‌تواند از یک ماژول PAM دیگر ارائه شود:

pam_set_data(handle, "systemd.memory_max", (void *)"200M", cleanup);
pam_set_data(handle, "systemd.tasks_max",  (void *)"50",   cleanup);
pam_set_data(handle, "systemd.cpu_weight", (void *)"100",  cleanup);
pam_set_data(handle, "systemd.io_weight",  (void *)"340",  cleanup);
pam_set_data(handle, "systemd.runtime_max_sec", (void *)"3600", cleanup);

در اینجا نمونه‌ای از قطعه‌پیکربندی PAM آورده شده است که اجازه می‌دهد نشست‌های کاربران توسط systemd-logind.service مدیریت شوند:

#%PAM-1.0
-auth     [success=done authtok_err=bad perm_denied=bad maxtries=bad default=ignore] pam_systemd_home.so
auth      sufficient pam_unix.so
auth      required   pam_deny.so
account   required   pam_nologin.so
-account  [success=done authtok_expired=bad new_authtok_reqd=bad maxtries=bad acct_expired=bad default=ignore] pam_systemd_home.so
account   required   pam_unix.so
-password sufficient pam_systemd_home.so
password  sufficient pam_unix.so sha512 shadow try_first_pass
password  required   pam_deny.so
-session  optional   pam_keyinit.so revoke
-session  optional   pam_loginuid.so
-session  optional   pam_systemd_home.so
-session  optional   pam_systemd.so
session   required   pam_unix.so

systemd(1), systemd-user-sessions.service(8), user@.service(5), systemd-logind.service(8), logind.conf(5), loginctl(1), pam_systemd_home(8), pam.conf(5), pam.d(5), pam(8), pam_loginuid(8), systemd.scope(5), systemd.slice(5), systemd.service(5)

1.
رکوردهای کاربری JSON (JSON User Records)
2.
مشخصات مدخل دسکتاپ (Desktop Entry Specification)
3.
مشخصات دایرکتوری پایه XDG (XDG Base Directory Specification)
systemd 261.2