SUDO(8) راهنمای مدیر سیستم (System Manager's Manual) SUDO(8)

sudo, sudoedit - اجرای یک دستور به عنوان کاربری دیگر

sudo -h | -K | -k | -V

sudo -v [-ABkNnS] [-g group] [-h host] [-p prompt] [-u user]

sudo -l [-ABkNnS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command [arg ...]]

sudo [-ABbEHnPS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-r role] [-t type] [-T timeout] [-u user] [VAR=value] [-i | -s] [command [arg ...]]

sudoedit [-ABkNnS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-r role] [-t type] [-T timeout] [-u user] file ...

دستور sudo به یک کاربر مجاز اجازه می‌دهد تا یک command (دستور) را به عنوان کاربر ارشد (superuser) یا کاربری دیگر، بر اساس آنچه در خط‌مشی امنیتی (security policy) مشخص شده است، اجرا کند. شناسه کاربری واقعی (not effective ‏- نه موثر) کاربر فراخواننده برای تعیین نام کاربری جهت پرس‌وجو از خط‌مشی امنیتی استفاده می‌شود.

دستور sudo از معماری پلاگین برای خط‌مشی‌های امنیتی، حسابرسی (auditing) و ثبت وقایع ورودی/خروجی (I/O logging) پشتیبانی می‌کند. اشخاص ثالث می‌توانند پلاگین‌های خود را توسعه داده و توزیع کنند تا به‌طور یکپارچه با پیشانه (front-end) sudo کار کنند. خط‌مشی امنیتی پیش‌فرض sudoers است که از طریق فایل /etc/sudoers یا از طریق LDAP پیکربندی می‌شود. برای اطلاعات بیشتر بخش Plugins را ببینید.

خط‌مشی امنیتی تعیین می‌کند که یک کاربر در صورت وجود، چه امتیازاتی برای اجرای sudo دارد. خط‌مشی ممکن است کاربران را ملزم کند که هویت خود را با یک گذرواژه یا سازوکار احراز هویت دیگری تأیید کنند. در صورت نیاز به احراز هویت، اگر گذرواژه کاربر در یک بازه زمانی قابل‌پیکربندی وارد نشود، sudo خارج خواهد شد. این محدودیت وابسته به خط‌مشی است؛ مهلت زمانی پیش‌فرض اعلان گذرواژه برای خط‌مشی امنیتی sudoers برابر با 0 دقیقه است.

خط‌مشی‌های امنیتی ممکن است از ذخیره‌سازی موقت اعتبارنامه‌ها (credential caching) پشتیبانی کنند تا به کاربر اجازه داده شود برای مدتی بدون نیاز به احراز هویت مجدد، sudo را دوباره اجرا کند. به‌طور پیش‌فرض، خط‌مشی sudoers اعتبارنامه‌ها را بر پایه هر ترمینال به مدت 15 دقیقه ذخیره می‌کند. برای اطلاعات بیشتر گزینه‌های timestamp_type و timestamp_timeout در sudoers(5) را ببینید. با اجرای sudo به همراه گزینه -v، کاربر می‌تواند بدون اجرای یک command، اعتبارنامه‌های ذخیره‌شده را به‌روزرسانی کند.

در سیستم‌هایی که sudo روش اصلی دستیابی به امتیازات کاربر ارشد است، اجتناب از خطاهای نگارشی (syntax errors) در فایل‌های پیکربندی خط‌مشی امنیتی الزامی است. برای خط‌مشی امنیتی پیش‌فرض، sudoers(5)، تغییرات در فایل‌های پیکربندی باید با استفاده از ابزار کاربردی visudo(8) انجام شود که تضمین می‌کند هیچ خطای نگارشی ایجاد نخواهد شد.

هنگامی که به عنوان sudoedit فراخوانی شود، گزینه -e (که در ادامه توضیح داده شده است) به‌صورت ضمنی اعمال می‌شود.

خط‌مشی‌های امنیتی و پلاگین‌های حسابرسی ممکن است تلاش‌های موفق و ناموفق برای اجرای sudo را ثبت کنند. اگر یک پلاگین I/O پیکربندی شده باشد، ورودی و خروجی command در حال اجرا نیز ممکن است ثبت گردد.

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

به‌طور معمول، اگر sudo به گذرواژه نیاز داشته باشد، آن را از ترمینال کاربر می‌خواند. اگر گزینه -A (askpass) مشخص شده باشد، یک برنامه کمکی (احتمالاً گرافیکی) اجرا می‌شود تا گذرواژه کاربر را بخواند و آن را در خروجی استاندارد بنویسد. اگر متغیر محیطی SUDO_ASKPASS تنظیم شده باشد، مسیر برنامه کمکی را مشخص می‌کند. در غیر این صورت، اگر فایل sudo.conf(5) حاوی خطی باشد که برنامه askpass را مشخص کند، از آن مقدار استفاده خواهد شد. برای مثال:
# Path to askpass helper program
Path askpass /usr/X11R6/bin/ssh-askpass

اگر هیچ برنامه askpass در دسترس نباشد، sudo با یک خطا خارج خواهد شد.

هنگامی که ترمینال وجود دارد، به عنوان بخشی از اعلان گذرواژه زنگ (bell) را به صدا درمی‌آورد. این گزینه در صورت استفاده از برنامه askpass هیچ اثری ندارد.
دستور command داده‌شده را در پس‌زمینه اجرا می‌کند. امکان استفاده از کنترل کارهای پوسته (shell job control) برای دستکاری فرایندهای پس‌زمینه‌ای که توسط sudo شروع شده‌اند وجود ندارد. اکثر commandهای تعاملی در حالت پس‌زمینه به درستی کار نخواهند کرد.
تمام توصیف‌کننده‌های فایل بزرگتر یا مساوی با num را قبل از اجرای یک command می‌بندد. مقادیر کمتر از سه مجاز نیستند. به‌طور پیش‌فرض، sudo هنگام اجرای یک command، تمام توصیف‌کننده‌های فایل باز به جز ورودی استاندارد، خروجی استاندارد و خطای استاندارد را می‌بندد. خط‌مشی امنیتی ممکن است توانایی کاربر را برای استفاده از این گزینه محدود کند. خط‌مشی sudoers تنها زمانی اجازه استفاده از گزینه -C را می‌دهد که مدیر سیستم گزینه closefrom_override را فعال کرده باشد.
دستور command را به جای دایرکتوری کاری فعلی، در directory مشخص‌شده اجرا می‌کند. اگر کاربر مجوز مشخص کردن دایرکتوری کاری را نداشته باشد، خط‌مشی امنیتی ممکن است خطایی بازگرداند.
به خط‌مشی امنیتی اعلام می‌کند که کاربر مایل است متغیرهای محیطی موجود خود را حفظ کند. اگر کاربر مجوز حفظ محیط را نداشته باشد، خط‌مشی امنیتی ممکن است خطایی بازگرداند.
به خط‌مشی امنیتی اعلام می‌کند که کاربر مایل است فهرست جداشده با کاما از متغیرهای محیطی را به متغیرهای حفظ‌شده از محیط کاربر بیفزاید. اگر کاربر مجوز حفظ محیط را نداشته باشد، خط‌مشی امنیتی ممکن است خطایی بازگرداند. این گزینه می‌تواند چندین بار مشخص شود.
یک یا چند file را به جای اجرای یک command ویرایش می‌کند. هنگام استعلام از خط‌مشی امنیتی، رشته "sudoedit" به جای نام مسیر استفاده می‌شود. اگر کاربر توسط خط‌مشی مجاز شناخته شود، مراحل زیر طی می‌شوند:
1.
نسخه‌های موقتی از فایل‌های مورد نظر برای ویرایش ایجاد می‌شوند و مالک آن‌ها روی کاربر فراخواننده تنظیم می‌شود.
2.
ویرایشگر مشخص‌شده توسط خط‌مشی برای ویرایش فایل‌های موقت اجرا می‌شود. خط‌مشی sudoers از متغیرهای محیطی SUDO_EDITOR، VISUAL و EDITOR (به همین ترتیب) استفاده می‌کند. اگر هیچ‌یک از SUDO_EDITOR، VISUAL یا EDITOR تنظیم نشده باشند، نخستین برنامه فهرست‌شده در گزینه editor در sudoers(5) استفاده می‌شود.
3.
اگر فایل‌ها تغییر یافته باشند، نسخه‌های موقت به مکان اصلی خود بازگردانده شده و نسخه‌های موقت حذف می‌شوند.

برای کمک به جلوگیری از ویرایش فایل‌های غیرمجاز، محدودیت‌های زیر اعمال می‌شوند مگر اینکه به صراحت توسط خط‌مشی امنیتی مجاز شده باشند:

•
پیوندهای نمادین نباید ویرایش شوند (نسخه 1.8.15 و بالاتر).
•
هنگامی که دایرکتوری والد توسط کاربر فراخواننده قابل نوشتن باشد، پیوندهای نمادین در امتداد مسیر مورد ویرایش دنبال نمی‌شوند مگر اینکه آن کاربر root باشد (نسخه 1.8.16 و بالاتر).
•
فایل‌های واقع در دایرکتوری‌ای که توسط کاربر فراخواننده قابل نوشتن است، نباید ویرایش شوند مگر اینکه آن کاربر root باشد (نسخه 1.8.16 و بالاتر).

کاربران هرگز مجاز به ویرایش فایل‌های ویژه دستگاه (device special files) نیستند.

اگر فایل مشخص‌شده وجود نداشته باشد، ایجاد خواهد شد. بر خلاف اکثر commandهای اجرا شده توسط sudo، ویرایشگر با محیط بدون تغییر کاربر فراخواننده اجرا می‌شود. اگر فایل موقت پس از ویرایش خالی شود، قبل از نصب از کاربر تأیید خواسته خواهد شد. اگر بنا به دلیلی، sudo نتواند فایلی را با نسخه ویرایش‌شده‌اش به‌روزرسانی کند، کاربر هشداری دریافت خواهد کرد و نسخه ویرایش‌شده در یک فایل موقت باقی خواهد ماند.

دستور command را با گروه اصلی تنظیم‌شده روی group به جای گروه اصلی مشخص‌شده در مدخل پایگاه داده گذرواژه کاربر هدف اجرا می‌کند. group می‌تواند یک نام گروه یا یک شناسه گروه عددی (GID) باشد که با نویسه ‘#’ پیشوند شده است (برای مثال، ‘#0’ برای GID 0). هنگام اجرای یک command به عنوان یک GID، بسیاری از پوسته‌ها نیاز دارند که ‘#’ با یک بک‌اسلش (‘\’) گریزانده شود. اگر گزینه -u مشخص نشده باشد، command به عنوان کاربر فراخواننده اجرا خواهد شد. در هر دو حالت، گروه اصلی روی group تنظیم می‌شود. خط‌مشی sudoers اجازه می‌دهد تا زمانی که گزینه -P در حال استفاده نیست، هر یک از گروه‌های کاربر هدف از طریق گزینه -g مشخص شود.
درخواست می‌کند که خط‌مشی امنیتی متغیر محیطی HOME را روی دایرکتوری خانگی مشخص‌شده توسط مدخل پایگاه داده گذرواژه کاربر هدف تنظیم کند. بسته به خط‌مشی، این ممکن است رفتار پیش‌فرض باشد.
یک پیام راهنمای کوتاه را در خروجی استاندارد نمایش می‌دهد و خارج می‌شود.
اگر پلاگین خط‌مشی امنیتی از commandهای دورست پشتیبانی کند، command را روی host مشخص‌شده اجرا می‌کند. پلاگین sudoers در حال حاضر از اجرای commandهای دورست پشتیبانی نمی‌کند. این گزینه همچنین می‌تواند همراه با گزینه -l برای فهرست کردن امتیازات کاربر برای میزبان دوردست استفاده شود.
پوسته مشخص‌شده در مدخل پایگاه داده گذرواژه کاربر هدف را به عنوان یک پوسته ورود (login shell) اجرا می‌کند. این بدان معناست که فایل‌های منبع مختص ورود مانند .profile، .bash_profile یا .login توسط پوسته خوانده خواهند شد. اگر یک command مشخص شده باشد، به عنوان یک دستور ساده با استفاده از گزینه -c به پوسته ارسال می‌شود. command و هر arg، پس از گریزانده شدن هر نویسه (شامل فاصله‌ها) با یک بک‌اسلش (‘\’) به جز حروف و ارقام، زیرخط، خط‌تیره و علامت دلار، با فاصله به هم متصل می‌شوند. اگر هیچ commandی مشخص نشده باشد، یک پوسته تعاملی اجرا می‌شود. sudo تلاش می‌کند تا قبل از اجرای پوسته، به دایرکتوری خانگی آن کاربر برود. command با محیطی شبیه به آنچه که یک کاربر در هنگام ورود دریافت می‌کند اجرا می‌شود. اکثر پوسته‌ها هنگامی که یک command مشخص شده باشد در مقایسه با یک نشست تعاملی رفتار متفاوتی دارند؛ برای جزئیات به دفترچه راهنمای پوسته مراجعه کنید. بخش Command environment در دفترچه راهنمای sudoers(5) مستند می‌کند که چگونه گزینه -i محیطی را که یک command در هنگام استفاده از خط‌مشی sudoers در آن اجرا می‌شود تحت تأثیر قرار می‌دهد.
مشابه گزینه -k است، با این تفاوت که تمامی اعتبارنامه‌های ذخیره‌شده کاربر را بدون توجه به ترمینال یا شناسه فرایند والد حذف می‌کند. دفعه بعد که sudo اجرا شود، در صورتی که خط‌مشی امنیتی به احراز هویت نیاز داشته باشد، باید گذرواژه وارد شود. امکان استفاده از گزینه -K همراه با یک command یا گزینه دیگر وجود ندارد. این گزینه نیازی به گذرواژه ندارد. همه خط‌مشی‌های امنیتی از ذخیره‌سازی موقت اعتبارنامه پشتیبانی نمی‌کنند.
هنگامی که بدون command استفاده شود، اعتبارنامه‌های ذخیره‌شده موقت کاربر را برای نشست جاری باطل می‌کند. دفعه بعد که sudo در این نشست اجرا شود، اگر خط‌مشی امنیتی نیاز به احراز هویت داشته باشد، باید گذرواژه وارد شود. به‌طور پیش‌فرض، خط‌مشی sudoers از یک رکورد مجزا در حافظه موقت اعتبارنامه برای هر ترمینال (یا شناسه فرایند والد در صورت عدم وجود ترمینال) استفاده می‌کند. این کار از تداخل گزینه -k با دستورات sudo که در نشست ترمینال دیگری اجرا می‌شوند جلوگیری می‌کند. برای اطلاعات بیشتر گزینه timestamp_type در sudoers(5) را ببینید. این گزینه نیازی به گذرواژه ندارد و برای این اضافه شده است که به کاربر اجازه دهد مجوزهای sudo را از درون یک فایل .logout لغو کند.

هنگامی که همراه با یک command یا گزینه‌ای که ممکن است نیاز به گذرواژه داشته باشد استفاده شود، این گزینه باعث می‌شود که sudo اعتبارنامه‌های ذخیره‌شده کاربر را نادیده بگیرد. در نتیجه، sudo درخواست گذرواژه خواهد کرد (اگر توسط خط‌مشی امنیتی لازم باشد) و اعتبارنامه‌های ذخیره‌شده کاربر را به‌روزرسانی نخواهد کرد.

همه خط‌مشی‌های امنیتی از ذخیره‌سازی موقت اعتبارنامه پشتیبانی نمی‌کنند.

اگر هیچ commandی مشخص نشده باشد، امتیازات کاربر فراخواننده (یا user مشخص‌شده توسط گزینه -U) را روی میزبان فعلی فهرست می‌کند. اگر این گزینه چندین بار مشخص شود و خط‌مشی امنیتی از قالب خروجی با جزئیات پشتیبانی کند، قالب فهرست طولانی‌تری استفاده می‌شود.

اگر یک command مشخص شده و توسط خط‌مشی امنیتی مجاز باشد، مسیر کامل دستور command به همراه هرگونه arg نمایش داده می‌شود. اگر یک command مشخص شده باشد اما توسط خط‌مشی مجاز نباشد، sudo با مقدار وضعیت 1 خارج خواهد شد.

اعتبارنامه‌های ذخیره‌شده کاربر را حتی اگر کاربر با موفقیت احراز هویت شود، به‌روزرسانی نمی‌کند. بر خلاف پرچم -k، اعتبارنامه‌های ذخیره‌شده موجود در صورت معتبر بودن استفاده می‌شوند. برای تشخیص اینکه چه زمانی اعتبارنامه‌های ذخیره‌شده کاربر معتبر هستند (یا زمانی که نیازی به احراز هویت نیست)، می‌توان از دستور زیر استفاده کرد:
sudo -Nnv

همه خط‌مشی‌های امنیتی از ذخیره‌سازی موقت اعتبارنامه پشتیبانی نمی‌کنند.

از درخواست هرگونه ورودی از کاربر خودداری می‌کند. اگر برای اجرای command به گذرواژه نیاز باشد، sudo یک پیام خطا نمایش داده و خارج می‌شود.
بردار گروه‌های کاربر فراخواننده را بدون تغییر حفظ می‌کند. به‌طور پیش‌فرض، خط‌مشی sudoers بردار گروه را به فهرست گروه‌هایی که کاربر هدف عضو آن‌ها است مقداردهی اولیه می‌کند. با این حال، شناسه‌های کاربری و گروهی واقعی و مؤثر همچنان متناسب با کاربر هدف تنظیم می‌شوند.
از یک اعلان گذرواژه سفارشی به همراه توالی‌های گریز اختیاری استفاده می‌کند. توالی‌های گریز درصدی (‘%’) زیر توسط خط‌مشی sudoers پشتیبانی می‌شوند:
%H
به نام میزبان به همراه نام دامنه بسط می‌یابد (تنها در صورتی که نام میزبان دستگاه کاملاً واجد شرایط باشد یا گزینه fqdn در sudoers(5) تنظیم شده باشد)
%h
به نام میزبان محلی بدون نام دامنه بسط می‌یابد
%p
به نام کاربری که گذرواژه‌اش درخواست می‌شود بسط می‌یابد (از پرچم‌های rootpw، targetpw و runaspw در sudoers(5) پیروی می‌کند)
%U
به نام ورود کاربری که command تحت عنوان آن اجرا خواهد شد بسط می‌یابد (به‌طور پیش‌فرض root است مگر اینکه گزینه -u نیز مشخص شده باشد)
%u
به نام ورود کاربر فراخواننده بسط می‌یابد
%%
دو نویسه متوالی ‘%’ به یک نویسه تکی ‘%’ تبدیل می‌شوند

اعلان سفارشی بر اعلان پیش‌فرض مشخص‌شده توسط خط‌مشی امنیتی یا متغیر محیطی SUDO_PROMPT ارجحیت دارد. در سیستم‌هایی که از PAM استفاده می‌کنند، اعلان سفارشی بر اعلان مشخص‌شده توسط یک ماژول PAM نیز ارجحیت خواهد داشت مگر اینکه پرچم passprompt_override در sudoers غیرفعال شده باشد.

قبل از اجرای command، به دایرکتوری ریشه directory مشخص‌شده تغییر مکان می‌دهد (ببینید: chroot(8)). اگر کاربر مجوز مشخص کردن دایرکتوری ریشه را نداشته باشد، خط‌مشی امنیتی ممکن است خطایی بازگرداند.
دستور command را با بافت امنیتی SELinux که شامل role مشخص‌شده است اجرا می‌کند.
اعلان را در خطای استاندارد می‌نویسد و گذرواژه را به جای استفاده از دستگاه ترمینال، از ورودی استاندارد می‌خواند.
پوسته مشخص‌شده توسط متغیر محیطی SHELL (در صورت تنظیم بودن) یا پوسته مشخص‌شده در مدخل پایگاه داده گذرواژه کاربر فراخواننده را اجرا می‌کند. اگر یک command مشخص شده باشد، با استفاده از گزینه -c به عنوان یک دستور ساده به پوسته منتقل می‌شود. command و هر arg، پس از گریزانده شدن هر نویسه (شامل فاصله) با یک بک‌اسلش (‘\’) به جز حروف و ارقام، زیرخط، خط‌تیره و علامت دلار، با فاصله به هم متصل می‌شوند. اگر هیچ commandی مشخص نشده باشد، یک پوسته تعاملی اجرا می‌شود. اکثر پوسته‌ها هنگامی که یک command مشخص شده باشد در مقایسه با یک نشست تعاملی رفتار متفاوتی دارند؛ برای جزئیات به دفترچه راهنمای پوسته مراجعه کنید.
دستور command را با بافت امنیتی SELinux که شامل type مشخص‌شده است اجرا می‌کند. اگر هیچ typeی مشخص نشده باشد، نوع پیش‌فرض از نقش مشتق می‌شود.
در ارتباط با گزینه -l برای فهرست کردن امتیازات user به جای کاربر فراخواننده استفاده می‌شود. خط‌مشی امنیتی ممکن است فهرست کردن امتیازات کاربران دیگر را محدود کند. هنگام استفاده از خط‌مشی sudoers، گزینه -U محدود به کاربر root و کاربرانی است که دارای امتیاز “list” برای user مشخص‌شده هستند یا توانایی اجرای هر commandی را به عنوان root یا user روی میزبان فعلی دارند.
برای تنظیم یک مهلت زمانی (timeout) برای command استفاده می‌شود. اگر مهلت زمانی قبل از خروج command منقضی شود، command خاتمه داده خواهد شد. خط‌مشی امنیتی ممکن است توانایی کاربر را برای تنظیم مهلت‌های زمانی محدود کند. خط‌مشی sudoers نیاز دارد که مهلت‌های زمانی مشخص‌شده توسط کاربر به صراحت فعال شده باشند.
دستور command را به عنوان کاربری غیر از کاربر هدف پیش‌فرض (معمولاً root) اجرا می‌کند. user می‌تواند یک نام کاربری یا یک شناسه کاربری عددی (UID) باشد که با نویسه ‘#’ پیشوند شده است (برای مثال، ‘#0’ برای UID 0). هنگام اجرای commandها به عنوان یک UID، بسیاری از پوسته‌ها نیاز دارند که ‘#’ با یک بک‌اسلش (‘\’) گریزانده شود. برخی از خط‌مشی‌های امنیتی ممکن است UIDها را به موارد فهرست‌شده در پایگاه داده گذرواژه محدود کنند. خط‌مشی sudoers تا زمانی که گزینه targetpw تنظیم نشده باشد، اجازه استفاده از UIDهایی را می‌دهد که در پایگاه داده گذرواژه نیستند. سایر خط‌مشی‌های امنیتی ممکن است از این قابلیت پشتیبانی نکنند.
رشته نسخه sudo و همچنین رشته نسخه هر پلاگین پیکربندی‌شده را چاپ می‌کند. اگر کاربر فراخواننده از قبل root باشد، گزینه -V گزینه‌های ارسال‌شده به configure در زمان ساخت sudo را نمایش می‌دهد؛ پلاگین‌ها ممکن است اطلاعات بیشتری مانند گزینه‌های پیش‌فرض را نمایش دهند.
اعتبارنامه‌های ذخیره‌شده موقت کاربر را به‌روزرسانی می‌کند و در صورت لزوم هویت کاربر را احراز می‌نماید. برای پلاگین sudoers، این امر مهلت زمانی sudo را به‌طور پیش‌فرض به مدت 15 دقیقه دیگر تمدید می‌کند، اما هیچ commandی را اجرا نمی‌کند. همه خط‌مشی‌های امنیتی از اعتبارنامه‌های ذخیره‌شده پشتیبانی نمی‌کنند.
--
از -- برای تعیین پایان گزینه‌های sudo استفاده می‌شود. گزینه‌های بعدی به command منتقل می‌شوند.

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

متغیرهای محیطی که باید برای command تنظیم شوند نیز ممکن است به عنوان گزینه‌هایی به sudo به صورت VAR=value ارسال شوند، برای مثال LD_LIBRARY_PATH=/usr/local/pkg/lib. متغیرهای محیطی ممکن است مشمول محدودیت‌های اعمال‌شده توسط پلاگین خط‌مشی امنیتی باشند. خط‌مشی sudoers متغیرهای محیطی ارسال‌شده به عنوان گزینه را با یک تفاوت مهم تحت همان محدودیت‌های متغیرهای محیطی موجود قرار می‌دهد. اگر گزینه setenv در sudoers تنظیم شده باشد، دستور command برای اجرا دارای برچسب SETENV باشد یا دستور command تطبیق‌داده‌شده برابر با ALL باشد، کاربر ممکن است متغیرهایی را تنظیم کند که در غیر این صورت ممنوع بودند. برای اطلاعات بیشتر sudoers(5) را ببینید.

هنگامی که sudo یک command را اجرا می‌کند، خط‌مشی امنیتی محیط اجرای command را مشخص می‌سازد. به‌طور معمول، شناسه‌های کاربری و گروهی واقعی و مؤثر به گونه‌ای تنظیم می‌شوند که با شناسه‌های کاربر هدف، همان‌طور که در پایگاه داده گذرواژه مشخص شده است، مطابقت داشته باشند و بردار گروه بر اساس پایگاه داده گروه مقداردهی اولیه می‌شود (مگر اینکه گزینه -P مشخص شده باشد).

پارامترهای زیر ممکن است توسط خط‌مشی امنیتی مشخص شوند:

•
شناسه کاربری (user-ID) واقعی و مؤثر
•
شناسه گروهی (group-ID) واقعی و مؤثر
•
شناسه‌های گروهی تکمیلی
•
فهرست محیط (متغیرهای محیطی)
•
دایرکتوری کاری جاری
•
ماسک حالت ایجاد فایل (umask)
•
نقش و نوع SELinux
•
اولویت زمان‌بندی (همان مقدار nice)

دو روش متمایز وجود دارد که sudo می‌تواند یک command را اجرا کند.

اگر یک پلاگین ثبت وقایع I/O برای ثبت ورودی/خروجی ترمینال پیکربندی شده باشد، یا اگر خط‌مشی امنیتی به صراحت آن را درخواست کند، یک شبه‌ترمینال جدید (“pty”) تخصیص می‌یابد و از fork(2) برای ایجاد یک فرایند sudo دوم به نام monitor (ناظر) استفاده می‌شود. فرایند monitor یک نشست ترمینال جدید با رهبری خود و با pty به عنوان ترمینال کنترل‌کننده ایجاد می‌کند، مجدداً fork(2) را فراخوانی می‌کند، محیط اجرا را همان‌طور که در بالا شرح داده شد راه‌اندازی می‌کند و سپس از فراخوان سیستمی execve(2) برای اجرای command در فرایند فرزند استفاده می‌نماید. فرایند monitor برای رله کردن سیگنال‌های کنترل کار (job control) بین ترمینال کاربر و pty که command در آن در حال اجرا است، وجود دارد. این امر تعلیق (suspend) و ازسرگیری (resume) عادی command را ممکن می‌سازد. بدون monitor، دستور command در وضعیتی قرار می‌گرفت که استاندارد POSIX آن را “گروه فرایند یتیم (orphaned process group)” می‌نامد و هیچ سیگنال کنترل کاری را از هسته دریافت نمی‌کرد. هنگامی که command خارج می‌شود یا توسط یک سیگنال خاتمه می‌یابد، monitor وضعیت خروج command را به فرایند اصلی sudo منتقل کرده و خارج می‌شود. پس از دریافت وضعیت خروج command، فرایند اصلی sudo وضعیت خروج command را به تابع close خط‌مشی امنیتی و همچنین تابع close هر پلاگین حسابرسی پیکربندی‌شده ارسال کرده و خارج می‌شود.

اگر از pty استفاده نشود، sudo فراخوان fork(2) را صدا می‌زند، محیط اجرا را همان‌طور که در بالا شرح داده شد آماده می‌کند و از فراخوان سیستمی execve(2) برای اجرای command در فرایند فرزند استفاده می‌نماید. فرایند اصلی sudo صبر می‌کند تا command کامل شود، سپس وضعیت خروج command را به تابع close خط‌مشی امنیتی و تابع close هر پلاگین حسابرسی پیکربندی‌شده ارسال کرده و خارج می‌شود. به عنوان یک حالت خاص، اگر پلاگین خط‌مشی تابع close را تعریف نکرده باشد، sudo به جای اینکه ابتدا fork(2) را صدا بزند، command را مستقیماً اجرا خواهد کرد. پلاگین خط‌مشی sudoers تنها زمانی تابع close را تعریف می‌کند که ثبت وقایع I/O فعال باشد، یک pty مورد نیاز باشد، یک نقش SELinux مشخص شده باشد، command یک مهلت زمانی وابسته داشته باشد، یا گزینه‌های pam_session یا pam_setcred فعال باشند. هر دوی pam_session و pam_setcred به‌طور پیش‌فرض در سیستم‌های استفاده‌کننده از PAM فعال هستند.

در سیستم‌هایی که از PAM استفاده می‌کنند، تابع close خط‌مشی امنیتی مسئول بستن نشست PAM است. این تابع همچنین ممکن است وضعیت خروج command را ثبت کند.

هنگامی که command به عنوان فرزند فرایند sudo اجرا می‌شود، sudo سیگنال‌هایی را که دریافت می‌کند به command رله خواهد کرد. سیگنال‌های SIGINT و SIGQUIT فقط زمانی رله می‌شوند که command در یک pty جدید اجرا شده باشد یا زمانی که سیگنال توسط یک فرایند کاربری ارسال شده باشد، نه هسته. این امر از دریافت دو باره SIGINT توسط command در هر بار فشار دادن control-C توسط کاربر جلوگیری می‌کند. برخی سیگنال‌ها، مانند SIGSTOP و SIGKILL، قابل دریافت و گرفتن نیستند و بنابراین به command رله نخواهند شد. به عنوان یک قاعده کلی، زمانی که مایل به تعلیق یک command در حال اجرا توسط sudo هستید، باید به جای SIGSTOP از SIGTSTP استفاده شود.

به عنوان یک حالت خاص، sudo سیگنال‌هایی را که توسط همان command در حال اجرا ارسال شده باشند، رله نخواهد کرد. این کار مانع از کشته شدن تصادفی command توسط خودش می‌شود. در برخی سیستم‌ها، ابزار reboot(8) قبل از راه‌اندازی مجدد سیستم، سیگنال SIGTERM را به تمامی فرایندهای غیرسیستمی غیر از خودش ارسال می‌کند. این امر مانع از رله کردن سیگنال SIGTERM دریافتی توسط sudo به reboot(8) می‌شود، که در غیر این صورت ممکن بود قبل از ریبوت واقعی سیستم خارج شود و سیستم را در وضعیتی نیمه‌مرده مشابه حالت تک‌کاربره رها کند. با این حال، توجه داشته باشید که این بررسی فقط برای command اجراشده توسط sudo اعمال می‌شود و شامل سایر فرایندهایی که ممکن است آن command ایجاد کند نمی‌شود. در نتیجه، اجرای اسکریپتی که reboot(8) یا shutdown(8) را از طریق sudo فراخوانی می‌کند ممکن است باعث شود سیستم به این وضعیت نامشخص بیفتد، مگر اینکه reboot(8) یا shutdown(8) به جای system() (که یک پوسته را بین command و فرایند فراخواننده حائل می‌کند)، با استفاده از خانواده توابع exec() اجرا شوند.

پلاگین‌ها ممکن است از طریق دستورالعمل‌های Plugin در فایل sudo.conf(5) مشخص شوند. آن‌ها ممکن است به عنوان اشیاء اشتراکی پویا (dynamic shared objects) بارگیری شوند (در سیستم‌هایی که از آن‌ها پشتیبانی می‌کنند)، یا مستقیماً در باینری sudo کامپایل گردند. اگر هیچ فایل sudo.conf(5) وجود نداشته باشد، یا اگر حاوی هیچ خط Plugin نباشد، sudo از sudoers(5) برای پلاگین‌های خط‌مشی، حسابرسی و ثبت وقایع I/O استفاده خواهد کرد. برای جزئیات مربوط به فایل /etc/sudo.conf راهنمای sudo.conf(5) و برای اطلاعات بیشتر درباره معماری پلاگین sudo راهنمای sudo_plugin(5) را ببینید.

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

اگر گزینه -l بدون یک command مشخص شده باشد، در صورتی که کاربر مجاز به اجرای sudo باشد و با موفقیت احراز هویت شده باشد (همان‌طور که توسط خط‌مشی امنیتی لازم است)، sudo با مقدار 0 خارج خواهد شد. اگر یک command همراه با گزینه -l مشخص شده باشد، مقدار خروج تنها در صورتی 0 خواهد بود که command توسط خط‌مشی امنیتی مجاز باشد، در غیر این صورت 1 خواهد بود.

اگر خطای احراز هویت، مشکل پیکربندی/مجوز وجود داشته باشد، یا اگر command داده‌شده نتواند اجرا شود، sudo با مقدار 1 خارج می‌شود. در حالت اخیر، رشته خطا در خطای استاندارد چاپ می‌شود. اگر sudo نتواند روی یک یا چند مدخل در PATH کاربر فراخوان stat(2) را اجرا کند، خطایی در خطای استاندارد چاپ می‌شود. (اگر دایرکتوری وجود نداشته باشد یا واقعاً یک دایرکتوری نباشد، مدخل نادیده گرفته شده و هیچ خطایی چاپ نمی‌شود.) این حالت در شرایط عادی نباید رخ دهد. رایج‌ترین دلیل برای اینکه stat(2) پیام “permission denied” برگرداند این است که شما در حال اجرای یک automounter هستید و یکی از دایرکتوری‌های موجود در PATH شما روی ماشینی قرار دارد که در حال حاضر غیرقابل دسترس است.

دستور sudo تلاش می‌کند هنگام اجرای commandهای خارجی ایمن عمل کند.

برای جلوگیری از جعل دستور (command spoofing)، sudo هنگام جستجوی یک command در PATH کاربر، مقادیر "." و "" (که هر دو نشان‌دهنده دایرکتوری جاری هستند) را در آخر بررسی می‌کند (اگر یکی از آن‌ها یا هر دو در PATH باشند). بسته به خط‌مشی امنیتی، متغیر محیطی PATH کاربر ممکن است اصلاح شود، جایگزین گردد یا بدون تغییر به برنامه‌ای که sudo اجرا می‌کند ارسال شود.

کاربران هرگز نباید دارای امتیازات sudo برای اجرای فایل‌هایی باشند که توسط کاربر قابل نوشتن هستند یا در دایرکتوری‌ای قرار دارند که توسط کاربر قابل نوشتن است. اگر کاربر بتواند command را تغییر داده یا جایگزین کند، هیچ راهی برای محدود کردن اینکه چه commandهای اضافی دیگری را می‌تواند اجرا نماید وجود ندارد.

به‌طور پیش‌فرض، sudo تنها commandی را که به صراحت اجرا می‌کند ثبت خواهد کرد. اگر کاربری دستوری مانند ‘sudo su’ یا ‘sudo sh’ را اجرا کند، commandهای بعدی که از آن پوسته اجرا می‌شوند مشمول خط‌مشی امنیتی sudo نخواهند بود. همین امر برای commandهایی که امکان گریز به پوسته (shell escapes) را فراهم می‌کنند نیز صادق است (شامل اکثر ویرایشگرها). اگر ثبت وقایع I/O فعال باشد، ورودی و/یا خروجی commandهای بعدی ثبت خواهد شد، اما گزارش‌های وقایع سنتی برای آن commandها وجود نخواهد داشت. به همین دلیل، هنگام دسترسی دادن به کاربران برای اجرای commandها از طریق sudo، باید دقت شود تا بررسی گردد که command سهواً یک پوسته موثر root در اختیار کاربر قرار ندهد. برای اطلاعات درباره راه‌های رفع این مشکل، بخش Preventing shell escapes در sudoers(5) را ببینید.

برای جلوگیری از افشای اطلاعات بالقوه حساس، sudo به‌طور پیش‌فرض در حین اجرای خود تخلیه حافظه هسته (core dumps) را غیرفعال می‌کند (آن‌ها برای commandی که اجرا می‌شود مجدداً فعال می‌گردند). این رسم تاریخی مربوط به زمانی است که اکثر سیستم‌های عامل به فرایندهای set-user-ID اجازه می‌دادند به‌طور پیش‌فرض core dump ایجاد کنند. برای کمک به اشکال‌زدایی کرش‌های sudo، ممکن است بخواهید با تنظیم “disable_coredump” روی false در فایل sudo.conf(5) به صورت زیر، تخلیه حافظه هسته را مجدداً فعال کنید:

Set disable_coredump false

برای اطلاعات بیشتر راهنمای sudo.conf(5) را ببینید.

دستور sudo از متغیرهای محیطی زیر استفاده می‌کند. خط‌مشی امنیتی بر محتوای واقعی محیط command کنترل دارد.

ویرایشگر پیش‌فرض برای استفاده در حالت -e (sudoedit) در صورتی که نه SUDO_EDITOR و نه VISUAL تنظیم نشده باشند.
هنگامی که گزینه -i مشخص شده باشد، یا زمانی که env_reset در sudoers فعال باشد (مگر اینکه MAIL در فهرست env_keep وجود داشته باشد)، روی اسپول ایمیل کاربر هدف تنظیم می‌شود.
هنگامی که گزینه‌های -i یا -H مشخص شده باشند، هنگامی که گزینه -s مشخص شده و set_home در sudoers تنظیم شده باشد، زمانی که always_set_home در sudoers فعال باشد، یا زمانی که env_reset در sudoers فعال باشد و HOME در فهرست env_keep حضور نداشته باشد، روی دایرکتوری خانگی کاربر هدف تنظیم می‌شود.
هنگامی که گزینه -i مشخص شده باشد، زمانی که گزینه set_logname در sudoers فعال باشد، یا زمانی که گزینه env_reset در sudoers فعال باشد (مگر اینکه LOGNAME در فهرست env_keep حضور داشته باشد)، روی نام ورود کاربر هدف تنظیم می‌شود.
ممکن است توسط خط‌مشی امنیتی بازنویسی (override) شود.
برای تعیین پوسته‌ای که با گزینه -s اجرا می‌شود استفاده می‌گردد.
مسیر یک برنامه کمکی را مشخص می‌کند که در صورت عدم دسترسی به ترمینال یا در صورت مشخص بودن گزینه -A، برای خواندن گذرواژه استفاده می‌شود.
روی دستور command اجراشده توسط sudo، شامل هرگونه arg تنظیم می‌شود. آرگومان‌های arg برای جلوگیری از خطای بالقوه اجرا، در 4096 نویسه کوتاه می‌شوند.
ویرایشگر پیش‌فرض برای استفاده در حالت -e (sudoedit).
روی شناسه گروهی (GID) کاربری که sudo را فراخوانی کرده تنظیم می‌شود.
به عنوان اعلان گذرواژه پیش‌فرض استفاده می‌شود مگر اینکه گزینه -p مشخص شده باشد.
در صورت تنظیم بودن، PS1 روی مقدار آن برای برنامه‌ای که در حال اجرا است تنظیم می‌شود.
روی شناسه کاربری (UID) کاربری که sudo را فراخوانی کرده تنظیم می‌شود.
روی نام ورود کاربری که sudo را فراخوانی کرده تنظیم می‌شود.
روی همان مقدار LOGNAME که در بالا توضیح داده شد تنظیم می‌شود.
ویرایشگر پیش‌فرض برای استفاده در حالت -e (sudoedit) در صورتی که SUDO_EDITOR تنظیم نشده باشد.

/etc/sudo.conf
پیکربندی پیشانه (front-end) sudo

مثال‌های زیر فرض می‌کنند که خط‌مشی امنیتی به درستی پیکربندی شده است.

برای دریافت فهرست فایل‌های یک دایرکتوری غیرقابل خواندن:

$ sudo ls /usr/local/protected

برای فهرست کردن دایرکتوری خانگی کاربر yaz روی ماشینی که در آن سیستم فایل حاوی ~yaz به عنوان root صادر (export) نشده است:

$ sudo -u yaz ls ~yaz

برای ویرایش فایل index.html به عنوان کاربر www:

$ sudoedit -u www ~www/htdocs/index.html

برای مشاهده لاگ‌های سیستمی که تنها برای root و کاربران گروه adm قابل دسترسی هستند:

$ sudo -g adm more /var/log/syslog

برای اجرای یک ویرایشگر به عنوان jim با یک گروه اصلی متفاوت:

$ sudoedit -u jim -g audio ~jim/sound.txt

برای خاموش کردن یک ماشین:

$ sudo shutdown -r +15 "quick reboot"

برای تهیه فهرست مصرف دایرکتوری‌های موجود در پارتیشن /home. دستورات commands در یک زیرپوسته اجرا می‌شوند تا دستور ‘cd’ و تغییر مسیر فایل کار کنند:

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

پیام‌های خطای تولیدشده توسط sudo شامل موارد زیر است:

به‌طور پیش‌فرض، sudoedit هنگامی که هر یک از دایرکتوری‌های والد توسط کاربر فراخواننده قابل نوشتن باشد، اجازه ویرایش فایل را نمی‌دهد. این کار از بروز شرایط رقابتی (race condition) که می‌تواند به کاربر اجازه بازنویسی یک فایل اختیاری را بدهد جلوگیری می‌کند. برای اطلاعات بیشتر گزینه sudoedit_checkdir در sudoers(5) را ببینید.
به‌طور پیش‌فرض، sudoedit هنگام باز کردن فایل‌ها پیوندهای نمادین را دنبال نمی‌کند. برای اطلاعات بیشتر گزینه sudoedit_follow در sudoers(5) را ببینید.
دستور sudo با امتیازات root اجرا نشد. فایل باینری sudo باید متعلق به کاربر root باشد و بیت set-user-ID آن تنظیم شده باشد. همچنین، نباید روی یک سیستم فایل که با گزینه ‘nosuid’ سوار (mount) شده است یا روی یک سیستم فایل NFS که uid 0 را به یک uid بدون امتیاز نگاشت می‌کند قرار داشته باشد.
دستور sudo با امتیازات root اجرا نشد. فایل باینری sudo مالک و مجوزهای مناسبی دارد اما همچنان با امتیازات root اجرا نشده است. رایج‌ترین دلیل این امر این است که سیستم فایلی که باینری sudo روی آن قرار دارد با گزینه ‘nosuid’ سوار شده است یا یک سیستم فایل NFS است که uid 0 را به یک uid بدون امتیاز نگاشت می‌کند.
خطایی در هنگام بارگیری یا مقداردهی اولیه پلاگین‌های مشخص‌شده در sudo.conf(5) رخ داده است.
یک یا چند نام متغیر محیطی مشخص‌شده از طریق گزینه -E شامل علامت مساوی (‘=’) بوده‌اند. آرگومان‌های گزینه -E باید نام‌های متغیرهای محیطی بدون مقدار وابسته باشند.
هنگامی که sudo تلاش کرد تا گذرواژه را بخواند، هیچ نویسه‌ای دریافت نکرد. این ممکن است در صورتی رخ دهد که هیچ ترمینالی در دسترس نباشد (یا گزینه -S مشخص شده باشد) و ورودی استاندارد از /dev/null هدایت شده باشد.
دستور sudo نیاز به خواندن گذرواژه دارد اما سازوکاری برای انجام این کار در دسترس نیست. ترمینالی برای خواندن گذرواژه وجود ندارد، sudo برای خواندن از ورودی استاندارد پیکربندی نشده است، گزینه -S استفاده نشده است و هیچ برنامه کمکی askpass چه از طریق فایل sudo.conf(5) یا از طریق متغیر محیطی SUDO_ASKPASS مشخص نشده است.
دستور sudoedit نتوانست دایرکتوری موقت قابل استفاده‌ای برای ذخیره فایل‌های میانی خود پیدا کند.
دستور sudo توسط فرایندی اجرا شده است که پرچم “no new privileges” لینوکس برای آن تنظیم شده است. این امر باعث نادیده گرفته شدن بیت set-user-ID هنگام اجرای یک فایل اجرایی می‌شود که مانع از کارکرد sudo خواهد شد. محتمل‌ترین علت این امر، اجرای sudo درون یک کانتینر است که این پرچم را تنظیم کرده است. مستندات را بررسی کنید تا ببینید آیا امکان پیکربندی کانتینر به گونه‌ای که پرچم تنظیم نشود وجود دارد یا خیر.
دستور sudo با امتیازات root اجرا نشد. فایل باینری sudo مالک یا مجوزهای صحیحی ندارد. این فایل باید متعلق به کاربر root باشد و بیت set-user-ID آن تنظیم شده باشد.
اجرای sudoedit تنها در سیستم‌هایی ممکن است که از تنظیم شناسه کاربری موثر پشتیبانی می‌کنند.
کاربر قبل از انقضای مهلت زمانی گذرواژه (به‌طور پیش‌فرض 5 دقیقه)، گذرواژه‌ای وارد نکرد.
شناسه کاربری شما در پایگاه داده passwd سیستم وجود ندارد.
تنظیم متغیرهای محیطی تنها هنگام اجرای یک command امکان‌پذیر است. هنگام ویرایش یک فایل، ویرایشگر با محیط بدون تغییر کاربر اجرا می‌شود.

اگر به کاربری اجازه داده شود تا دستورات commands دلخواهی را از طریق sudo اجرا کند، هیچ راه آسانی برای جلوگیری از دستیابی آن کاربر به پوسته root وجود ندارد. همچنین، بسیاری از برنامه‌ها (مانند ویرایشگرها) به کاربر اجازه می‌دهند تا commandها را از طریق گریزهای پوسته (shell escapes) اجرا کنند، و در نتیجه بررسی‌های sudo را دور بزنند. با این حال، در اکثر سیستم‌ها می‌توان با قابلیت noexec پلاگین sudoers(5) از گریزهای پوسته جلوگیری کرد.

اجرای مستقیم دستور ‘cd’ از طریق sudo بی‌معنی است، برای مثال:

$ sudo cd /usr/local/protected

زیرا پس از خروج دستور command، فرایند والد (پوسته شما) همچنان همان خواهد بود. می‌توان از گزینه -D برای اجرای یک command در یک دایرکتوری directory خاص استفاده کرد.

اجرای اسکریپت‌های پوسته از طریق sudo می‌تواند همان باگ‌های هسته را آشکار کند که اسکریپت‌های پوسته set-user-ID را در برخی سیستم‌های عامل ناامن می‌سازند (اگر سیستم‌عامل شما دارای دایرکتوری /dev/fd/ باشد، اسکریپت‌های پوسته set-user-ID عموماً ایمن هستند).

برای تاریخچه مختصری از sudo، به فایل HISTORY.md در توزیع sudo (https://www.sudo.ws/about/history/) مراجعه کنید.

افراد زیادی در طول سال‌ها روی sudo کار کرده‌اند؛ این نسخه عمدتاً شامل کدهای نوشته‌شده توسط افراد زیر است:

Todd C. Miller

برای فهرست کاملی از افرادی که در توسعه sudo مشارکت داشته‌اند، فایل CONTRIBUTORS.md در توزیع sudo (https://www.sudo.ws/about/contributors/) را ببینید.

اگر فکر می‌کنید باگی در sudo پیدا کرده‌اید، می‌توانید گزارش باگ را در https://bugzilla.sudo.ws/ ارسال کنید.

پشتیبانی رایگان محدود از طریق فهرست پستی sudo-users در دسترس است، برای اشتراک یا جستجو در آرشیوها به https://www.sudo.ws/mailman/listinfo/sudo-users مراجعه کنید.

نرم‌افزار sudo به صورت “همان‌گونه که هست (AS IS)” ارائه می‌شود و هرگونه ضمانت صریح یا ضمنی، از جمله، اما نه محدود به، ضمانت‌های ضمنی قابلیت خرید و فروش و تناسب برای یک هدف خاص سلب می‌شود. برای جزئیات کامل به فایل LICENSE.md توزیع‌شده با sudo یا https://www.sudo.ws/about/license/ مراجعه کنید.

حق نشر © 1994-1996, 1998-2005, 2007-2023 متعلق به Todd C. Miller <Todd.Miller@sudo.ws>.
این نرم‌افزار تحت شرایط مجوز ISC توزیع می‌شود. برای جزئیات کامل به فایل LICENSE.md توزیع‌شده با sudo یا https://www.sudo.ws/about/license/ مراجعه کنید.

su(1), stat(2), login_cap(3), passwd(5), sudo.conf(5), sudo_plugin(5), sudoers(5), sudoers_timestamp(5), sudoreplay(8), visudo(8)

January 16, 2023 Sudo 1.9.13p3