sudo در Ubuntu
آموزش کامل sudo در Ubuntu: چرا root قفل است، پیکربندی sudoers، NOPASSWD، دسترسی گروهی و رفع خطاهای رایج sudo.
در Ubuntu، برخلاف بسیاری از توزیعها، حساب root بهطور پیشفرض قفل است. تمام کارهای مدیریتی از طریق sudo انجام میشود. در این آموزش با فلسفهٔ sudo، پیکربندی sudoers و نکات امنیتی آشنا میشوید.
sudo چیست؟
sudo (Superuser DO) به یک کاربر عادی اجازه میدهد دستوراتی را با دسترسی root (یا کاربر دیگر) اجرا کند، بدون اینکه رمز root را بداند. در Ubuntu، اولین کاربری که در نصب میسازید، بهصورت خودکار به گروه sudo اضافه میشود.
چرا Ubuntu از sudo استفاده میکند؟
- امنیت: حساب root قفل است و حملهٔ brute-force روی آن بیفایده است
- پیگیری: هر دستور sudo در
/var/log/auth.logثبت میشود - کنترل: میتوان دقیقاً تعیین کرد کدام کاربر کدام دستور را بتواند اجرا کند
- موقت بودن: دسترسی sudo بعد از چند دقیقه منقضی میشود
استفادهٔ پایه از sudo
# اجرای یک دستور بهعنوان root
sudo apt update
# [sudo] password for ali: ********
# اجرای چند دستور بهعنوان root
sudo -i
# (این یک shell کامل بهعنوان root باز میکند)
# root@ubuntu:~#
# اجرای دستور بهعنوان کاربر دیگر
sudo -u maryam whoami
# maryam
# اجرای یک دستور با محیط کاربر
sudo -u maryam -H bash -c 'echo $HOME'
# /home/maryamsudo -i در برابر sudo -s
sudo -iیک login shell کامل میدهد (متغیرها reset میشوند، به home میرود)sudo -sیک non-login shell میدهد (متغیرهای کاربر فعلی حفظ میشوند)- برای کارهای مدیریتی،
sudo -iمناسبتر است.
timeout تایید sudo
پس از وارد کردن رمز، sudo بهمدت ۱۵ دقیقه (پیشفرض) دیگر رمز نمیپرسد:
# تمدید تایید (بدون اجرای دستور)
sudo -v
# باطلکردن تایید (نیاز به رمز دوباره)
sudo -k
# اجرای یک دستور بدون cache کردن رمز
sudo -k apt updateپیکربندی sudoers
فایل پیکربندی sudo در /etc/sudoers قرار دارد. این فایل را هرگز مستقیم ویرایش نکنید؛ همیشه از visudo استفاده کنید:
# ویرایش امن فایل sudoers
sudo visudovisudo قبل از ذخیره، syntax فایل را بررسی میکند. اگر خطا باشد، از ذخیره جلوگیری میکند تا سیستم قفل نشود.
فرمت فایل sudoers
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# کاربر خاص
ali ALL=(ALL:ALL) ALLفرمت کلی:
user host=(run_as_user:run_as_group) commandبهعنوان مثال:
ali ALL=(ALL:ALL) ALL— کاربر ali میتواند روی همهٔ هاستها، بهعنوان همهٔ کاربران، همهٔ دستورات را اجرا کند%sudo ALL=(ALL:ALL) ALL— اعضای گروه sudo (با%مشخص میشوند)
افزودن کاربر به گروه sudo
سادهترین راه برای دادن دسترسی sudo به یک کاربر، افزودن او به گروه sudo است:
# افزودن کاربر به گروه sudo
sudo usermod -aG sudo maryam
# یا با adduser
sudo adduser maryam sudo
# کاربر باید logout و login کند تا گروه جدید اعمال شودپیکربندیهای پیشرفته sudoers
۱. اجرای بدون رمز برای یک کاربر
# اجرای همهٔ دستورات بدون رمز
ali ALL=(ALL) NOPASSWD: ALL۲. اجرای بدون رمز برای دستور خاص
# فقط apt بدون رمز
ali ALL=(ALL) NOPASSWD: /usr/bin/apt۳. محدود کردن به دستورات خاص
# فقط میتواند systemctl restart nginx را اجرا کند
deploy ALL=(root) /usr/bin/systemctl restart nginx۴. گروهی با دسترسی محدود
# گروه developers میتواند docker را اجرا کند
%developers ALL=(root) /usr/bin/docker, /usr/bin/docker-compose۵. فایلهای جداگانه در sudoers.d
برای مدیریت بهتر، میتوانید بهجای ویرایش فایل اصلی، فایلهای جداگانه در /etc/sudoers.d/ بسازید:
# ساخت فایل برای یک کاربر
sudo visudo -f /etc/sudoers.d/maryam# /etc/sudoers.d/maryam
maryam ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginxفایل اصلی sudoers این خط را دارد که فایلهای داخل sudoers.d/ را هم شامل میشود:
@includedir /etc/sudoers.dهر کاربر، یک فایل
بهترین روش مدیریت sudoers این است که برای هر کاربر یا هر نقش، یک فایل جداگانه در /etc/sudoers.d/ بسازید. این کار پیکربندی را مرتب نگه میدارد و کنترل نسخه را ساده میکند.
فایلهای log
دستورات sudo در Ubuntu در /var/log/auth.log ذخیره میشوند:
# مشاهدهٔ آخرین دستورات sudo
sudo tail /var/log/auth.log | grep sudo
# یا با journalctl
journalctl -u sudo
# یا
journalctl -g sudo# خروجی نمونه:
# Jun 30 12:00:01 ubuntu sudo: ali : TTY=pts/0 ; PWD=/home/ali ; USER=root ; COMMAND=/usr/bin/apt update
# Jun 30 12:05:32 ubuntu sudo: ali : TTY=pts/0 ; PWD=/home/ali ; USER=root ; COMMAND=/usr/bin/systemctl restart nginxفعالکردن root (اختیاری)
اگر واقعاً نیاز دارید root را فعال کنید:
# تنظیم رمز root
sudo passwd root
# New password: ********
# Retype new password: ********
# حالا میتوانید با su - وارد root شوید
su -فعالکردن root توصیه نمیشود
در Ubuntu، فعالکردن root توصیه نمیشود. این کار امنیت سیستم را کاهش میدهد و الگوی Ubuntu را نقض میکند. اگر به shell root نیاز دارید، از sudo -i استفاده کنید.
خطاهای رایج
۱. user is not in the sudoers file
ali is not in the sudoers file. This incident will be reported.راهحل: کاربر به گروه sudo اضافه نشده. از یک کاربر دیگر sudoer یا از recovery mode استفاده کنید:
# از کاربر دیگری که sudo دارد
sudo usermod -aG sudo ali
# یا از recovery mode بوت کنید و در root shell بنویسید:
usermod -aG sudo ali۲. syntax error در sudoers
اگر فایل sudoers را مستقیم ویرایش کردهاید و سیستم قفل شده، از recovery mode استفاده کنید:
# بوت به recovery mode → root shell
# اجرای visudo برای رفع خطا
visudoهمیشه visudo استفاده کنید
هرگز فایل /etc/sudoers را با nano یا vim مستقیم ویرایش نکنید. یک خطای syntax میتواند دسترسی sudo شما را کاملاً قطع کند و شما را مجبور به بوت recovery کند.
۳. NOPASSWD کار نمیکند
دلیل رایج: ترتیب قوانین در sudoers. قانون پایینتر، قانون بالاتر را override میکند. اگر NOPASSWD را در /etc/sudoers.d/ گذاشتهاید اما هنوز رمز میخواهد، مطمئن شوید فایل بعد از %sudo ALL=(ALL:ALL) ALL در فایل اصلی لود میشود (که اینطور است).
۴. sudo: unable to resolve host
sudo: unable to resolve host ubuntu-pcراهحل: hostname در /etc/hosts نیست:
# بررسی hostname
hostname
# افزودن به /etc/hosts
echo "127.0.1.1 $(hostname)" | sudo tee -a /etc/hostsخلاصه و مرحلهٔ بعد
sudo در Ubuntu جایگزین مستقیم root است و کنترل امن روی کارهای مدیریتی فراهم میکند. با استفاده از visudo و فایلهای /etc/sudoers.d/، میتوانید دسترسیها را بهصورت دقیق و امن مدیریت کنید.
بهعنوان گام بعدی:
- آموزش مدیریت کاربران را برای ساخت کاربر و گروه بخوانید
- آموزش SSH را برای ورود از راه دور ببینید
- آموزش systemd را برای مدیریت سرویسها مرور کنید
این صفحه در تاریخ ۹ تیر ۱۴۰۵ بهروزرسانی شده است.