SETPRIV(1) دستورات کاربر SETPRIV(1)

setpriv - اجرای برنامه با امتیازات و محدودیت‌های دسترسی مشخص

setpriv [options] program [arguments]

تنظیمات مختلف امتیازات لینوکس را که از طریق execve(2) به ارث می‌رسند، تنظیم یا پرس‌وجو می‌کند.

در مقایسه با su(1) و runuser(1)، دستور setpriv نه از PAM استفاده می‌کند و نه درخواست گذرواژه می‌نماید. این ابزار یک لفاف ساده و غیر set-user-ID در اطراف execve(2) است و می‌تواند به همان روشی که setuidgid(8) از daemontools، chpst(8) از runit یا ابزارهای مشابه ارائه‌شده توسط دیگر مدیران سرویس کار می‌کنند، برای کاهش و سلب امتیازات استفاده شود.

--clear-groups

پاک‌سازی گروه‌های تکمیلی (supplementary groups).

-d, --dump

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

--groups group...

تنظیم گروه‌های تکمیلی. آرگومان فهرستی از GIDها یا نام‌های جداشده با کاما است.

--inh-caps (+|-)cap..., --ambient-caps (+|-)cap..., --bounding-set (+|-)cap...

تنظیم قابلیت‌های قابل توارث (inheritable capabilities)، قابلیت‌های محیطی (ambient capabilities) یا مجموعه‌مرز قابلیت‌ها (capability bounding set). به capabilities(7) مراجعه کنید. آرگومان فهرستی جداشده با کاما از موارد +cap و -cap است که به ترتیب یک مورد را اضافه یا حذف می‌کنند. cap می‌تواند یک نام قابل خواندن برای انسان همان‌طور که در capabilities(7) بدون پیشوند cap_ دیده می‌شود باشد، یا به قالب cap_N که در آن N شاخص داخلی قابلیت در لینوکس است. +all و -all می‌توانند برای افزودن یا حذف همه قابلیت‌ها استفاده شوند.

مجموعه قابلیت‌ها برای --inh-caps از مجموعه قابل توارث فعلی، برای --ambient-caps از مجموعه محیطی فعلی، و برای --bounding-set از مجموعه مرزی فعلی آغاز می‌شود.

به محدودیت‌های زیر (به تفصیل در capabilities(7)) در رابطه با تغییرات این مجموعه‌های قابلیت توجه کنید:

•یک قابلیت تنها در صورتی می‌تواند به مجموعه قابل توارث اضافه شود که در حال حاضر در مجموعه‌مرز (bounding set) وجود داشته باشد.
•یک قابلیت تنها در صورتی می‌تواند به مجموعه محیطی اضافه شود که در حال حاضر هم در مجموعه مجاز (permitted) و هم در مجموعه قابل توارث وجود داشته باشد.
•علیرغم ساختار ارائه‌شده توسط setpriv، هسته اجازه اضافه شدن قابلیت‌ها به مجموعه‌مرز را نمی‌دهد.

اگر قابلیتی را از مجموعه‌مرز حذف کنید بدون اینکه آن را از مجموعه قابل توارث نیز حذف کنید، به احتمال زیاد دچار سردرگمی خواهید شد. این کار را انجام ندهید.

--keep-groups

حفظ گروه‌های تکمیلی. تنها در ترکیب با --rgid، --egid یا --regid مفید است.

--init-groups

مقداردهی اولیه گروه‌های تکمیلی با استفاده از initgroups3. تنها در ترکیب با --ruid یا --reuid مفید است.

--list-caps

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

--nnp, --no-new-privs

تنظیم بیت no_new_privs. با تنظیم این بیت، فراخوانی execve(2) امتیازات جدیدی اعطا نخواهد کرد. برای مثال، بیت‌های set-user-ID و set-group-ID و همچنین قابلیت‌های فایل غیرفعال خواهند شد. (اجرای برنامه‌های باینری با این بیت‌ها همچنان کار خواهد کرد، اما آنها امتیازی کسب نخواهند کرد. برخی LSMها، به ویژه AppArmor، ممکن است منجر به شکست در اجرای برنامه‌های خاصی شوند.) این بیت توسط فرایندهای فرزند به ارث برده می‌شود و قابل لغو نیست. به prctl(2) و Documentation/prctl/no_new_privs.txt در منبع هسته لینوکس مراجعه کنید.

