در لینوکس و سیستم عامل های unix بیس تنها کاربر root میتواند تمامی دستورات را اجرا کند و همچنین عملیات حیاتی خاص روی سیستم همانند نصب و آپدیت، حذف پکیج ها، ایجاد users و groups تغییر فایل های کانفیگ مهم سیستم و ... را انجام دهد.
به هر حال یک مدیر سیستم که نقش کاربر root را دارد میتواند به کاربرهای عادی سیستم و با استفاده از دستور sudo و کمی تنظیمات این جواز را بدهد که بعضی دستورات را اجرا کند و یا تعدادی از عملیات حیاتی سیستم را شامل مواردی که در بالا ذکر شد انجام دهد.
توصیه میشود مطالعه کنید :
تفاوت بین دستور su و sudo در linux و نحوه تنظیمات sudo
بی احترامی sudo به کاربرانی که پسورد اشتباه وارد میکنند
همچنین مدیر سیستم میتواند پسورد کاربر root را share کند (که این روش اصلا توصیه نمیشود) بنابراین کاربر عادی سیستم به یوزر root و از طریق دستور su دسترسی خواهد داشت.
sudo به یک کاربر مجاز این امکان را میدهد که دستورات را همانند root (یا کاربر دیگر) همانطور که توسط policy امنیتی مشخص شده است اجرا کند :
در زیر 10 مورد از تنظیمات فایل /etc/sudoers برای تغییر رفتار دستور sudo با استفاده از ورودی های default را مشاهده میکنید.
انواع ورودی های Default
پارامترها در بالا ممکن است flags, integer values, strings و یا list باشد. شما باید دقت کنید که flag ها به طور نسبی boolean (صفر و یک) هستند و میتوان آنها را با استفاده از عملگر "!" غیر فعال کرد و list ها 2 عملگر اختصاصی اضافی دارند : += (اضافه کردن به list) و -= (حذف از list)
1 - تعریف یک مسیر امن
این همان مسیری هست که برای هر کامندی که با sudo اجرا شود استفاده میگردد، که از 2 اهمیت برخوردار است :
برای تعریف آن خط زیر را اضافه کنید.
2 - فعال کردن sudo روی TTY در session لاگین یوزر
برای اینکه از یک TTY واقعی (نه از طریق متدهایی مانند cron یا اسکریپ های cgi-bin) فراخوانی sudo را فعال کنیم خط زیر را به تنظیمات اضافه میکنیم.
3 - اجرای دستور sudo با استفاده از یک pty
در زمان کمی، attacker ها میتوانند یک نرم افزار مخرب (همانند یک ویروس یا بدافزار) را با استفاده از sudo اجرا کنند، که میتواند دوباره یک پراسس بک گراند را ایجاد کند که در ترمینال کاربر حتی زمانیکه برنامه اصلی اجرای کار خود را به پایان میرساند، باقی میماند.
برای جلوگیری از این چنین سناریوهایی شما میتوانید تنظیم کنید که sudo کامندهای دیگر را تنها از یک psudo-pty و با استفاده از پارامتر use_pty اجرا کند، چه I/O logging فعال باشد و چه فعال نباشد.
4 - ایجاد یک فایل log برای sudo
به صورت پیش فرض sudo از طریق syslog(3) لاگ می اندازد. به هر حال برای مشخص کردن یک فایل log custom از پارامتر log file همانند زیر استفاده کنید.
برای لاگ کردن hostname و سال چهار رقمی در فایل custom از پارامترهای log_host و log_year به ترتیب و همانند زیر استفاده کنید.
در زیر نمونه ای از یک لاگ فایل sudo مشاهده میکند.
5 - log کردن input/output دستور sudo
پارامترهای log_input و log_output به sudo این امکان را میدهند تا یک دستور را pseudo-tty اجرا کند و همه input های کاربر و همه output های ارسال شده به صفحه را به ترتیب لاگ کند.
دایرکتور پیش فرض لاگ ورودی/خروجی /var/log/sudo-io میباشد و اگر یک session sequence number وجود داشته باشد در این دایرکتوری ذخیره میشود. شما میتونید یک دایرکتوری custom برای این امر و از طریق پارامتر iolog_dir مشخص کنید.
چندین escape sequence نیز پشتیبانی میشوند همانند %{seq} که به یک شماره sequence با base-36 و سعودی یکنواخت گسترش میابد. همانند 000001 که هر دو عدد برای تشکیل یک دایرکتوری جدید استفاده میشود. به طور مثال 00/00/01 در دستور زیر را مشاهده کنید.
شما میتوانید ما بقی فایل های درون آن دایرکتوری را با استفاده از دستور cat مشاهده کنید.
6 - Lecture کردن به کاربران Sudo
برای lecture کردن به کاربران sudo درباره کاربرد پسورد روی سیستم از پارامتر lecture همانند زیر استفاده میشود.
برای این پارامتر 3 مقدار زیر استفاده میشود :
علاوه بر این شما میتوانید یک فایل lecture دستی با استفاده از پارامتر lecture_file تعریف کنید و پیغام مناسب را درون فایل قرار دهید :
7 - نمایش پیغام های Custom زمانی که شما پسورد اشتباهی برای sudo وارد کنید
زمانی که یک یوزر یک پسورد اشتباه وارد کند یک پیغام خاص در کامند لاین نمایش داده میشود. پیغام پیش فرض "sorry, try again" میباشد شما میتوانید این پیغام را با استفاده از پارامتر badpass_message همانند زیر تغییر دهید.
8 - افزایش محدودیت تعداد دفعات پسورد در sudo
پارامتر passwd_tries برای مشخص کردن تعداد دفعاتی که یک کاربر میتواند برای وارد کردن پسوردش تلاش کند استفاده میشود.
مقدار پیش فرض 3 میباشد.
برای تعریف کردن time out پسورد (مقدار پیش فرض 5 دقیقه میباشد) از پارامتر passw_timeoute استفاده کنید. خط زیر را به فایل اضافه کنید.
9 - تنظیمات برای توهین به هنگام وارد کردن پسورد اشتباه
در مواردی که یک کاربر پسورد اشتباه وارد میکند sudo میتواند یکسری توهین و بی احترامی روی ترمینال نمایش دهد که با استفاده از پارامتر insult امکان پذیر است. که این گزینه به صورت اتوماتیک پارامتر badpass_message را غیر فعال میکند.
10 - یادگیری تنظیمات بیشتر Sudo
علاوه بر این شما میتوانید تنظیمات بیشتر دستور sudo را با مطالعه کردن پست زیر یاد بگیرید.
مدیریت کاربران و سطح دسترسی آنها به فایل ها، Attribute ها و فعال کردن دسترسی sudo روی Account ها
همین بود! شما میتوانید تنظیمات مفید sudo و یا ترفند های جالب در این زمینه را با ما به اشتراک بگذارید.
به هر حال یک مدیر سیستم که نقش کاربر root را دارد میتواند به کاربرهای عادی سیستم و با استفاده از دستور sudo و کمی تنظیمات این جواز را بدهد که بعضی دستورات را اجرا کند و یا تعدادی از عملیات حیاتی سیستم را شامل مواردی که در بالا ذکر شد انجام دهد.
توصیه میشود مطالعه کنید :
تفاوت بین دستور su و sudo در linux و نحوه تنظیمات sudo
بی احترامی sudo به کاربرانی که پسورد اشتباه وارد میکنند
همچنین مدیر سیستم میتواند پسورد کاربر root را share کند (که این روش اصلا توصیه نمیشود) بنابراین کاربر عادی سیستم به یوزر root و از طریق دستور su دسترسی خواهد داشت.
sudo به یک کاربر مجاز این امکان را میدهد که دستورات را همانند root (یا کاربر دیگر) همانطور که توسط policy امنیتی مشخص شده است اجرا کند :
- فایل /etc/sudoers خوانده و بررسی میشود همچنین یوزر مورد نظر و پرمیژن های او مورد بررسی قرار میگیرند.
- سپس از یوزر مورد نظر یک پسورد خواسته میشود معمولا پسورد کاربر یا میتواند با تگ NOPASSWD نادیده گرفته شود.
- بعد از ان sudo یک child proccess ایجاد میکند و در آن setuid() را برای سوییچ کردن به کاربر مورد نظر فرا میخواند.
- سپس یک شل یا دستوری که به عنوان argument در child proccess بالا داده شده را اجرا میکند.
در زیر 10 مورد از تنظیمات فایل /etc/sudoers برای تغییر رفتار دستور sudo با استفاده از ورودی های default را مشاهده میکنید.
کد PHP:
$ sudo cat /etc/sudoers
کد PHP:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults logfile="/var/log/sudo.log"
Defaults lecture="always"
Defaults badpass_message="Password is wrong, please try again"
Defaults passwd_tries=5
Defaults insults
Defaults log_input,log_output
کد PHP:
Defaults parameter, parameter_list #affect all users on any host
Defaults@Host_List parameter, parameter_list #affects all users on a specific host
Defaults:User_List parameter, parameter_list #affects a specific user
Defaults!Cmnd_List parameter, parameter_list #affects a specific command
Defaults>Runas_List parameter, parameter_list #affects commands being run as a specific user
کد PHP:
Defaults parameter
OR
Defaults parameter=value
OR
Defaults parameter -=value
Defaults parameter +=value
OR
Defaults !parameter
1 - تعریف یک مسیر امن
این همان مسیری هست که برای هر کامندی که با sudo اجرا شود استفاده میگردد، که از 2 اهمیت برخوردار است :
- هنگامی که یک ادمین سیستم به کاربران sudo اعتماد ندارد استفاده میشود و به منظور داشتن یک متغییر محیطی path امن میباشد.
- برای جداسازی root path (مسیر کاربر root) و user path (مسیر کاربر عادی) استفاده میشود و تنها کاربرانی که توسط exempt_group مشخص شده اند از این تنظیمات تاثیر نمی پذیرند.
برای تعریف آن خط زیر را اضافه کنید.
کد PHP:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
2 - فعال کردن sudo روی TTY در session لاگین یوزر
برای اینکه از یک TTY واقعی (نه از طریق متدهایی مانند cron یا اسکریپ های cgi-bin) فراخوانی sudo را فعال کنیم خط زیر را به تنظیمات اضافه میکنیم.
کد PHP:
Defaults requiretty
3 - اجرای دستور sudo با استفاده از یک pty
در زمان کمی، attacker ها میتوانند یک نرم افزار مخرب (همانند یک ویروس یا بدافزار) را با استفاده از sudo اجرا کنند، که میتواند دوباره یک پراسس بک گراند را ایجاد کند که در ترمینال کاربر حتی زمانیکه برنامه اصلی اجرای کار خود را به پایان میرساند، باقی میماند.
برای جلوگیری از این چنین سناریوهایی شما میتوانید تنظیم کنید که sudo کامندهای دیگر را تنها از یک psudo-pty و با استفاده از پارامتر use_pty اجرا کند، چه I/O logging فعال باشد و چه فعال نباشد.
کد PHP:
Defaults use_pty
4 - ایجاد یک فایل log برای sudo
به صورت پیش فرض sudo از طریق syslog(3) لاگ می اندازد. به هر حال برای مشخص کردن یک فایل log custom از پارامتر log file همانند زیر استفاده کنید.
کد PHP:
Defaults logfile="/var/log/sudo.log"
کد PHP:
Defaults log_host, log_year, logfile="/var/log/sudo.log"
5 - log کردن input/output دستور sudo
پارامترهای log_input و log_output به sudo این امکان را میدهند تا یک دستور را pseudo-tty اجرا کند و همه input های کاربر و همه output های ارسال شده به صفحه را به ترتیب لاگ کند.
دایرکتور پیش فرض لاگ ورودی/خروجی /var/log/sudo-io میباشد و اگر یک session sequence number وجود داشته باشد در این دایرکتوری ذخیره میشود. شما میتونید یک دایرکتوری custom برای این امر و از طریق پارامتر iolog_dir مشخص کنید.
کد PHP:
Defaults log_input, log_output
کد PHP:
$ cd /var/log/sudo-io/
$ ls
$ cd 00/00/01
$ ls
$ cat log
شما میتوانید ما بقی فایل های درون آن دایرکتوری را با استفاده از دستور cat مشاهده کنید.
6 - Lecture کردن به کاربران Sudo
برای lecture کردن به کاربران sudo درباره کاربرد پسورد روی سیستم از پارامتر lecture همانند زیر استفاده میشود.
برای این پارامتر 3 مقدار زیر استفاده میشود :
- always : همیشه به یک یوزر lecture کند.
- once : تنها در اولین بار که یک کاربر دستور sudo را اجرا میکند به او lecture کند. (این اپشن زمانی که هیچ مقداری ست نشود استفاده میشود)
- never : هرگز به یوزر lecture نمیکند.
کد PHP:
Defaults lecture="always"
کد PHP:
Defaults lecture_file="/path/to/file"
7 - نمایش پیغام های Custom زمانی که شما پسورد اشتباهی برای sudo وارد کنید
زمانی که یک یوزر یک پسورد اشتباه وارد کند یک پیغام خاص در کامند لاین نمایش داده میشود. پیغام پیش فرض "sorry, try again" میباشد شما میتوانید این پیغام را با استفاده از پارامتر badpass_message همانند زیر تغییر دهید.
کد PHP:
Defaults badpass_message="Password is wrong, please try again"
8 - افزایش محدودیت تعداد دفعات پسورد در sudo
پارامتر passwd_tries برای مشخص کردن تعداد دفعاتی که یک کاربر میتواند برای وارد کردن پسوردش تلاش کند استفاده میشود.
مقدار پیش فرض 3 میباشد.
کد PHP:
Defaults passwd_tries=5
برای تعریف کردن time out پسورد (مقدار پیش فرض 5 دقیقه میباشد) از پارامتر passw_timeoute استفاده کنید. خط زیر را به فایل اضافه کنید.
کد PHP:
Defaults passwd_timeout=2
9 - تنظیمات برای توهین به هنگام وارد کردن پسورد اشتباه
در مواردی که یک کاربر پسورد اشتباه وارد میکند sudo میتواند یکسری توهین و بی احترامی روی ترمینال نمایش دهد که با استفاده از پارامتر insult امکان پذیر است. که این گزینه به صورت اتوماتیک پارامتر badpass_message را غیر فعال میکند.
کد PHP:
Defaults insults
10 - یادگیری تنظیمات بیشتر Sudo
علاوه بر این شما میتوانید تنظیمات بیشتر دستور sudo را با مطالعه کردن پست زیر یاد بگیرید.
مدیریت کاربران و سطح دسترسی آنها به فایل ها، Attribute ها و فعال کردن دسترسی sudo روی Account ها
همین بود! شما میتوانید تنظیمات مفید sudo و یا ترفند های جالب در این زمینه را با ما به اشتراک بگذارید.