SYSTEMD-NSRESOURCED.SERVICE(8) systemd-nsresourced.service SYSTEMD-NSRESOURCED.SERVICE(8)

systemd-nsresourced.service, systemd-nsresourced - سرویس تفویض منابع فضای نام کاربر

systemd-nsresourced.service

/usr/lib/systemd/systemd-nsresourced

systemd-nsresourced یک سرویس سیستمی است که امکان تفویض گذرا (transient delegation) یک محدودهٔ UID/GID را به یک فضای نام کاربر (user namespace، به user_namespaces(7) مراجعه کنید) که توسط یک کلاینت تخصیص یافته است، از طریق یک Varlink IPC API فراهم می‌کند.

کلاینت‌های بدون امتیاز (unprivileged) می‌توانند یک فضای نام کاربر تخصیص دهند و سپس از طریق این سرویس درخواست انتساب یک محدودهٔ UID/GID به آن را ثبت نمایند. سپس از این فضای نام کاربر می‌توان برای اجرای کانتینرها و سایر محیط‌های ایزوله (sandboxes) و/یا اعمال آن بر روی یک نقطهٔ اتصال نگاشت‌یافته با شناسه (id-mapped mount) استفاده کرد.

تخصیص‌های UID/GID به این روش به‌صورت گذرا هستند: هنگامی که یک فضای نام کاربر از بین می‌رود، محدودهٔ UID/GID آن به مخزن محدوده‌های دردسترس بازگردانده می‌شود. به منظور اطمینان از اینکه کلاینت‌ها نتوانند در محدودهٔ گذرای UID/GID خود ماندگاری (persistency) به دست آورند، یک سیاست مبتنی بر BPF-LSM اعمال می‌شود که تضمین می‌کند فضاهای نام کاربری که به این شکل راه‌اندازی شده‌اند، تنها می‌توانند روی سامانه‌های فایلی بنویسند که خودشان تخصیص داده‌اند یا صراحتاً از طریق systemd-nsresourced در فهرست مجاز قرار گرفته‌اند.

systemd-nsresourced به‌طور خودکار اطمینان حاصل می‌کند که هر محدودهٔ UID ثبت‌شده، از طریق User/Group Record Lookup API via Varlink[1] در پایگاه‌دادهٔ NSS سیستم نمایش داده شود.

در حال حاضر، تنها محدوده‌های UID/GID شامل دقیقاً ۱ یا دقیقاً ۶۵۵۳۶ مقدار UID/GID را می‌توان در این سرویس ثبت کرد. علاوه بر این، شناسه‌های UID و GID همواره با هم و به‌صورت متقارن تخصیص داده می‌شوند.

رابط برنامه‌نویسی تخصیص از محدوده‌های تفویض‌شده (delegated ranges) پشتیبانی می‌کند: محدوده‌های اضافی UID/GID که به‌جای ترجمه شدن به یک UID/GID مقصد، به‌صورت ۱:۱ در فضای نام کاربر نگاشت می‌شوند. این محدوده‌های تفویض‌شده سناریوهای فضای نام کاربری تودرتو (nested) را امکان‌پذیر می‌سازند؛ جایی که یک کانتینر نیاز دارد فضاهای نام کاربری فرزند با محدوده‌های UID گذرای مخصوص به خود را ایجاد کند. در حالت عادی، هسته محدود می‌کند که چه شناسه‌های UID می‌توانند در یک فضای نام کاربر نگاشت شوند، به طوری که فقط شناسه‌هایی مجاز هستند که در والد نیز نگاشت شده باشند. محدوده‌های تفویض‌شده با پیش‌تخصیص محدوده‌های اضافی که در داخل فضای نام کاربر قابل مشاهده هستند و می‌توانند توسط فراخوانی‌های تودرتوی AllocateUserRange() استفاده شوند، این مسئله را حل می‌کنند. برای هر فضای نام کاربر می‌توان تا ۱۶ محدودهٔ تفویض‌شده را درخواست کرد که اندازهٔ هر یک ۶۵۵۳۶ است. این محدوده‌ها طبق سند Users, Groups, UIDs and GIDs on systemd Systems[2] از محدوده‌های UID کانتینر تخصیص می‌یابند.

رابط برنامه‌نویسی تخصیص همچنین از نگاشت‌های هویتی (identity mappings) پشتیبانی می‌کند: به‌جای تخصیص یک محدودهٔ گذرای UID/GID، فضای نام کاربر را می‌توان طوری پیکربندی کرد که UID/GID فراخوان را به کاربر ریشه (UID 0) در داخل فضای نام، یا به خودش نگاشت کند. نگاشت‌های هویتی را می‌توان با محدوده‌های تفویض‌شده ترکیب کرد تا وارد یک فضای نام کاربر ممتازی شد که از طریق آن کانتینر راه‌اندازی می‌شود و پس از آن کانتینر می‌تواند در یکی از محدوده‌های تفویض‌شده اجرا شود. کاربران نگاشت‌شده به روش هویتی، بر خلاف محدوده‌های گذرا، مشمول محدودیت‌های نوشتن BPF-LSM نیستند.

علاوه بر این، رابط برنامه‌نویسی تخصیص از نگاشت محدودهٔ UID خارجی (foreign UID range) به داخل فضای نام کاربر پشتیبانی می‌کند. هنگامی که این گزینه فعال باشد، محدودهٔ UID خارجی به‌صورت ۱:۱ در فضای نام کاربر نگاشت می‌شود و به فرآیندهای درون آن اجازه می‌دهد به فایل‌های متعلق به محدودهٔ UID خارجی دسترسی داشته و آن‌ها را دستکاری کنند.

این سرویس فراخوانی‌های رابط برنامه‌نویسی (API) را برای قرار دادن نقاط اتصال در فهرست مجاز (ارجاع‌شده از طریق توصیف‌کننده‌های فایل اتصال طبق API تابع fsmount() در لینوکس)، انتقال مالکیت یک زیردرخت cgroup به فضای نام کاربر، و تفویض یک جفت دستگاه اترنت مجازی به فضای نام کاربر فراهم می‌کند. در صورت استفادهٔ ترکیبی، این موارد برای پیاده‌سازی محیط‌های کانتینری کاملاً بدون امتیاز، همان‌طور که توسط systemd-nspawn(1) پیاده‌سازی شده، گزینهٔ کاملاً بدون امتیاز RootImage= (به systemd.exec(5) مراجعه کنید) یا ابزارهای کاملاً بدون امتیاز تصویر دیسک مانند systemd-dissect(1) کافی هستند.

این سرویس یک سرویس Varlink[3] ارائه می‌دهد: io.systemd.NamespaceResource امکان ثبت فضاهای نام کاربر و انتساب نقاط اتصال، cgroupها و واسط‌های شبکه به آن را فراهم می‌سازد.

systemd(1), systemd-mountfsd.service(8), systemd-nspawn(1), systemd.exec(5), systemd-dissect(1), user_namespaces(7)

1.
User/Group Record Lookup API via Varlink
2.
Users, Groups, UIDs and GIDs on systemd Systems
3.
Varlink
systemd 261.2