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

visudo - ویرایش امن فایل sudoers

visudo [-chIOPqsV] [[-f] sudoers]

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

اگر فایل sudoers وجود نداشته باشد، ایجاد خواهد شد؛ مگر اینکه ویرایشگر بدون ذخیره و نوشتن در فایل خارج شود.

visudo فایل sudoers را پس از ویرایش تجزیه می‌کند و در صورت وجود خطای نحوی، تغییرات را ذخیره نخواهد کرد. به محض یافتن خطا، visudo پیامی مبنی بر شماره خط یا خطوطی که خطا در آن‌ها رخ داده است چاپ می‌کند و کاربر اعلان “What now?” (اکنون چه کار کنیم؟) را دریافت خواهد کرد. در این مرحله کاربر می‌تواند با وارد کردن ‘e’ فایل sudoers را دوباره ویرایش کند، با وارد کردن ‘x’ بدون ذخیره تغییرات خارج شود، یا با وارد کردن ‘Q’ خارج شده و تغییرات را ذخیره کند. گزینه ‘Q’ باید با احتیاط بسیار زیاد استفاده شود؛ زیرا اگر visudo معتقد باشد خطای نحوی وجود دارد، sudo نیز دقیقاً همین‌طور فکر خواهد کرد. اگر پس از تشخیص خطای نحوی، برای ویرایش مجدد فایل sudoers کلید ‘e’ فشرده شود، مکان‌نما روی خطی که خطا در آن رخ داده است قرار می‌گیرد (در صورتی که ویرایشگر از این ویژگی پشتیبانی کند).

دو تنظیم در sudoers وجود دارد که مشخص می‌کند visudo کدام ویرایشگر را اجرا کند:

فهرستی از ویرایشگرهای مجاز برای استفاده با visudo که با دونقطه (‘:’) از هم جدا شده‌اند. visudo ویرایشگری را انتخاب می‌کند که با متغیر محیطی SUDO_EDITOR، VISUAL یا EDITOR کاربر مطابقت داشته باشد (در صورت امکان)، وگرنه اولین ویرایشگر موجود و قابل‌اجرا در فهرست را انتخاب می‌کند. دستور sudo متغیرهای محیطی SUDO_EDITOR، VISUAL یا EDITOR را حفظ نمی‌کند، مگر اینکه در فهرست env_keep حضور داشته باشند یا گزینه env_reset در فایل sudoers غیرفعال شده باشد. مسیر ویرایشگر پیش‌فرض در زمان کامپایل از طریق گزینه پیکربندی --with-editor تنظیم می‌شود.
در صورت تنظیم بودن، visudo پیش از رجوع به فهرست پیش‌فرض ویرایشگرها، از مقدار متغیرهای محیطی SUDO_EDITOR، VISUAL یا EDITOR استفاده می‌کند. از آنجا که visudo معمولاً به عنوان کاربر ریشه (root) اجرا می‌شود، این گزینه ممکن است به کاربری با امتیازات visudo اجازه دهد دستورات دلخواه را بدون ثبت وقایع به عنوان کاربر ریشه اجرا کند. یک راهکار جایگزین این است که فهرستی از ویرایشگرهای “امن” (safe) که با دونقطه از هم جدا شده‌اند در متغیر editor قرار داده شود. در این صورت visudo تنها در صورتی از متغیرهای SUDO_EDITOR، VISUAL یا EDITOR استفاده می‌کند که با مقداری مشخص‌شده در editor مطابقت داشته باشند. اگر فلگ env_reset فعال باشد، هنگام فراخوانی visudo از طریق sudo، متغیرهای محیطی SUDO_EDITOR، VISUAL و/یا EDITOR باید در فهرست env_keep موجود باشند تا فلگ env_editor کار کند. مقدار پیش‌فرض on است که می‌تواند در زمان کامپایل از طریق گزینه پیکربندی --with-env-editor تنظیم شود.

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

