3.5.2. حالت چندکاربره
برای اینکه اشتراکگذاری ایمن یک انبار Nix بین چندین کاربر امکانپذیر باشد، بسیار مهم است که کاربران نتوانند سازندههایی را اجرا کنند که انبار Nix یا پایگاهداده را به روشهای دلخواه تغییر دهند یا در ساختهای آغازشده توسط سایر کاربران تداخل ایجاد کنند. اگر آنها میتوانستند چنین کاری انجام دهند، قادر بودند یک اسب تروجان را در برخی بستهها نصب کرده و حسابهای سایر کاربران را به خطر بیندازند.
برای جلوگیری از این امر، مالکیت انبار Nix و پایگاهداده در اختیار یک کاربر دارای دسترسی ویژه (معمولاً root) است و سازندهها تحت حسابهای کاربری خاصی (معمولاً با نامهای nixbld1، nixbld2 و غیره) اجرا میشوند. هنگامی که یک کاربر بدون دسترسی ویژه (non-privileged) یک دستور Nix را اجرا میکند، عملیاتی که روی انبار Nix تأثیر میگذارند (مانند ساختها) به یک دیمن Nix ارجاع داده میشوند که تحت کاربرِ دارای مالکیت انبار/پایگاهدادهی Nix اجرا میشود و عملیات را انجام میدهد.
نکته
حالت چندکاربره یک محدودیت مهم دارد: تنها کاربر root و مجموعهای از کاربران معتمد مشخصشده در
nix.confمیتوانند کشهای باینری دلخواه را مشخص کنند. بنابراین در حالی که کاربران بدون دسترسی ویژه ممکن است بستهها را از عبارتهای Nix دلخواه نصب کنند، اما ممکن است باینریهای پیشساخته دریافت نکنند.
راهاندازی کاربران سازنده
کاربران سازنده (build users) همان UIDهای خاصی هستند که ساختها تحت آنها انجام میشوند. همه آنها باید عضو گروه کاربران سازنده به نام nixbld باشند. این گروه نباید هیچ عضو دیگری داشته باشد. کاربران سازنده نباید عضو هیچ گروه دیگری باشند. در لینوکس، میتوانید گروه و کاربران را به شکل زیر ایجاد کنید:
$ groupadd -r nixbld
$ for n in $(seq 1 10); do useradd -c "Nix build user $n" \
-d /var/empty -g nixbld -G nixbld -M -N -r -s "$(which nologin)" \
nixbld$n; done این کار ۱۰ کاربر ساخت (build users) ایجاد میکند. تعداد ساختهای همزمان هرگز نمیتواند بیشتر از تعداد کاربران ساخت باشد، بنابراین اگر انتظار دارید کارهای ساخت زیادی را به صورت همزمان انجام دهید، ممکن است بخواهید این مقدار را افزایش دهید.
اجرای خدمت پسزمینه (daemon)
Nix daemon باید به شکل زیر (در نقش root) اجرا شود:
$ nix-daemon شما احتمالاً میخواهید آن خط را جایی در اسکریپتهای بوت سیستم خود قرار دهید.
برای اینکه کاربران بدون دسترسی ویژه بتوانند از daemon استفاده کنند، باید متغیر محیطی NIX_REMOTE را روی daemon تنظیم کنند. بنابراین باید خطی شبیه به این قرار دهید
export NIX_REMOTE=daemon در اسکریپتهای ورود کاربران.
محدود کردن دسترسی
برای محدود کردن کاربرانی که میتوانند عملیاتهای Nix را انجام دهند، میتوانید از مجوزهای روی پوشه /nix/var/nix/daemon-socket استفاده کنید. برای نمونه، اگر میخواهید استفاده از Nix را به اعضای گروهی به نام nix-users محدود کنید، این کار را انجام دهید
$ chgrp nix-users /nix/var/nix/daemon-socket
$ chmod ug=rwx,o= /nix/var/nix/daemon-socket به این ترتیب، کاربرانی که در گروه nix-users قرار ندارند نمیتوانند به سوکت دامنه یونیکس /nix/var/nix/daemon-socket/socket متصل شوند، بنابراین نمیتوانند عملیاتهای Nix را انجام دهند.