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