حالت check-only (فقط بررسی) را فعال می‌کند. فایل موجود sudoers (و هر فایل مشمول‌شده در آن) برای خطاهای نحوی بررسی می‌شود. اگر مسیر فایل sudoers مشخص نشده باشد، visudo همچنین مالکیت و مجوزهای دسترسی فایل را نیز بررسی می‌کند (گزینه‌های -O و -P را ببینید). پیامی در خروجی استاندارد چاپ می‌شود که وضعیت sudoers را شرح می‌دهد، مگر اینکه گزینه -q مشخص شده باشد. اگر بررسی با موفقیت به پایان برسد، visudo با مقدار 0 خارج می‌شود. در صورت بروز خطا، visudo با مقدار 1 خارج خواهد شد.
مکان فایل sudoers دیگری را مشخص می‌کند؛ در زیر ببینید. از نسخه 1.8.27 به بعد، مسیر فایل sudoers را می‌توان بدون استفاده از گزینه -f نیز مشخص کرد.
نمایش یک پیام راهنمای کوتاه در خروجی استاندارد و خروج.
ویرایش فایل‌های مشمول‌شده (include files) را غیرفعال می‌کند، مگر اینکه یک خطای نحوی از قبل در آن‌ها وجود داشته باشد. به‌طور پیش‌فرض، visudo فایل اصلی sudoers و هر فایل مشمول‌شده از طریق دستورالعمل‌های @include یا #include را ویرایش می‌کند. فایل‌های مشمول‌شده از طریق دستورالعمل‌های @includedir یا #includedir هرگز ویرایش نمی‌شوند، مگر اینکه حاوی یک خطای نحوی باشند.
اعمال مالکیت پیش‌فرض (کاربر و گروه) بر فایل sudoers. در حالت ویرایش، مالک فایل ویرایش‌شده روی مقدار پیش‌فرض تنظیم می‌شود. در حالت بررسی (-c)، اگر مالک نادرست باشد یک خطا گزارش داده می‌شود. اگر فایل sudoers مشخص نشده باشد، این گزینه به‌طور پیش‌فرض فعال است.
اعمال مجوزهای دسترسی پیش‌فرض (mode) بر فایل sudoers. در حالت ویرایش، مجوزهای فایل ویرایش‌شده روی مقدار پیش‌فرض تنظیم می‌شود. در حالت بررسی (-c)، اگر مجوزهای دسترسی فایل نادرست باشد یک خطا گزارش داده می‌شود. اگر فایل sudoers مشخص نشده باشد، این گزینه به‌طور پیش‌فرض فعال است.
حالت quiet (بی‌صدا) را فعال می‌کند. در این حالت جزئیات مربوط به خطاهای نحوی چاپ نمی‌شود. این گزینه فقط در ترکیب با گزینه -c کاربرد دارد.
بررسی strict (سخت‌گیرانه) فایل sudoers را فعال می‌کند. اگر به یک نام مستعار (alias) ارجاع داده شده باشد اما در واقع تعریف نشده باشد، یا اگر چرخه‌ای (cycle) در یک نام مستعار وجود داشته باشد، visudo آن را یک خطای نحوی در نظر می‌گیرد. امکان تمایز قائل شدن بین یک نام مستعار و نام میزبان یا نام کاربری که صرفاً از حروف بزرگ، ارقام و کاراکتر زیرخط (‘_’) تشکیل شده باشد وجود ندارد.
نسخه‌های نگارش دستور visudo و گرامر sudoers را چاپ کرده و خارج می‌شود.

می‌توان یک فایل sudoers دیگر را به جای فایل پیش‌فرض، /etc/sudoers، مشخص کرد. فایل موقت مورد استفاده، همان فایل sudoers مشخص‌شده است که عبارت “.tmp” به انتهای آن افزوده می‌شود. تنها در حالت check-only (فقط بررسی)، می‌توان از ‘-’ استفاده کرد تا مشخص شود که sudoers از ورودی استاندارد خوانده خواهد شد. از آنجا که خط‌مشی به طور کامل و سراسری ارزیابی می‌شود، بررسی مجزای یک فایل مشمول‌شده sudoers برای خطاهای نحوی کافی نیست.

نسخه‌های 1.8.4 و بالاتر visudo از یک چارچوب اشکال‌زدایی انعطاف‌پذیر پشتیبانی می‌کنند که از طریق خطوط Debug در فایل sudo.conf(5) پیکربندی می‌شود.

با شروع از sudo 1.8.12، دستور visudo همچنین آرگومان‌های افزونه sudoers را تجزیه می‌کند تا نام مسیر پیش‌فرض sudoers، شناسه کاربری (user-ID)، شناسه گروه (group-ID) و حالت دسترسی فایل (file mode) را بازنویسی کند. این آرگومان‌ها، در صورت وجود، باید پس از مسیر افزونه (یعنی پس از sudoers.so) فهرست شوند. می‌توان چندین آرگومان را با فاصله از یکدیگر مشخص کرد. برای مثال:

Plugin sudoers_policy sudoers.so sudoers_mode=0400

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

آرگومان sudoers_file می‌تواند برای جایگزینی مسیر پیش‌فرض فایل sudoers استفاده شود.
آرگومان sudoers_uid می‌تواند برای جایگزینی مالک پیش‌فرض فایل sudoers استفاده شود. این آرگومان باید به عنوان یک شناسه کاربری عددی مشخص شود.
آرگومان sudoers_gid می‌تواند برای جایگزینی گروه پیش‌فرض فایل sudoers استفاده شود. این آرگومان باید به عنوان یک شناسه گروه عددی (نه نام گروه) مشخص شود.
آرگومان sudoers_mode می‌تواند برای جایگزینی حالت پیش‌فرض فایل sudoers استفاده شود. این آرگومان باید به صورت یک مقدار در مبنای هشت (اکتال) مشخص شود.

برای اطلاعات بیشتر در مورد پیکربندی sudo.conf(5)، به صفحه راهنمای آن مراجعه کنید.