بیت no_new_privs از نسخه لینوکس ۳.۵ پشتیبانی می‌شود.

--rgid gid, --egid gid, --regid gid

تنظیم GIDهای واقعی (real)، مؤثر (effective) یا هر دو. آرگومان gid می‌تواند به صورت نام متنی گروه داده شود.

برای ایمنی، اگر هر gid اصلی را تنظیم کنید، باید یکی از گزینه‌های --clear-groups، --groups، --keep-groups یا --init-groups را مشخص کنید.

--ruid uid, --euid uid, --reuid uid

تنظیم UIDهای واقعی (real)، مؤثر (effective) یا هر دو. آرگومان uid می‌تواند به صورت نام کاربری متنی برای ورود داده شود.

تنظیم uid یا gid قابلیت‌ها را تغییر نمی‌دهد، اگرچه فراخوانی exec در انتها ممکن است قابلیت‌ها را تغییر دهد. این بدان معنی است که اگر شما کاربر root هستید، احتمالاً می‌خواهید کاری مانند این را انجام دهید:

setpriv --reuid=1000 --regid=1000 --inh-caps=-all

--securebits (+|-)securebit...

تنظیم یا پاک‌سازی securebits. آرگومان فهرستی جداشده با کاما است. securebitهای معتبر عبارتند از noroot، noroot_locked، no_setuid_fixup، no_setuid_fixup_locked و keep_caps_locked. مورد keep_caps توسط execve(2) پاک می‌شود و بنابراین مجاز نیست.

--pdeathsig keep|clear|<signal>

حفظ، پاک‌سازی یا تنظیم سیگنال مرگ والد (parent death signal). برخی LSMها، به ویژه SELinux و AppArmor، هنگامی که اطلاعات احراز هویت فرایند تغییر می‌کند این سیگنال را پاک می‌کنند. استفاده از --pdeathsig keep سیگنال مرگ والد را پس از تغییر اطلاعات احراز هویت برای اصلاح این وضعیت بازیابی می‌کند.

--ptracer pid|any|none

هنگامی که حالت محدودشده ptrace مربوط به Yama فعال است (یعنی زمانی که /proc/sys/kernel/yama/ptrace_scope روی 1 تنظیم شده است)، امکان ردیابی از طریق ptrace(2) را توسط فرایندی با PID مشخص‌شده، یا هر فرایندی، یا هیچ فرایندی فراهم می‌کند. به PR_SET_PTRACER(2const) مراجعه کنید. (توجه داشته باشید که این ویژگی توسط فرایندهای فرزند به ارث نمی‌رسد، اگرچه در سرتاسر execve(2) حفظ می‌شود.) این گزینه زمانی که Yama فعال نباشد یا در حالتی غیر از ptrace محدودشده باشد، هیچ تأثیری ندارد.

--selinux-label label

درخواست یک گذار (transition) خاص SELinux (با استفاده از transition هنگام exec، نه dyntrans). اگر SELinux در حال استفاده نباشد، این مورد با شکست مواجه شده و باعث خاتمه غیرعادی setpriv می‌شود، و ممکن است گذار بر اساس صلاحدید SELinux نادیده گرفته شود یا باعث شکست execve(2) گردد. (به ویژه، بعید است که این گزینه در ترکیب با no_new_privs کار کند.) این مشابه runcon(1) است.

--apparmor-profile profile

درخواست یک نمایه (profile) خاص AppArmor (با استفاده از گذار در هنگام exec). اگر AppArmor در حال استفاده نباشد، این مورد با شکست مواجه شده و باعث خاتمه غیرعادی setpriv می‌شود، و ممکن است گذار بر اساس صلاحدید AppArmor نادیده گرفته شود یا باعث شکست execve(2) گردد.

--landlock-access access

فعال‌سازی محدودیت‌های landlock برای مجموعه خاصی از دسترسی‌های سیستم. برای مجاز کردن زیرگروه‌های خاصی از دسترسی‌ها از --landlock-rule استفاده کنید.

مسدود کردن تمام دسترسی‌های سیستم فایل:

setpriv --landlock-access fs

مسدود کردن تمام حذف‌های فایل و ایجاد دایرکتوری‌ها:

setpriv --landlock-access fs:remove-file,make-dir

برای مجموعه کاملی از دسته‌های دسترسی پشتیبانی‌شده از setpriv --help استفاده کنید.

