تفاوت میان su و sudo و پیکربندی sudo
سیستم عامل لینوکس از هر یک از همتاهای خود امنیت بیشتری دارد. یکی از راه های پیاده سازی امنیت در لینوکس، policy های مربوط به مدیریت یوزر و سطح دسترسی یوزر میباشد و اینکه یوزرهای معمولی برای انجام دادن هرگونه عملیاتی در سیستم مجاز نیستند. اگر یک یوزر معمولی برای انجام عملیات روی هر سیستمی قصد تغییرات گسترده داشته باشد، برای تغییرات به هر دوی دستورات su و sudo نیاز خواهد داشت.
نکته : این مقاله بیشتر برای توزیع های خانواده Ubuntu قابل اجرا هست، همچنین بر روی اکثر توزیع های معروف لینوکس قابل اجرا میباشد.
su در مقابل sudo
“su” شما را مجبور میکند پسورد root خود را برای یوزرهای دیگر به اشتراک بگذارید در حالیکه “sudo” باعث میشود دستورات سیستم بدون پسورد root اجرا شوند. sudo اجازه میدهد تا شما پسورد خودتان را برای اجرای دستورات سیستمی مانند امکان اجرای مسئولیت های سیستمی (بدون پسورد root)، استفاده کنید.
sudo چیست ؟
“sudo” یک setuid باینری root میباشد، که دستورات root را با یوزر های مجاز اجرا میکند و یوزرها نیاز دارند برای اجرا کردن دستورات سیستمی رمز عبورشان را توسط sudo وارد کنند.
چه کسی میتواند sudo را اجرا کند ؟
بمنظور اضافه/حذف لیست کسانی که بتوانند sudo را اجرا کنند باید دستور /usr/sbin/visudo را اجرا کنیم.
1 |
$ sudo /usr/sbin/visudo |
درتصویر زیر یک نمونه از فایل /usr/sbin/visudo را مشاهده میکنید :

بصورت پیش فرض لیست sudo شبیه به string زیر می باشد :
1 |
root ALL=(ALL) ALL |
نکته : تنها root میتواند فایل /usr/sbin/visudo را ویرایش کند.
اعطای دسترسی sudo به کاربر
در بسیاری از مواقع، ادمین سیستم، خصوصا ادمین هایی که تازه در این زمینه وارد شدند string بالا “root ALL=(ALL) ALL” را به عنوان یک tamplate تلقی میکنند و دسترسی نامحدود به کاربران دیگر میدهند که ممکن است به صورت بلقوه برای سیستم بسیار مضر باشد.
1 2 3 4 |
root ALL=(ALL) ALL adam ALL=(ALL) ALL tom ALL=(ALL) ALL mark ALL=(ALL) ALL |
پارامترهای sudo
یک sudo درست کانفیگ شده بسیار انعطاف پذیری دارد و تعداد دستورهایی که نیاز است اجرا شود به دقت کانفیگ شده اند.
ساختار خط sudo کانفیگ شده همانند زیر میباشد :
1 |
User_name Machine_name=(Effective_user) command |
ساختار بالا را به چهار بخش میتوان تقسیم کرد :
- User_name : نام یوزر sudo میباشد.
- Machine_name : در حقیقت host name ی میباشد که دستور sudo برای آن معتبر (valid) است، این گزینه زمانی مفید است که چندین هاست داشته باشیم.
- (Effective_user) : کاربران ‘Effective user’ که مجاز به اجرا کردن دستورها هستند. این مورد به شما این امکان را میدهد که به کاربران اجازه اجرا کردن دستورات سیستمی را بدهید.
- Command : دستور یا مجموعه ای از دستوراتی که کاربر ممکن است اجرا کند.
در زیر یکسری موقعیت ها و خط های sudo مربوط به آنها را لیست کردیم :
1 – شما یک کاربر به نام mark دارید که ادمین یک دیتابیس است شما قصد دارید که فقط همه دسترسی های روی سرور دیتابیس (beta.database_server.com) و نه هر هاست دیگری را به این کاربر بدهید.
برای موقعیت بالا خط sudo میتواند به شیوه زیر نوشته شود.
1 |
mark beta.database_server.com=(ALL) ALL |
2 – شما یک کاربر به نام tom دارید که میخواهید دستورات سیستم را به عنوان یک یوزر غیر از root و روی همان سرور دیتابیس که در بالا توضیح دادیم اجرا کند.
برای موقعیت بالا خط sudo میتواند به شیوه زیر نوشته شود.
1 |
mark beta.database_server.com=(tom) ALL |
3 – شما یک یوزر sudo به نام cat دارید و میخواهید تنها دستور dog را اجرا کند.
برای اجرا کردن شرایط بالا sudo را همانند زیر میتوانید بنویسید.
1 |
mark beta.database_server.com=(cat) dog |
4 – اگر نیاز باشد که به یک کاربر اجازه اجرا کردن چندین دستور را بدهیم و اگر تعداد دستوراتی که یک کاربر قرار است بتواند اجرا کند زیر 10 عدد باشد ما میتوانیم تمام آن دستورات را به همراه خط sudo و با استفاده از یک فاصله بین هر کدام مشخص کنیم :
1 |
mark beta.database_server.com=(cat) /usr/bin/command1 /usr/sbin/command2 /usr/sbin/command3 ... |
اگر تعداد این دستورات از یک رنج مشخص تغییر کند و به صورت منطقی امکان تایپ هر دستور به صورت دستی نباشد ما نیاز داریم که از aliases استفاده کنیم. aliases یکی از ابزارهای لینوکسی است که با آن دستورات طولانی یا یک لیستی از دستورات را میتوان با یک کیبرد کوتاه و راحت جایگزین کرد.
تعداد کمی از مثال های alias که میتوان در خط فایل کانفیگ sudo مورد استفاده قرار داد به شرح زیر میباشد :
1 2 |
User_Alias ADMINS=tom,jerry,adam user_Alias WEBMASTER=henry,mark |
1 2 |
WEBMASTERS WEBSERVERS=(www) APACHE Cmnd_Alias PROC=/bin/kill,/bin/killall, /usr/bin/top |
امکان مشخص کردن یک system groups به جای کاربرهایی که به آن گروه متعلق هستند نیز با استفاده از پیشوند ٪ همانند زیر امکان پذیر میباشد.
1 |
%apacheadmin WEBSERVERS=(www) APACHE |
5 – امکان اجرا کردن یک دستور sudo بدون وارد کردن پسورد
ما میتوانیم یک دستور sudo را بدون وارد کردن پسورد و با استفاده از آپشن‘NOPASSWD‘ اجرا کنیم.
1 |
adam ALL=(ALL) NOPASSWD: PROCS |
اینجا یوزر adam قادر به اجرا کردن تمامی دستورات alias شده تحت PROCS را بدون وارد کردن پسورد میباشد.
توصیه میشود این مقاله را هم مطالعه فرمایید :بی احترامی sudo به کاربری که پسورد اشتباه وارد کند
sudo برای شما یک محیط امن و قدرتمند با انعطاف پذیری قابل مقایسه با su فراهم میآورد. علاوه بر آن تنظیمات sudo آسان است و بعضی از توزیع های لینوکسی به صورت پیش فرض sudo را فعال کردند در حالیکه دربیشتر توزیع های امروزی شما نیاز دارید که آنرا با عنوان یک معیار امنیتی فعال کنید.
برای اضافه کردن کاربری با نام bob به لیست sudo تنها کافیست که دستور زیر را با root اجرا کنید.
1 |
adduser bob sudo |