بسته به مقدار تنظیمات editor و env_editor در sudoers، ممکن است متغیرهای محیطی زیر بررسی شوند:

توسط visudo به عنوان ویرایشگر مورد استفاده فراخوانی می‌شود
در صورتی که SUDO_EDITOR تنظیم نشده باشد، توسط visudo استفاده می‌شود
در صورتی که نه SUDO_EDITOR و نه VISUAL تنظیم نشده باشند، توسط visudo استفاده می‌شود

/etc/sudo.conf
پیکربندی پیشانه (front-end) دستور Sudo
/etc/sudoers
فهرست اینکه چه کسی چه دستوری را می‌تواند اجرا کند
/etc/sudoers.tmp
فایل موقت پیش‌فرض استفاده‌شده توسط visudo

علاوه بر گزارش خطاهای نحوی sudoers، دستور visudo ممکن است پیام‌های زیر را تولید کند:

شخص دیگری در حال حاضر در حال ویرایش فایل sudoers است.
/etc/sudoers: Permission denied
شما visudo را به عنوان کاربر ریشه (root) اجرا نکرده‌اید.
شناسه کاربری شما در پایگاه‌داده passwd سیستم وجود ندارد.
یا در تلاش برای استفاده از یک {User,Runas,Host,Cmnd}_Alias تعریف‌نشده هستید، یا یک نام کاربری یا نام میزبان در لیست دارید که صرفاً از حروف بزرگ، ارقام و کاراکتر زیرخط (‘_’) تشکیل شده است. در حالت دوم، می‌توانید هشدارها را نادیده بگیرید (زیرا sudo ایرادی نخواهد گرفت). این پیام با نام مسیر فایل sudoers و شماره خطی که نام مستعار تعریف‌نشده در آن استفاده شده، پیشوندگذاری می‌شود. در حالت -s (strict یا سخت‌گیرانه)، این موارد خطا محسوب می‌شوند، نه هشدار.
مقدار مشخص‌شده برای {User,Runas,Host,Cmnd}_Alias تعریف شده اما هرگز استفاده نشده است. این پیام با نام مسیر فایل sudoers و شماره خطی که نام مستعار استفاده‌نشده در آن تعریف شده، پیشوندگذاری می‌شود. ممکن است بخواهید نام مستعار استفاده‌نشده را کامنت کرده یا حذف کنید.
مقدار مشخص‌شده برای {User,Runas,Host,Cmnd}_Alias شامل ارجاعی به خودش است، چه به طور مستقیم یا از طریق یک نام مستعار که در آن گنجانده شده است. این پیام با نام مسیر فایل sudoers و شماره خطی که چرخه در آن شناسایی شده، پیشوندگذاری می‌شود. این مورد صرفاً یک هشدار است، مگر اینکه visudo در حالت -s (سخت‌گیرانه) اجرا شود؛ زیرا sudo هنگام تجزیه فایل sudoers چرخه‌ها را نادیده می‌گیرد.
هنگام پردازش یک @includedir یا #includedir، فایلی یافت شد که نام آن به ‘~’ یا .bak ختم می‌شود. چنین فایل‌هایی توسط sudo و visudo نادیده گرفته می‌شوند.
هنگام پردازش یک @includedir یا #includedir، فایلی یافت شد که نام آن حاوی نویسه ‘.’ است. چنین فایل‌هایی توسط sudo و visudo نادیده گرفته می‌شوند.
فایل sudoers حاوی یک تنظیم Defaults است که توسط visudo شناخته نمی‌شود.

vi(1), sudo.conf(5), sudoers(5), sudo(8), vipw(8)

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

Todd C. Miller

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

اگر ویرایشگر مورد استفاده توسط visudo امکان فرار به پوسته (shell escape) را فراهم کند، هیچ راه ساده‌ای برای جلوگیری از دستیابی کاربر به یک پوسته با دسترسی ریشه (root shell) وجود ندارد.

اگر فکر می‌کنید باگی در visudo پیدا کرده‌اید، می‌توانید یک گزارش باگ در پایگاه‌داده باگ sudo در https://bugzilla.sudo.ws ثبت کنید یا یک issue در https://github.com/sudo-project/sudo/issues باز کنید. اگر ترجیح می‌دهید از ایمیل استفاده کنید، پیام‌ها می‌توانند به فهرست پستی sudo-workers در https://www.sudo.ws/mailman/listinfo/sudo-workers (عمومی) یا به <sudo@sudo.ws> (خصوصی) ارسال شوند.

لطفاً آسیب‌پذیری‌های امنیتی را از طریق issueهای عمومی GitHub، باگزیلا یا فهرست‌های پستی گزارش ندهید. در عوض، آن‌ها را از طریق ایمیل به <Todd.Miller@sudo.ws> ارسال کنید. در صورت تمایل می‌توانید پیام خود را با استفاده از کلید موجود در https://www.sudo.ws/dist/PGPKEYS توسط PGP رمزگذاری کنید.

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

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

July 27, 2023 Sudo 1.9.17p2