نگه‌دارنده مکان عمومی "fs" ممکن است تغییر کند و در نسخه‌های بعدی برای پشتیبانی از انواع دسترسی‌های جدید گسترش یابد.

--landlock-rule rule

اجازه دادن به یک دسترسی خاص از دسته‌های مسدودشده توسط --landlock-access.

نحو دستور به شرح زیر است:

--landlock-rule $ruletype:$access:$rulearg

به عنوان مثال، اعطای دسترسی خواندن فایل به همه موارد زیر /boot:

--landlock-rule path-beneath:read-file:/boot

--seccomp-filter file

بارگذاری کد فیلتر خام BPF seccomp از یک فایل.

فیلترها را می‌توان به عنوان مثال با enosys ایجاد کرد.

--reset-env

•تمام متغیرهای محیطی به جز متغیر محیطی TERM را پاک می‌کند
•متغیرهای محیطی HOME، SHELL، USER، LOGNAME را با توجه به مدخل passwd کاربر مقداردهی اولیه می‌کند
•متغیر محیطی SHELL در صورتی که مقداری در مدخل passwd کاربر داده نشده باشد، به طور پیش‌فرض روی /bin/sh قرار می‌گیرد.
•متغیر محیطی PATH را مطابق با تنظیمات در /etc/login.defs (متغیرهای ENV_PATH، ENV_SUPATH یا ENV_ROOTPATH) بازنشانی می‌کند، یا برای یک کاربر معمولی به طور پیش‌فرض روی /usr/local/bin:/bin:/usr/bin و برای root روی /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin تنظیم می‌شود.

متغیر محیطی PATH ممکن است در سیستم‌هایی که /bin و /sbin در /usr ادغام شده‌اند، متفاوت باشد.

-h, --help

نمایش متن راهنما و خروج.

-V, --version

نمایش نسخه و خروج.

اگر اعمال هر یک از گزینه‌های مشخص‌شده با شکست مواجه شود، program اجرا نخواهد شد و setpriv با وضعیت خروج ۱۲۷ بازمی‌گردد.

هنگام استفاده از این ابزار مراقب باشید — ممکن است عواقب امنیتی غیرمنتظره‌ای داشته باشد. به عنوان مثال، تنظیم no_new_privs و سپس اجرای برنامه‌ای که توسط SELinux محدود شده است (همان‌طور که این ابزار انجام می‌دهد) ممکن است از اعمال محدودیت‌های SELinux جلوگیری کند.

توجه داشته باشید که setpriv یک جایگزین ۱:۱ برای su(1)، runuser(1) یا sudo(8) نیست. برخلاف آن ابزارها، setpriv از PAM استفاده نمی‌کند، گذرواژه‌ای درخواست نمی‌نماید، و راه‌اندازی نشست یا محاسبات آماری (accounting) را انجام نمی‌دهد. مثال‌های زیر یک نقطه شروع برای سناریوهای رایج کاهش امتیازات فراهم می‌کنند.

اگر می‌خواهید UID/GIDها را مشابه runuser(1) (بدون --login) تغییر دهید، این مورد را امتحان کنید:

setpriv --reuid=1000 --regid=1000 --inh-caps=-all --init-groups

برای بازنشانی محیط نیز (همان‌طور که sudo(8) به طور پیش‌فرض انجام می‌دهد)، گزینه --reset-env را اضافه کنید:

setpriv --reuid=1000 --regid=1000 --inh-caps=-all --init-groups --reset-env

برای یک پیکربندی محدودتر که مجموعه‌مرز را نیز محدود کرده و از کسب امتیازات جدید جلوگیری می‌کند (محدودتر از runuser یا sudo):

setpriv --reuid=1000 --regid=1000 --init-groups --inh-caps=-all --bounding-set=-all --no-new-privs --reset-env

اگر می‌خواهید رفتار setuid(8) از daemontools را تقلید کنید، این مورد را امتحان کنید:

setpriv --reuid=1000 --regid=1000 --clear-groups

Andy Lutomirski <luto@amacapital.net>

runuser(1), su(1), prctl(2), capabilities(7), landlock(7)

برای گزارش باگ‌ها، از سامانه پیگیری مشکلات https://github.com/util-linux/util-linux/issues. استفاده کنید.

دستور setpriv بخشی از بسته util-linux است که می‌تواند از بایگانی هسته لینوکس https://www.kernel.org/pub/linux/utils/util-linux. دریافت شود.

2026-09-02 util-linux 2.42.3