قابلیت ها امکان ارزیابی برخی از امتیازات مهم سیستم را در یک رشته جداگانه متفاوت از فرآیند فعلی فراهم می کند. به این ترتیب، برای دسترسی به قسمت های خاصی از سیستم، نیازی به اجرای برنامه ای به عنوان روت ندارید.
قابلیت ها امکان ارزیابی برخی از امتیازات مهم سیستم را در یک رشته جداگانه متفاوت از فرآیند فعلی فراهم می کند. به این ترتیب، برای دسترسی به قسمت های خاصی از سیستم، نیازی به اجرای برنامه ای به عنوان روت ندارید.
به عنوان یک راه حل برخاسته از نیازها، بخش 25 POSIX.1e در مورد این موضوع است. توسعه امتیازات تعریف شده در آن بخش و موارد دیگر با انتشار هسته لینوکس نسخه 2.6.26 تکمیل شده است. در اینجا همه چیزهایی است که باید در مورد قابلیت های هسته لینوکس بدانید.
درک قابلیت های API Logic
کنترل مجوز در سیستم های مبتنی بر یونیکس شامل دو مرحله است:
- اگر مالک فعلی (شناسه کاربر مؤثر، EUID) برنامه در حال اجرا صفر باشد، سیستم مجوز را بررسی نمیکند.
- اگر مقدار EUID با صفر متفاوت باشد، سیستم فرآیند کنترل را مطابق با مجوزهای کاربر مؤثر و گروه برنامه مربوطه انجام می دهد.
برخی از برنامهها باید در حین اجرا از امتیازات گستردهتری (بیتهای SUID، SGIT) برخوردار باشند. به عنوان نمونه معمولی، می توانید به برنامه passwd فکر کنید. با این کار، کاربران در یک سیستم می توانند رمز عبور خود را تغییر دهند. با این حال، برای نوشتن در فایل /etc/shadow، جایی که گذرواژههای رمزگذاری شده نگهداری میشوند، باید با حقوق کاربر ریشه (یعنی شناسه کاربر = 0) کار کنید.
برای حل این مشکل، اپلیکیشن passwd یک بیت SUID دارد. هر کاربری که این برنامه را اجرا کند، مالک فعال (EUID) همیشه روت خواهد بود:
ls -l /usr/bin/passwd
# Output
-rwsr-xr-x. 1 root root 32552 Jul 23 2021 /usr/bin/passwd
به نظر می رسد توانایی اجرای برنامه های SUID در مدل سنتی احراز هویت یونیکس مشکل را حل کرده است. با این حال، خطاهای مهم در برنامههای کاربردی با بیتهای SUID، راه را برای اجرای کدهای ناخواسته برای کاربرانی که اختیار کامل در سیستم دارند، باز میکند. یک برنامه ایده آل باید در صورت امکان بدون نیاز به حقوق کاربر root اجرا شود.
مشکل فقط به بیت SUID ختم نمی شود. همچنین زمانی که می خواهید به پورت TCP یا UDP ممتاز کمتر از 1024 در سیستم های مبتنی بر یونیکس گوش دهید، باید حقوق کاربر ریشه داشته باشید. به عنوان مثال، برای اینکه بتوانید به پورت TCP 80 یک وب سرور گوش دهید، باید برنامه را به عنوان کاربر اصلی اجرا کنید.
در طول سالها، مشخص شده است که اجرای نرمافزارهایی که با یک حساب کاربری کاملا مجاز به محیط شبکه خدمات ارائه میدهند، چقدر ویرانگر است. به عنوان یک راه حل موقت، پذیرفته شد که تنها بخش معین و کوچکتری از برنامه به پورت ممتاز به عنوان روت گوش می دهد و سپس شناسه کاربر فعال را برای فرآیندهای بعدی به کاربر دیگری تغییر می دهد (به عنوان مثال، کاربر هیچکس با حقوق محدود) .
این سیستم که سال ها مورد استفاده قرار گرفته است، با سادگی خود به خوبی عمل کرده و همچنان به نحو احسن از آن استفاده می شود. با این حال، امروزه میتوان از طریق API قابلیتهای لینوکس، بدون نیاز به حقوق ریشه، به غیر از سیستم فوق، برخی قابلیتهای اضافی مخصوص اپلیکیشن را دریافت کرد.
مدل قابلیت لینوکس، توضیح داده شد!
شما می توانید جامع ترین اجرای API قابلیت ها را در هسته لینوکس پیدا کنید. توزیع های مدرن لینوکس نیز سعی می کنند تا حد امکان از این مدل جدید در سطح سیستم استفاده کنند.
به عنوان مثال، برای اینکه برنامه پینگ کار کند، باید بتواند سوکت های RAW را باز کند، که عموماً فقط برای کاربران روت رزرو شده اند. در توزیع های قدیمی لینوکس، مشکل این است که بیت SUID به برنامه داده شود تا کاربران عادی بتوانند از آن استفاده کنند. در این نسخه ها، وقتی بیت SUID را از برنامه حذف می کنید و سعی می کنید برنامه را به عنوان یک کاربر معمولی اجرا کنید، با خطای زیر مواجه می شوید:
ping 8.8.8.8
# Output
ping: icmp open socket: Operation not permitted
در حالی که در توزیع های لینوکس مدرن، برنامه پینگ احتمالاً بیت SUID را ندارد:
ls -l /bin/ping
# Output
-rwxr-xr-x. 1 root root 95232 Jul 25 2021 /bin/ping
با این وجود، می توانید برنامه را به عنوان یک کاربر عادی با موفقیت اجرا کنید. مکانیزمی که این امکان را فراهم می کند این است که برنامه پینگ دارای قابلیت ویژه CAP_NET_RAW است.
با دستور getcap می توانید قابلیت های اضافی اپلیکیشن را به صورت زیر بیاموزید:
sudo getcap /bin/ping
# Output
/bin/ping cap_net_raw=ep
اگر دستور getcap یک پاسخ خالی برمی گرداند، می توانید به صورت دستی این مقدار را با:
sudo setcap cap_net_raw+ep /bin/ping
مدل قابلیت فرآیند
در پیاده سازی لینوکس، قابلیت های هر فرآیند در سه عنوان دسته بندی می شوند:
قابلیت
بیانیه
مجاز است
در این خوشه، لیستی از قابلیت های اضافی مجاز برای فرآیند مربوطه وجود دارد. اعطای مجوز به این معنی نیست که در آن زمان می توان از آن به طور فعال استفاده کرد. امکان گنجاندن مجوزها در اینجا در مجموعه قابلیت موثر با یک اقدام اضافی وجود دارد.
موثر
لیست قابلیت فعال فعلی فرآیند مرتبط را نشان می دهد. با عملکردهای کمکی که سیستم مهارت را تنظیم می کنند، می توان مهارت را رها کرد یا دوباره به دست آورد. در هر صورت، این کار فقط در میان افرادی که قبلاً در گروه مجاز مجاز هستند، قابل انجام است.
ارثی
هنگامی که یک برنامه یک فرآیند جدید را شروع می کند، فرآیند تازه شروع شده لیستی از قابلیت هایی که از لیست مجاز به ارث می برد را نمایش می دهد.
لیست قابلیت های مجاز، موثر و قابل ارث بری برای اجرای فرآیندها در هر زمان به صورت بیت ماسک در خطوط CapPrm، CapEff و CapInh در فایل /proc/
به عنوان مثال، سعی کنید مقادیر برنامه شل در حال اجرا خود را از فایل /proc/self/status بخوانید:
cat /proc/self/status | grep Cap
# Output
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
مدل قابلیت فایل در لینوکس
عملکرد سیستم قابلیت فایل ها به پیش نیازی بستگی دارد که این ویژگی ها در لایه سیستم فایل مجازی (VFS) ذخیره شوند. مشابه مدل فرآیند، قابلیت های فایل ها در سه عنوان قرار می گیرند:
1. مجاز است
هنگامی که فایل اجرایی مربوطه در این خوشه اجرا می شود، سیستم قابلیت های مجاز فرآیند را تعیین می کند.
2. موثر
برخلاف مدل قابلیت فرآیند، این هدر فقط یک بیت را ذخیره می کند: فعال یا غیر فعال. در صورت فعال بودن بیت، قابلیت های تعریف شده در لیست مجاز فایل به صورت خودکار به لیست قابلیت های موثر فرآیند مربوطه در هنگام اجرا این فایل و ایجاد یک فرآیند منتقل می شود. اگر بیت فعال نباشد، انتقال خودکار قابلیت های مجاز روی فایل به فرآیند در حال اجرا انجام نمی شود.
اما اگر کد اپلیکیشن مربوطه با سیستم قابلیت ادغام شده باشد، می تواند مجوزهای موجود در مجموعه مجاز فایل را با فراخوانی های سیستمی فعال کند. هدف اصلی این رفتار این است که اطمینان حاصل شود که برنامههای قدیمی که شامل کدهای ویژه سیستم قابلیت نیستند، توسعه در سطح کد نرمافزار میتوانند بدون نیاز به تغییر کد منبع با سیستم قابلیت کار کنند.
ممکن است فکر کنید که برنامه های بهتر نوشته شده تنها در صورت نیاز از قابلیت ها استفاده می کنند. اگر بیت فعال باشد، تمام قابلیت های موجود در لیست مجاز با شروع برنامه فعال می شوند.
3. ارثی
همانطور که در مدل فرآیند، فایل مربوطه اجرا می شود و یک فرآیند رخ می دهد. اگر پس از آن برنامه دیگری از داخل فرآیند اجرا شود، در لیست مجاز فرآیند جدید قرار می گیرد. به طور خلاصه، فهرستی از قابلیت های به ارث بردن را نشان می دهد.
نقش قابلیت ها در یک سیستم لینوکس
هنگامی که یک فرآیند خاص را به عنوان یک کاربر عادی اجرا می کنید، هیچ امتیازی ندارید. در نتیجه، شما فقط می توانید به پارتیشن هایی دسترسی داشته باشید که سیستم برای کاربران عادی اجازه می دهد. دلیل اصلی این امر تشدید امنیت سیستم و اجرای چنین اقداماتی است.
اجازه دادن به همه کاربران برای دسترسی به همه منابع می تواند یک آسیب پذیری امنیتی جدی ایجاد کند. برای افرادی که از سیستم برای اهداف مخرب استفاده می کنند بسیار آسان خواهد بود تا از آسیب پذیری های سیستم سوء استفاده کنند. قابلیت های لینوکس در چنین مواردی مفید است. شما به راحتی می توانید امنیت برنامه های خود را با قابلیت های API تقویت شده توسط هسته تقویت کنید.
قابلیتهای لینوکس تنها یکی از مواردی است که برای انجام روشهای بسیار قدرتمندی مانند تقسیم مجوزهای کاربر ریشه، اختصاص مجوزهای مختلف به کاربران غیرمجاز و انجام اقدامات احتیاطی مختلف در مورد پورتهای باز در سرویسهای اینترنتی با سرورهای لینوکس، باید به آن فکر کرد.