نحوه ویرایش فایل Sudoers در سرور مجازی لینوکس Linux
۳۰ دی ۱۴۰۳
مقدمه
جداسازی دسترسیها (privileges) یکی از اساسیترین اصول امنیتی است که در سیستمعاملهای لینوکس پیادهسازی شده است. کاربران عادی با مجوزها و دسترسیهای محدود، عملیات خود را انجام میدهند تا دامنه تأثیرشان فقط به محیط خودشان و نه به کل سرور مجازی، محدود شود.
یک کاربر ویژه به نام root (روت)، دسترسیهای super-user دارد. root، یک حساب کاربری مدیریتی است که فارغ از محدودیتهای موجود برای کاربران عادی، توانایی انجام کارهای مختلفی را دارد. کاربران نیز میتوانند با روشهای مختلف، دستورات خود را با دسترسیهای root، اجرا کنند.
در این مقاله، نحوه دریافت صحیح و ایمن دسترسیهای root را بررسی کرده و بهطور خاص روی ویرایش فایل /etc/sudoers
، تمرکز میکنیم.
ما این مراحل را در یک سرور مجازی Ubuntu انجام خواهیم داد، اما اکثر توزیعهای لینوکس مانند Debian و CentOS به روش مشابه عمل میکنند.
این راهنما فرض میکند که شما قبلاً تنظیمات اولیه سرور که در اینجا توضیح داده شده است را انجام دادهاید.
توجه: این آموزش بهطور مفصل در مورد ارتقای دسترسیها و ویرایش فایل sudoers صحبت میکند. اگر فقط میخواهید دسترسیهای sudo را به یک کاربر اضافه کنید، به این مقاله، مراجعه کنید.
در ادامه، بخوانید:
- نحوه اعطای دسترسیهای root
- Visudo چیست؟
- نحوه ویرایش فایل Sudoers
- نحوه اعطای دسترسیهای Sudo به یک کاربر
- نحوه تنظیم نقشهای شخصیسازیشده
- سایر اطلاعات مربوط به فایل Sudoers
- نتیجهگیری
نحوه اعطای دسترسیهای root
سه روش برای بدست آوردن امتیازات root وجود دارد که پیچیدگی متفاوتی دارند. در ادامه، به معرفی هر سه روش، پرداخته شده است.
ورود به عنوان root
سادهترین و مستقیمترین روش برای بدست آوردن دسترسیها و مجوزهای کاربر root این است که بهطور مستقیم و بهعنوان کاربر root، وارد سرور خود شوید.
اگر که قصد دارید از طریق SSH وارد سرور مجازی خود شوید، نام کاربری root را قبل از آدرس IP یا نام دامنه، در رشته اتصال SSH خود، قرار بدهید:
ssh root@server_domain_or_ip
اگر کلیدهای SSH را برای کاربر root تنظیم نکردهاید، کلمه عبور root را زمانی که خواسته شد، وارد کنید.
همچنین بخوانید: نحوه تنظیم کلیدهای SSH در سرور مجازی اوبونتو
استفاده از su برای تبدیلشدن به کاربر root
ورود مستقیم بهعنوان root معمولاً توصیه نمیشود، چون ممکن است منجر به اجرای ناخواسته دستورات مدیریتی شود.
در این روش، برای به دست آوردن دسترسیهای super-user، شما میتوانید فقط هر زمان که نیاز دارید، به کاربر root تبدیل شوید. ما میتوانیم این کار را با فراخوانی دستور su انجام دهیم که مخفف “substitute user” است. برای بدست آوردن دسترسیهای roo، دستور زیر را، تایپ کنید:
su
با اجرای دستور فوق، از شما خواسته میشود که کلمه عبور کاربر root را وارد کنید، پس از آن وارد یک shell با دسترسی root میشوید. وقتی که کارهایتان که به دسترسیهای root نیاز دارند؛ تمام شد، با تایپ کردن دستور زیر به shell معمولی خود بازگردید:
exit
استفاده از sudo برای اجرای دستورات بهعنوان root
آخرین روش برای بدست آوردن دسترسیهای root که در اینجا بررسی میکنیم، استفاده از دستور sudo است. دستور sudo به شما این امکان را میدهد که فقط یک دستور مشخصشده را با دسترسیهای root، بدون نیاز به راهاندازی یک shell جدید، اجرا کنید. این دستور به این صورت اجرا میشود:
sudo command_to_execute
برخلاف su، دستور sudo، از شما رمزعبور کاربر فعلی را درخواست میکند، نه رمزعبور root. به دلیل پیامدهای امنیتی آن، دسترسی sudo، بهطور پیشفرض به کاربران داده نمیشود و باید از قبل تنظیم شود. در بخش بعدی، نحوه تغییر تنظیمات sudo را بهطور مفصلتر بررسی خواهیم کرد.
Visudo چیست؟
دستور sudo از طریق فایلی در آدرس /etc/sudoers
، پیکربندی میشود.
هشدار: هرگز این فایل را با یک ویرایشگر متنی عادی ویرایش نکنید! همیشه از دستور visudo استفاده کنید!
به دلیل اینکه استفاده از Syntax نامناسب در فایل /etc/sudoers
میتواند سرور مجازی را خراب و دسترسی به مجوزهای مدیریتی را غیرممکن کند، مهم است که برای ویرایش این فایل از دستور visudo
استفاده کنید. دستور visudo
یک ویرایشگر متن را بهصورت معمول باز میکند، اما هنگام ذخیره فایل /etc/sudoers
، سینتکس آن را اعتبارسنجی میکند. این کار از بروز خطاهای پیکربندی که ممکن است عملیات sudo را مسدود کند؛ جلوگیری میکند.
در توزیعهای مختلف لینوکس، visudo
فایل /etc/sudoers
را با ویرایشگر متن vi باز میکند. اما در سیستمعامل اوبونتو، visudo
با ویرایشگر متن nano باز میشود. اگر میخواهید که در سرور مجازی Ubuntu، فایل visudo را با vi باز کنید، دستور زیر را اجرا کنید:
sudo update-alternatives --config editor
خروجی دستور فوق، مشابه زیر است:
There are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 10 manual mode
Press <enter> to keep the current choice[*], or type selection number:
شمارهای که با انتخاب شما همخوانی دارد را وارد کنید. در سرور مجازی CentOS، میتوانید این مقدار را با افزودن خط زیر به فایل ~/.bashrc
تغییر دهید:
export EDITOR=`which name_of_editor`
برای اعمال تغییرات، فایل را با دستور زیر اجرا کنید:
. ~/.bashrc
پس از تنظیم ویراشگر متن visudo
، دستور زیر را اجرا کنید تا به فایل /etc/sudoers
دسترسی پیدا کنید:
sudo visudo
نحوه ویرایش فایل Sudoers
هنگامی که فایل /etc/sudoers
را باز میکنید، آن را در ویرایشگر متنی انتخابشده خود مشاهده خواهید کرد.
محتوای فایل /etc/sudoers
در توزیع Ubuntu بدون در نظر گرفتن commentها، مانند قطعه کد زیر است (فایل مربوط به CentOS دستورات بیشتری دارد که برخی از آنها در این مقاله، بررسی نمیشوند):
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
بررسی دستورات فایل sudoers
دستور Defaults env_reset
محیط ترمینال را ریست میکند تا تمامی متغیرهای کاربر حذف شوند. این یک اقدام امنیتی است که متغیرهای محیطی بالقوه خطرناک را از ترمینال sudo پاک میکند.
دستور Defaults mail_badpass
به سیستم (سرور مجازی)، دستور میدهد که پیامهای مربوط به تلاشهای ناموفق ورود با دسترسی sudo را به ایمیل تنظیمشده کاربر (که به طور پیشفرض حساب root است)، ارسال کند.
دستور Defaults secure_path=...
مشخص میکند که PATH
(مسیرهایی که سرور برای یافتن برنامهها جستجو میکند) در عملیات sudo، کجا باشد. این کار از استفاده از مسیرهایی که کاربر مشخص کرده و ممکن است خطرناک باشد؛ جلوگیری میکند.
دستورات مربوط به دسترسیهای کاربر
خط چهارم، که دسترسیهای sudo کاربر root را تعیین میکند، با دستورات قبلی متفاوت است. بیایید ببینیم هر یک از بخشهای این خط چه معنایی دارند:
root ALL=(ALL:ALL) ALL
: فیلد اول میگوید که این قوانین باید برای کاربر root اعمال شود.root ALL=(ALL:ALL) ALL
: فیلد دوم میگوید این قانون باید برای همه سرورها (hostها) اعمال شود.root ALL=(ALL:ALL) ALL
: فیلدهای سوم و چهارم میگوید کاربر root میتواند دستورات را بهعنوان تمام کاربران و تمام گروهها اجرا کند.root ALL=(ALL:ALL) ALL
: فیلد آخر میگوید این قانون باید برای تمامی دستورات اعمال شود.
دستور فوق، به صورت کلی میگوید که کاربر root میتواند با استفاده از sudo هر دستوری را اجرا کند، به شرطی که رمز عبور خود را وارد کند.
دستورات مربوط به دسترسیهای گروه
دو خط بعدی مشابه دستورات مربوط به دسترسی کاربران است، اما قوانین sudo را برای گروهها مشخص میکند:
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
نامهایی که با %
شروع میشوند نشاندهنده نام گروهها هستند. در اینجا میبینیم که گروه admin میتواند هر دستوری را بهعنوان هر کاربری روی هر میزبان اجرا کند. در اینجا میبینیم که گروه admin میتواند هر دستوری را بهعنوان هر کاربری روی host موردنظر، اجرا کند. به طور مشابه، گروه sudo نیز همان دسترسیها را دارد، اما میتواند دستورات را بهعنوان هر گروهی نیز، اجرا کند.
خط #includedir
خط آخر، #includedir
، در نگاه اول شبیه به یک کامنت است زیرا با #
شروع میشود، اما این خط در واقع نشاندهنده این است که فایلهای موجود در مسیر /etc/sudoers.d
نیز باید خوانده و اعمال، شوند:
. . .
#includedir /etc/sudoers.d
فایلهای درون دایرکتوری /etc/sudoers.d
، باید از قواعد فایل /etc/sudoers
پیروی کنند. هر فایلی که با ~
خاتمه نیابد و نقطه (.
) در نام خود نداشته باشد، خوانده میشود و به پیکربندی sudo، اضافه خواهد شد. این روش عمدتاً برای برنامههایی استفاده میشود که دسترسیهای sudo را هنگام نصب شدن، تغییر میدهند.
قرار دادن تمام قوانین مرتبط در یک فایل جداگانه در مسیر /etc/sudoers.d
باعث میشود که مشاهده دسترسیهای مرتبط با هر حساب کاربری، سادهتر شود و بتوان به راحتی هر قانونی را بدون نیاز به ویرایش مستقیم فایل /etc/sudoers
، لغو کرد.
همانند فایل اصلی /etc/sudoers
، شما میتوانید فایلهای موجود در دایرکتوری /etc/sudoers.d
را با استفاده از visudo ویرایش کنید. دستور مورد استفاده برای ویرایش این فایلها به شکل زیر است:
sudo visudo -f /etc/sudoers.d/file_to_edit
در دستور فوق، به جای file_to_edit
، نام فایل موردنظرتان را، وارد کنید.
نحوه اعطای دسترسیهای Sudo به یک کاربر
رایجترین عملیاتی که کاربران هنگام مدیریت دسترسیهای sudo میخواهند انجام دهند، اعطای دسترسی عمومی sudo به یک کاربر جدید است. این کار زمانی مفید است که بخواهید به یک کاربر، دسترسی کامل مدیریتی بدهید.
سادهترین روش برای انجام این کار در سروری که با گروه مدیریتی عمومی پیکربندی شده است (مانند سیستم Ubuntu)، افزودن کاربر موردنظر به آن گروه است.
برای مثال، در Ubuntu 20.04، گروه sudo دارای دسترسیهای کامل مدیریتی است. میتوانیم این دسترسیها را با افزودن کاربر به این گروه به شکل زیر، به کاربر مدنظرمان، اعطا کنیم:
sudo usermod -aG sudo username
همچنین، میتوان از دستور gpasswd نیز، استفاده کرد:
sudo gpasswd -a username sudo
هر دو دستور نتیجه یکسانی دارند. در CentOS، معمولاً گروه wheel به جای گروه sudo استفاده میشود:
sudo usermod -aG wheel username # یا sudo gpasswd -a username wheel
در CentOS، اگر افزودن یک کاربر به یک گروه، بلافاصله کار نکرد، ممکن است نیاز باشد فایل /etc/sudoers
را ویرایش کرده و نام گروه را از حالت کامنت خارج کنید:
sudo visudo
محتوای فایل /etc/sudoers
به صورت زیر باید باشد:
. . .
%wheel ALL=(ALL) ALL
. . .
نحوه تنظیم نقشهای شخصیسازیشده
حالا که با Syntax کلی فایل آشنا شدهایم، بیایید چند تا قانون جدید بسازیم.
نحوه ایجاد Alias
برای سازماندهی بهتر فایل sudoers، میتوان از انواع مختلف “alias”ها استفاده کرد. برای مثال، میتوان سه گروه مختلف از کاربران با اعضای مشترک ایجاد کرد:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
اسامی گروهها باید با حرف بزرگ شروع شوند. برای مثال، با قطعه کد زیر، به اعضای GROUPTWO اجازه دادیم تا بتوانند پایگاه داده apt را بهروزرسانی کنند:
/etc/sudoers
. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .
اگر کاربر یا گروهی که دستور باید با آن اجرا شود مشخص نشود، sudo بهصورت پیشفرض از کاربر root استفاده میکند.
حتی میتوانیم برای دستورات، alias تعریف کنیم و سپس آن را به گروه خاصی اختصاص دهیم. برای مثال، میتوانیم به اعضای GROUPTHREE اجازه خاموش کردن و راهاندازی مجدد سیستم را بدهیم:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
ما یک دستور alias به نام POWER
ایجاد کردیم که شامل دستورات خاموش کردن و ریبوت سیستم است. سپس به کاربران GROUPTHREE اجازه دادیم که بتوانند این دستورات را، اجرا کنند.
همچنین، میتوان aliasهایی تعریف کرد که مشخص کنند دستورات با کدام کاربر اجرا شوند. برای مثال، با قطعه کد زیر، اعضای GROUPONE میتوانند دستورات را بهعنوان کاربران www-data یا apache اجرا کنند:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
در نظر داشته باشید که اگر دو قانون متناقض وجود داشته باشد، قانون جدیدتر جایگزین قانون قبلی خواهد شد.
قفل کردن قوانین برای کنترل بیشتر
روشهای متعددی وجود دارد که میتوانید کنترل بیشتری بر نحوه واکنش sudo
به یک فراخوان اعمال کنید. دستور updatedb
که با پکیج mlocate
همراه است، در یک سیستم تککاربره نسبتاً بیخطر است. اگر بخواهیم به کاربران اجازه دهیم این دستور را با دسترسی root
و بدون نیاز به وارد کردن رمز عبور اجرا کنند، میتوانیم قانون زیر را ایجاد کنیم:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
یک “tag” است و به معنی این است که هیچ رمز عبوری نباید درخواست شود. این tag یک دستور همراه به نام PASSWD
دارد که رفتار پیشفرض است. یک tag تا زمانی که توسط “twin” خود بعداً در خط لغو نشود، برای بقیهی قانون، اعمال میشود. برای مثال، میتوانیم یک خط مشابه زیر داشته باشیم:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
یک tag مفید دیگر NOEXEC
است که میتواند برای جلوگیری از برخی رفتارهای خطرناک در برنامههای خاص، استفاده شود. برای مثال، برخی برنامهها، مانند less
، میتوانند دستورات دیگر را با تایپ کردن آنها از داخل رابط کاربری خود، اجرا کنند:
!command_to_run
این حالت، اساساً هر دستوری را که کاربر به آن بدهد؛ با همان دسترسی که less
تحت آن اجرا میشود، اجرا میکند، که میتواند بسیار خطرناک باشد. برای محدود کردن این رفتار، میتوانیم از خطی مشابه زیر استفاده کنیم:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
سایر اطلاعات مربوط به فایل Sudoers
در هنگام کار با sudo
، چند نکته دیگر ممکن است مفید باشد:
اگر در فایل پیکربندی، مشخص کرده باشید که دستورات بهعنوان یک کاربر یا گروه خاص اجرا شوند، میتوانید با استفاده از فلگهای -u
و -g
، دستورات را اجرا کنید:
sudo -u run_as_user command
sudo -g run_as_group command
برای راحتی کار، بهصورت پیشفرض، sudo
جزئیات احراز هویت شما را برای مدت زمان مشخصی در یک ترمینال ذخیره میکند. در واقع، تا زمانی که این زمان تمام نشود، نیازی به وارد کردن مجدد رمز عبور نخواهید داشت. برای پاک کردن این تایمر، به دلایل امنیتی، میتوانید دستور زیر را اجرا کنید:
sudo -k
اگر میخواهید sudo
را از قبل “prime” کنید تا دیگر درخواست رمز عبور نداشته باشد یا اگر قصد دارید که مجوزهای فعلی خود را تمدید کنید، میتوانید دستور زیر را تایپ کنید:
sudo -v
با این کار از شما رمز عبور درخواست میشود و پس از وارد کردن، این رمز برای استفادههای بعدی تا پایان زمان تعیینشدهی sudo
، ذخیره خواهد شد.
اگر میخواهید بدانید چه نوع مجوزهایی برای نام کاربری شما تعریف شده است، میتوانید دستور زیر تایپ کنید:
sudo -l
دستور فوق، تمام قوانین موجود در فایل /etc/sudoers
که برای کاربر شما اعمال میشوند را فهرست میکند.
مواقعی پیش میآید که دستوری را اجرا میکنید و به دلیل فراموشی استفاده از sudo
، اجرا نمیشود. برای جلوگیری از تایپ دوبارهی دستور، میتوانید از این ویژگی bash
استفاده کنید:
sudo !!
دو علامت تعجب (!!
) دستور قبلی را تکرار میکند و ما sudo
را قبل آن گذاشتیم تا دستور بدون مجوز را به دستوری با مجوز تبدیل کنیم.
برای داشتن یکم سرگرمی، میتوانید خط زیر را با استفاده از دستور visudo
به فایل /etc/sudoers
اضافه کنید؛ در ابتدا visudo را باز کنید:
sudo visudo
سپس خط زیر را به فایل visudo اضافه کنید:
. . .
Defaults insults
. . .
این کار باعث میشود که sudo
در صورت وارد کردن رمز عبور اشتباه، یک شوخی بامزه به شما نمایش دهد. برای امتحان کردن این قابلیت، میتوانید رمز عبور کششدهی قبلی را با دستور زیر پاک کنید:
sudo -k
sudo ls
خروجی دستور فوق، در صورت اشتباه وارد کردن رمز عبور، یک شوخی خواهد بود:
[sudo] password for demo: # پسورد را نادرست وارد کنید
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.
نتیجهگیری
اکنون باید درک پایهای از نحوه خواندن و تغییر فایل sudoers
و روشهای مختلفی که میتوانید از آنها برای بهدست آوردن دسترسیهای root
استفاده کنید، داشته باشید.
به یاد داشته باشید که دسترسیهای super-user یا super-user privileges به کاربران عادی بیدلیل داده نمیشود. بسیار مهم است که بفهمید هر دستوری که با دسترسیهای root
اجرا میکنید، چه کاری انجام میدهد. این مسئولیت را ساده نگیرید. بهترین روشها را برای استفاده از این ابزارها متناسب با نیاز خود یاد بگیرید و هر قابلیتی که نیاز نیست را قفل کنید.
در صورتی که به یک سرور مجازی لینوکس نیاز دارید؛ میتوانید از سرور مجازی ایران لیارا، استفاده کنید. سرور مجازی دائمی لیارا، از جمله سرویسهای با زیرساخت قابل اطمینان و پر سرعت است. با استفاده از ایسرور، شما میتوانید در کمترین زمان ممکن و در بهترین حالت، به توسعه نرمدر صورتی که به یک سرور مجازی لینوکس نیاز دارید؛ میتوانید از سرور مجازی ایران لیارا، استفاده کنید. سرور مجازی دائمی لیارا، از جمله سرویسهای با زیرساخت قابل اطمینان و پر سرعت است. با استفاده از VPS ایران لیارا، شما میتوانید در کمترین زمان ممکن و در بهترین حالت، به توسعه برنامههای خود، بپردازید.
همچنین بخوانید: نحوه شخصیسازی اتصال به سرور مجازی لینوکس (VPS) با SSH