[*]
جداسازی دسترسیها و امتیازها، یکی از اصول بنیادی امنیت در سیستم عاملهای لینوکس و سیستمعاملهای شبیه به یونیکس به شمار میرود. کاربران عادی از سطح دسترسی محدودی برخوردار هستند تا دامنه نفوذ آنها تنها محیط کاربری خودشان باشد و کل سیستم عامل را تحت تاثیر قرار ندهد.
یک کاربر ویژه به نام root وجود دارد که از امتیازات ابرکاربر (Super User) برخوردار است. این یک حساب کاربری مدیریت سیستم بوده و محدودیت هایی که برای کاربران عادی اعمال می شود را ندارد. کاربران می توانند از طریق روش های مختلف، دستورات را با امتیازات ابرکاربر یا root اجرا نمایند.
در این مقاله، نحوه به دست آوردن صحیح و امن امتیازات root، با تمرکز ویژه بر ویرایش فایل Sudoers یا /etc/sudoers مورد بحث قرار خواهد گرفت.
در این مطلب به بررسی و آموزش نحوه ویرایش فایل Sudoers برای سرور مجازی لینوکس با توزیع اوبونتو 20.04 خواهیم پرداخت، اما اکثر توزیع های لینوکس مدرن مانند دبیان و CentOS باید به روشی مشابه عمل کنند. همچنین در این راهنما فرض کردیم که شما قبلا تنظیمات اولیه سرور را تکمیل کردهاید. بهعنوان کاربر معمولی و بدون دسترسی روت وارد سرور خود شوید و مراحل زیر را دنبال کنید.
نحوه بهدست آوردن امتیازات روت
به طور کلی سه روش اصلی برای به دست آوردن امتیازات root وجود دارد که از نظر سطح پیچیدگی با هم متفاوت هستند.
ورود بهعنوان Root
سادهترین روش برای بهدست آوردن امتیازات روت این است که مستقیما بهعنوان کاربر روت در سرور مجازی خود وارد شوید.
اگر به یک ماشین محلی وارد میشوید (یا از ویژگی کنسول Out of Band در سرور مجازی استفاده میکنید)، در پنجره لاگین root را بهعنوان نام کاربری خود وارد کرده و در صورت درخواست رمزعبور، باز هم root را وارد کنید.
اگر از طریق SSH به سیستم وارد میشوید، کاربر روت را قبل از آدرس IP یا نام دامنه در رشته اتصال SSH خود وارد کنید:
ssh root@server_domain_or_ip
اگر کلیدهای SSH را برای کاربر روت تنظیم نکردهاید، هنگام درخواست رمزعبور، root را وارد کنید.
استفاده از su برای تبدیل شدن به کاربر روت
ورود مستقیم بهعنوان root معمولا توصیه نمیشود، زیرا ممکن است از سیستم برای کارهای غیراداری استفاده کنید و این کار خطرناک است.
راه بعدی برای بهدست آوردن امتیازات سوپر یوزر به شما اجازه میدهد تا در هر زمانی که خودتان خواستید به کاربر روت تبدیل شوید.
این کار از طریق فراخوانی دستور su انجام میشود که مخفف «Substitute User» است. برای بهدست آوردن امتیازات روت، دستور زیر را تایپ کنید:
su
با اجرای این دستور، از شما خواسته میشود تا رمزعبور کاربر روت را وارد کنید. پس از آن، در یک سِشِن با shell روت قرار میگیرید.
پس از انجام وظایفی که به امتیازات روت نیاز دارند، میتوانید با دستور زیر به محیط shell عادی بازگردید:
exit
استفاده از sudo برای اجرای دستورات بهعنوان کاربر روت
در نهایت، روش سوم برای بهدست آوردن امتیازات روت، استفاده از دستور sudo است. دستور sudo به شما اجازه میدهد تا دستوری را از طریق امتیازات روت اجرا کنید، بدون اینکه نیاز باشد یک shell جدید ایجاد شود. این دستور بهصورت زیر نوشته میشود:
sudo command_to_execute
دستور sudo برخلاف su، رمزعبور کاربر فعلی را درخواست میکند نه رمزعبور مربوط به کاربر روت.
بهدلیل پیامدهای امنیتی آن، دسترسی sudo بهطور پیشفرض به کاربران اعطا نمیشود و قبل از اینکه بهدرستی کار کند باید تنظیم شود. در بخش بعدی، نحوه تغییر پیکربندی sudo را با جزئیات بیشتری توضیح میدهیم.
Visudo چیست؟
دستور sudo از طریق فایلی که در دایرکتوری etc/sudoers/ قرار دارد پیکربندی میشود.
هشدار: هرگز این فایل را با یک ویرایشگر متن معمولی ویرایش نکنید. همیشه از visudo استفاده کنید!
از آنجا که سینتکس نامناسب در فایل etc/sudoers/ میتواند به خرابی سیستم و عدم امکان دسترسی به امتیازات بالا منجر شود، استفاده از دستور visudo برای ویرایش فایل بسیار مهم است.
دستور visudo یک ویرایشگر متن را درست مانند حالت عادی باز میکندف اما پس از ذخیره شدن، سینتکس مناسب فایل را تایید میکند. این امر باعث میشود تا از مسدود شدن عملیات sudo بهدلیل خطاهای پیکربندی جلوگیری شود. دقت کنید که عملیات sudo ممکن است تنها راه شما برای بهدست آوردن امتیازات روت باشد.
بهطور معمول، visudo فایل etc/sudoers/ را با ویرایشگر متن vi باز میکند. بااینحال، یک توزیع لینوکس مانند اوبونتو visudo را برای استفاده از ویرایشگر متن nano پیکربندی کرده است. اگر میخواهید بهجای nano از ویرایشگر vi استفاده کنید، باید دستور زیر را اجرا کنید:
sudo update-alternatives --config editor
خروجی دستور بالا به این صورت خواهد بود:
Output 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، دستور زیر را اجرا کنید:
/etc/sudoers
چطور فایل Sudoers را تغییر دهیم؟
فایل etc/sudoers/ در ویرایشگر متن انتخابی شما نمایش داده میشود.
برای این راهنما، ما فایل Sudoers را از اوبونتو 20.04 کپی و جایگذاری کردیم و کامنتهای آن حذف شده است. فایل etc/sudoers/ در سیستمعامل 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
اجازه دهید ببینیم این خطوط چه کاری انجام میدهند.
خطوط پیشفرض
خط اول، «Defaults env_reset» محیط ترمینال را برای حذف هر متغیر کاربر ریست میکند. این یک اقدام امنیتی است که برای پاک کردن متغیرهای محیطی دارای خطر بالقوه از سِشِن sudo استفاده میشود.
خط دوم، «Defaults mail_badpass» به سیستم میگوید که اخطارهای مربوط به تلاشهای ناموفق رمزعبور sudo را به کاربر mailto پیکربندیشده ارسال کند. این کاربر بهطور پیشفرض همان اکانت روت است. البته اگر تنظیمات اولیه اوبونتو را تغییر داده باشید ممکن است شرایط متفاوت باشد.
خط سوم، با «…=Defaults secure_path» شروع میشود و مسیری را مشخص میکند (مکانهایی در فایلسیستم که سیستمعامل در آنجا بهدنبال اپلیکیشنها میگردد) که برای عملیات sudo استفاده میشود. این دستور از استفاده از مسیرهای کاربری که ممکن است مضر باشد جلوگیری میکند.
خطوط امتیاز کاربر
خط چهارم، که امتیازات sudo کاربر روت را تعین میکند، با خطوط قبلی متفاوت است. بیایید ببینیم هر فیلد چه معنایی دارد:
root ALL=(ALL:ALL) ALL : اولین فیلد نام کاربری را نشان میدهد که قانون روی آن اعمال میشود (root).
root ALL=(ALL:ALL) ALL : اولین «ALL» نشان میدهد که این قانون بر روی همه میزبانها اعمال میشود. دومین «ALL» نشان میدهد که کاربر root میتواند دستورات را مانند همه کاربران اجرا کند. سومین «ALL» نشان میدهد که کاربر root میتواند دستورات را مانند همه گروهها اجرا کند. آخرین «ALL» نشان میدهد که این قوانین برای همه دستورات اعمال میشود.
این یعنی کاربر اصلی root ما میتواند هر دستوری را با استفاده از sudo اجرا کند، بهشرطی که رمزعبور خود را ارائه بدهد.
خطوط مربوط به امتیاز گروه
دو خط بعدی مشابه خطوط امتیاز کاربر هستند، اما قوانین sudo را برای گروهها مشخص میکنند.
نامهایی که با «%» شروع میشوند، نام گروه را نشان میدهند.
در اینجا میبینیم که گروه admin میتواند هر دستوری را مانند هر کاربر یا میزبان دیگری اجرا کند. بهطور مشابه، گروه sudo دارای همان امتیازات است، اما میتواند مانند هر گروهی دستورات را اجرا کند.
خط دارای دایرکتوری 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
چگونه امتیازات Sudo را به یک کاربر اختصاص دهیم
رایجترین عملیاتی که کاربران میخواهند هنگام مدیریت مجوزهای sudo انجام دهند، اعطای دسترسی عمومی sudo به کاربر جدید است. اگر میخواهید دسترسی ادمین و کامل به سیستم را به یک حساب کاربری اعطا کنید، این عملیات مفید است.
سادهترین راه برای انجام این کار در سیستمی با یک گروه ادمین با کاربری عمومی (مانند سیستم اوبونتو در این راهنما)، در واقع افزودن کاربر مورد نظر به آن گروه است. بهعنوان مثال، در اوبونتو 20.04، گروه sudo دارای امتیازات کامل ادمین است. ما میتوانیم با اضافه کردن کاربران به این گروه، همین امتیازات را به آنها اعطا کنیم:
sudo usermod -aG sudo username
دستور gpasswd میتواند بهاینصورت نیز استفاده شود:
sudo gpasswd -a username sudo
هر دو دستور یک خروجی را ارائه میدهند. در سیستمعامل CentOS، معمولا بهجای گروه sudo، گروه wheel در دسترس قرار دارد. بنابراین، در این سیستمعامل، دستور به شکل زیر تغییر میکند:
sudo usermod -aG wheel username
یا استفاده از gpasswd:
sudo gpasswd -a username wheel
در CentOS اگر افزودن کاربر به گروه بلافاصه نتیجه دلخواه را ارائه نکرد، میتوانید با ویرایش فایل etc/sudoers/، نام گروه را از حالت کامنت خارج کنید:
sudo visudo . . . %wheel ALL=(ALL) ALL . . .
چطور قوانین سفارشی را ایجاد کنیم
اکنون که با سینتکس کلی فایل etc/sudoers/ آشنا شدهاید، اجازه بدهید ببینیم چطور میتوان قوانین جدیدی را ایجاد کنیم. این کار برای مواقعی که سرور مجازی لینوکس خریدهاید و چند کاربر به آن دسترسی دارند میتواند بسیار مفید باشد.
چطور Alias جدید ایجاد کنیم
با گروهبندی موارد مختلف از طریق ایجاد Aliasهای متفاوت، بهراحتی میتوان فایل sudoers را سازماندهی کرد. برای مثال، ما میتوانید سه گروه مختلف از کاربران را ایجاد کنیم که از نظر عضویت با یکدیگر همپوشانی دارند:
. . . User_Alias GROUPONE = abby, brent, carl User_Alias GROUPTWO = brent, doris, eric, User_Alias GROUPTHREE = doris, felicia, grant . . .
نامهای گروه باید با حرف بزرگ آغاز شود. سپس میتوانیم به اعضای گروه GROUPTWO اجازه دهیم تا دیتابیس apt را بهروزرسانی کنند. بهاینمنظور از دستور زیر استفاده میکنیم:
. . . GROUPTWO ALL = /usr/bin/apt-get update . . .
اگر کاربر/گروهی را مشخص نکنیم (مثل کاری که در بالا انجام دادیم)، sudo بهطور پیشفرض برای کاربر روت اعمال میشود.
ما میتوانیم با ایجاد یک command alias و استفاده از آن در قانون مربوط به گروه GROUPTHREE، به اعضای این گروه اجازه دهیم تا دستگاه را خاموش یا ریستارت کنند:
. . . Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart GROUPTHREE ALL = POWER . . .
ما یک command alias بهنام POWER ایجاد میکنیم که حاوی دستوراتی برای خاموش کردن یا راهاندازی مجدد دستگاه است. سپس به اعضای GROUPTHREE اجازه میدهیم تا این دستورات را اجرا کنند.
ما همچنین میتوانیم aliasهایی تحتعنوان Run as ایجاد کنیم که میتواند جایگزین بخشی از قانون شود که تعیین میکند کاربر با چه عنوانی دستور را اجرا خواهد کرد:
. . . Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL . . .
این دستور به هر کسی که عضور گروه GROUPONE است اجازه میدهد تا دستورات را بهعنوان کاربر www-data یا کاربر آپاچی اجرا کند.
بهخاطر داشته باشید که قوانینی که بعدا تعیین میکنید در صورت تضاد با قوانین قبلی، به لغو شدن قوانین قبلی منجر میشود.
چگونه قوانین را قفل کنیم
برای اینکه بر نحوه واکنش sudo نسبت به فراخوانی کنترل بیشتری داشته باشید، چندین راه وجود دارد.
دستور updated مرتبط با بسته molocate در سیستم تک کاربره نسبتا بیضرر است. اگر بخواهیم به کاربران اجازه بدهیم بدون نیاز به تایپ کردن رمزعبور، آن را با امتیازات روت اجرا کنند، میتوانیم قانونی مانند زیر را ایجاد کنیم:
. . . GROUPONE ALL = NOPASSWD: /usr/bin/updatedb . . .
تگ NOPASSWD به این معنی است که هیچ رمزعبوری درخواست نمیشود. این تگ همراه با یک دستور تحتعنوان PASSWD بهکار میرود که بهصورت پیشفرض اجرا میشود. یک تگ تا زمانی که توسط تگ مشابه خودش در ادامه خط رد نشود، برای قانون موردنظر اعمال میشود.
بهعنوان مثال، میتوانیم خطی مانند زیر داشته باشیم:
. . . GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill . . .
تگ مفید دیگر NOEXEC است که میتواند برای جلوگیری از برخی رفتارهای خطرناک در برنامههای خاص استفاده شود.
بهعنوان مثال، برخی از برنامهها مانند less میتوانند با تایپ این دستورات از داخل رابط خود، دستورات دیگری را تولید کنند:
! command_to_run
این دستور اساسا هر دستوری را که کاربر درخواست میکند با همان امتیازاتی که less تحت آنها اجرا میشود اجرا میکند که میتواند بسیار خطرناک باشد. برای محدود کردن این قابلیت، میتوانیم از خطی مانند زیر استفاده کنیم:
. . . username ALL = NOEXEC: /usr/bin/less . . .
اطلاعات متفرقه
اطلاعات دیگری نیز وجود دارد که ممکن است هنگام کار با sudo مفید باشد. اگر کاربر یا گروهی را در فایل پیکربندی بهعنوان run as معرفی کنید، میتوانید با استفاده از فلگهای -u و -g دستورات را بهترتیب بهعنوان آن کاربران یا گروهها اجرا کنید:
sudo -u run_as_user command sudo -g run_as_group command
برای راحتی بیشتر، بهطور پیشفرض sudo جزئیات احراز هویت شما را برای مدت معینی در یک نرمینال ذخیره میکند. این یعنی تا زمانی که بازه زمانی مشخصشده به پایان نرسد، مجبور نیستید رمزعبور خود را دوباره وارد کنید.
اما از نظر امنیتی، اگر میخواهید پس از پایان اجرای دستورات مدیریتی، این بازه زمانی را غیرفعال کنید، میتوانید از دستور زیر استفاده کنید:
sudo -k
از سوی دیگر، اگر میخواهید بعدا از شما خواسته نشود مجوز sudo خود را تایید یا مشخصات ورود را وارد کنید، میتوانید دستور زیر را بهکار ببرید:
sudo -v
پس از اجرای این دستور، از شما خواسته میشود که رمزعبور خود را وارد کنید. تا زمانی که بازه زمانی sudo منقضی شود، برای استفادههای بعدی از دستور sudo این رمزعبور در حافظه cache ذخیره میشود.
اگر میخواهید بدانید چه نوع امتیازاتی برای نام کاربری شما تعریف شده است، کافیست از دستور زیر استفاده کنید:
sudo -l
با این کار تمام قوانین موجود در فایل /etc/sudoers که برای کاربر شما اعمال میشود، بهصورت یک فهرست ارائه خواهد شد. بهاینترتیب میتوانید خیلی سریع متوجه شوید که بهعنوان یک کاربر اجازه انجام چه کارهایی با دستور sudo را دارید یا از انجام آن منع شدهاید.
در بسیاری از مواقع، شما دستوری را اجرا میکنید و با شکست مواجه میشوید، زیرا فراموش کردهاید که قبل از اجرای آن از دستور sudo استفاده کنید. برای جلوگیری از تایپ مجدد دستور، میتوانید از یک عملکرد bash بهمعنای «تکرار آخرین فرمان» استفاده کنید:
sudo !! . . . Defaults insults . . .
این دستور باعث میشود تا وقتی که یک کاربر رمزعبور اشتباهی را برای sudo وارد میکند، sudo یک پیام خطای خندهدار را نمایش بدهد. ما میتوانیم از sudo -k برای پاک کردن رمزعبور کششده sudo استفاده کرده و مجددا رمزعبور را وارد کنیم:
sudo -k sudo ls Output [sudo] password for demo: # enter an incorrect password here to see the results 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 و روشهای مختلف بهدست آوردن امتیازات روت، درک اولیهای داشته باشید.
بهیاد داشته باشید، امتیازات سوپر یوزر بنابر دلایلی به کاربران عادی اعطا نمیشود! خیلی مهم است که بدانید هر دستوری که با امتیازات روت اجرا میکنید دقیقا چه کاری انجام میدهند. بهترین روشِ استفاده از این ابزارها را با توجه به نیازتان کشف کنید و هر قابلیتی که به آن نیازی پیدا نمیکنید را قفل کنید تا از مشکلات آینده جلوگیری شود.
امتیاز شما به این مطلب
[*]
[*] منبع