visudo، ویرایش sudoers

سلام. قبل از شروع این مطلب، سال جدید رو به شما تبریک می‌گم و امیدوارم سال ۱۳۹۴ همراه با سلامتی و موفقیت برای شما و خانوادتون باشه.

یه عکس که بی‌ربط نیست به موضوع مطلبمون و سال نو!

یه عکس که بی‌ربط نیست به موضوع مطلبمون و سال نو!

تو این پست قصد دارم نحوه‌ی ویرایش فایل sudoers با visudo رو آموزش بدم. توی مطلب «sudo چیست؟» دیدید که sudo برای اجرای دستوراتی استفاده میشه که ما اجازه اجرای اون‌ها رو نداریم؛ مثل دستور apt-get در دبیان و اوبونتو که برای اجرا نیاز به دسترسی روت داره و ما می‌تونیم با دستور sudo apt-get و دادن پسورد خودمون اون رو اجرا کنیم.

یکم جلوتر بریم و توی پست «اجرای دستور سودو بدون پسورد» دیدید که ما نیاز داشتیم بعضی از دستورات رو بدون نیاز به دادن پسورد اجرا کنیم. مثلا sudo apt-get رو که وارد کردیم دیگه نیاز به وارد کردن پسورد نباشه و بدون دریافت پسورد اجرا بشه. توی اون پست یه روش مبتدیانه و خطرناک گفتم اما قول دادم که روش اصولی رو آموزش بدم که حالا به قولم وفا کردم!

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

حالا که می‌دونیم با ویرایش sudoers چه کارهایی میشه انجام داد بیایم یه توضیحی درباره اون بدیم. فایل sudoers معمولا توی شاخه /etc هست و یک فایل متنی با ساختار مشخص هست که پیکربندی sudo محسوب میشه و دستور sudo با توجه به محتوای این فایل دسترسی‌ها رو تست و اعمال می‌کنه. برای ویرایش این فایل می‌تونید مستقیم فایل رو پیدا کنید و با هر ویرایشگری که خواستید ویرایش کنید یا اینکه از دستور visduo استفاده کنید که به معنی باز کردن فایل sudoers با ویرایشگر vi هست و این فایل رو با ویرایشگر پیش‌فرض شما برای ویرایش باز میکنه.

بریم سراغ ویرایش فایل sudoers.

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

واسه اینکه هم مثالی برای مورد اول بشه و هم اینکه در تست‌های بعدی راحت باشیم این خط رو به فایل sudoers اضافه کنید.

Defaults:ALL timestamp_timeout=0

این خط می‌گه که زمان انقضای پسورد 0 باشه؛ یعنی برای هر بار استفاده از دستور sudo نیاز به دادن پسورد باشه (اگه نیاز بود). به صورت پیشفرض این زمان معمولا 15 دقیقه هست؛ یعنی اینکه با اجرای دستوری مثل sudo apt-get و دادن پسورد، تا 15 دقیقه دیگه نیاز به وارد کردن پسورد نیست (در همین نشست) و اگه دستور sudo apt-get رو تو این بازه زمانی اجرا کنیم بدون نیاز به دادن پسورد اجرا میشه.

  • این تنظیم برای ادامه آموزش نیاز هست تا کار شما راحت‌تر باشه و اگر این مورد رو فعال نکردید باید بعد از هر بار که پسورد رو وارد کردید دستور sudo -K رو وارد کنید تا زمان منقضی بشه و برای اجرای دوباره sudo نیاز به دادن پسورد باشه. این کار رو انجام می‌دیم که تفاوت تنظیماتی که در ادامه انجام می‌دیم رو با حالت عادی احساس کنید.

  • اگر این تنظیم رو انجام دادید بعد از تست این مطلب اون رو حذف کنید.

  • توجه: در دستورات ترمینالی که استفاده شده، نوشته‌ها با رنگ زرد، خروجی هستند.

و مورد دوم. فرض کنید من فایلی به نام test.sh با محتوای echo ‘Linuxihaa’ می‌سازم و دسترسی اون رو 700 قرار می‌دم.

$ echo "echo 'Linuxihaa'" > test.sh
$ chmod 700 test.sh

حالا اگه فایل رو اجرا کنید متن خروجی رو مشاهده می‌کنید.

$ ./test.sh
Linuxihaa

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

$ sudo chown root test.sh

حالا دوباره فایل رو اجرا کنید تا مشاهده کنید که قادر به اجرای اون نیستید.

$ ./test.sh
-bash: ./test.sh: Permission denied

می‌دونیم که با اجرای دستور sudo ./test.sh و دادن پسورد این فایل اجرا میشه اما برای اینکه پسورد نخواد خط زیر رو به فایل sudoers اضافه کنید. توجه کنید که بجای YOUR_USERNAME، نام کاربری خودتون و بجای FILE_PATH آدرس فایل test.sh رو به صورت کامل بنویسید.

YOUR_USERNAME ALL=(ALL) NOPASSWD: FILE_PATH

بعد از اضافه کردن این خط به فایل sudoers اگه دستور sudo ./test.sh رو وارد کنید می‌بینید که بدون نیاز به دادن پسورد، دستور اجرا میشه.

خب این مثال تموم شد اما بیایم ببنیم ساختار کلی اعطای مجوز در فایل sudoers چطور هست؟

ساختار هر خط تقریبا به شکل زیر هست.

[USERNAME / %GROUPNAME] [MACHINE]=(USER) <NOPASSWD:> [PATH] [ARGUMENTS]
  • در بخش اول می‌تونید یک نام کاربری یا گروه کاربری (برای گروه کاربری باید اول نام گروه کاراکتر % قرار بدید) بنویسید.
  • در بخش دوم
    • ابتدا نام ماشینی که مجوز در اون اعطا میشه رو وارد می‌کنید (می‌تونید نام ماشین خودتون رو بنویسید) و یا ALL می‌نویسید تا برای همه ماشین‌ها باشه.
    • سپس نام یوزی که میشه با اون اجرا بشه رو وارد می‌کنید یا ALL می‌نویسید تا محدودیتی نباشه. این مورد برای دستور sudo -u USERNAME استفاده میشه.
  • در بخش سوم یا می‌نویسید NOPASSWD: تا نیاز به وارد کردن پسورد نباشه یا چیزی نمی‌نویسید تا پسورد نیاز باشه.
  • در بخش چهارم مسیر فایل دستور یا فایل‌های خودتون رو وارد می‌کنید. میتونه یه فایل خاص باشه یا فایل‌های داخل یه شاخه خاص. همچنین می‌تونید بعد از نام فایل، آرگومان‌های مشخصی رو هم بنویسید تا اون دستور فقط با اون آرگومان‌ها قابل دسترس باشه.

  • اگه چند آرگومان با نام مشابه هست می‌تویند از * استفاده کنید. مثلا up* آرگومان‌های update و upgrade رو شامل میشه.

  • می‌تونید چندتا مسیر رو با دادن , از هم جدا کنید و مجوز به همشون اعمال بشه.

نکته دیگری هست خوشحال میشم شما بگید یا بپرسید تا جواب داده بشه.

موفق باشید.

  • تصویر شاخص از 4.bp.blogspot.com