مجوزهای فایل در لینوکس

سلام به همه. ما به طور فعال وارد کار شده ایم و در حال آماده سازی پرتاب های قدرتمند بسیاری در ژانویه هستیم. از جمله، ثبت نام برای یک جریان جدید از دوره مورد علاقه همه اعلام شده است. "مدیر لینوکس". در پیش بینی راه اندازی، ما به طور سنتی ترجمه های مطالب مفید را به اشتراک می گذاریم.

مجوزهای فایل در لینوکس

مجوزهای فایل یک جایگزین امن برای فایل های اجرایی SUID ارائه می دهند، اما در ابتدا ممکن است کمی گیج کننده به نظر برسند.


همه ما می دانیم که باینری ها جنوب هستیم تصمیم بد از نظر امنیتی. خوشبختانه، اگر برنامه شما به برخی از امتیازات محدود نیاز دارد، راه کارآمدتری وجود دارد که نامیده می شود مجوزهای فایل.

اگر می‌خواهید از مطالعه جزئیات مقاله بالا خودداری کنید، در وقت شما صرفه‌جویی می‌کنم: اساساً، مجوزهای فایل به فرآیندهایی اجازه می‌دهند که به صورت روت اجرا شوند و بنابراین مجاز به انجام کاری برای حفظ قابلیت‌های خاص، محدود هستند. این لیستهنگامی که آنها امتیازات را حذف می کنند و توسط یک کاربر غیرمجاز اجرا می شوند. این به این معنی است که اگر یک مهاجم با استفاده از یک سرریز بافر یا سایر اکسپلویت‌ها، بتواند فرآیندی را به خطر بیاندازد، نمی‌تواند از چیزی غیر از حداقل امتیازات خاصی که فرآیند واقعاً به آن نیاز دارد استفاده کند.

مجوزها برای سرویس هایی که معمولاً همیشه به صورت روت اجرا می شوند عالی هستند، اما در مورد ابزارهای خط فرمان چطور؟ خوشبختانه، این نیز به شرط نصب ابزارهای مناسب پشتیبانی می شود. اگر از اوبونتو استفاده می کنید، به عنوان مثال به این بسته نیاز دارید libcap2-bin. همچنین باید یک هسته غیر باستانی (از نسخه 2.6.24).

این توابع اجازه می دهد تا مجوزها با فایل های اجرایی مرتبط شوند، مشابه تنظیم بیت SUID، اما فقط برای مجموعه خاصی از مجوزها. سودمند setcap برای افزودن و حذف مجوزها از یک فایل استفاده می شود.

اولین قدم این است که مجوزهای مورد نیاز خود را انتخاب کنید. به خاطر این مقاله، فرض می‌کنم که یک ابزار تشخیص شبکه به نام وجود دارد tracewalk، که باید بتوان از آن استفاده کرد سوکت های خام. این معمولاً نیاز دارد که برنامه به صورت روت اجرا شود، اما هنگام مشاهده لیست معلوم می شود که فقط مجوز لازم است CAP_NET_RAW.

با فرض اینکه شما در فهرستی هستید که باینری در آن قرار دارد tracewalk، می توانید این مجوز را به صورت زیر اضافه کنید:

sudo setcap cap_net_raw=eip tracewalk

فعلاً پسوند را نادیده بگیرید =eip برای حل، من در چند ثانیه در مورد آن صحبت خواهم کرد. توجه داشته باشید که نام مجوز با حروف کوچک است. اکنون می توانید بررسی کنید که آیا مجوزها را به درستی پیکربندی کرده اید:

setcap -v cap_new_raw=eip tracewalk

یا می توانید تمام مجوزهای تنظیم شده برای یک فایل اجرایی معین را فهرست کنید:

getcap tracewalk

برای مرجع، همچنین می توانید تمام مجوزها را از فایل اجرایی حذف کنید:

setcap -r tracewalk

در این مرحله، شما باید بتوانید فایل اجرایی را به عنوان یک کاربر غیرمجاز اجرا کنید، و باید بتواند با سوکت های خام کار کند، اما هیچ یک از امتیازات دیگری که کاربر root دارد را نداشته باشد.

پس این پسوند عجیب به چه معناست؟ =eip? این نیاز به درک خاصی از ماهیت مجوزها دارد. هر فرآیند دارای سه مجموعه مجوز - است موثر، ارثی و مجاز:

  • تاثير گذار مجوزها آنهایی هستند که مشخص می کنند یک فرآیند واقعاً چه کاری می تواند انجام دهد. مثلا نمی تواند با سوکت های خام اگر CAP_NET_RAW در مجموعه موثر نیست.
  • در دسترس مجوزها، مجوزهایی هستند که در صورت درخواست فرآیند با استفاده از فراخوانی مناسب، مجاز به داشتن آنها هستند. آنها مانع از انجام هر کاری فرآیندی می شوند، مگر اینکه به طور خاص برای درخواست مجوز نوشته شده باشد. این اجازه می دهد تا فرآیندها برای افزودن مجوزهای حیاتی به مجموعه مؤثر فقط برای دوره ای که واقعاً مورد نیاز هستند، نوشته شوند.
  • قابل وراثت مجوزها آنهایی هستند که می توانند در مجموعه قابل دسترسی فرآیند فرزندآوری شده به ارث برده شوند. در حین جراحی fork() یا clone() به فرآیند فرزند همیشه یک کپی از مجوزهای فرآیند والد داده می شود زیرا هنوز همان فایل اجرایی را در آن نقطه اجرا می کند. یک مجموعه ارثی زمانی استفاده می شود که exec() (یا معادل) برای جایگزینی فایل اجرایی با فایل دیگری فراخوانی می شود. در این مرحله، مجموعه در دسترس فرآیند توسط مجموعه ارثی پوشانده می شود تا مجموعه قابل دسترسی که برای فرآیند جدید استفاده می شود، به دست آید.

بنابراین ابزار setcap به ما اجازه می دهد تا مجوزهای این سه مجموعه را به طور مستقل برای یک فایل اجرایی مشخص اضافه کنیم. توجه داشته باشید که معنای گروه ها برای مجوزهای فایل کمی متفاوت تفسیر می شود:

  • در دسترس است مجوزهای فایل آنهایی هستند که همیشه در دسترس یک فایل اجرایی هستند، حتی اگر فرآیند والد که آن را فراخوانی کرده است، آنها را نداشته باشد. قبلاً به آنها مجوزهای "اجباری" می گفتند.
  • به ارث برده مجوزهای فایل یک ماسک اضافی را تعریف می کنند که می تواند برای حذف مجوزها از مجموعه فرآیند فراخوانی نیز استفاده شود. آنها علاوه بر مجموعه ارثی فرآیند فراخوانی اعمال می شوند، بنابراین مجوز تنها در صورتی به ارث می رسد که در هر دو مجموعه وجود داشته باشد.
  • تاثير گذار مجوزهای فایل در واقع فقط یک بیت هستند، نه یک مجموعه، و اگر تنظیم شوند، به این معنی است که کل مجموعه موجود نیز در مجموعه موثر فرآیند جدید کپی می شود. این می تواند برای اضافه کردن مجوزها به فرآیندهایی که به طور خاص برای درخواست آنها نوشته نشده اند استفاده شود. از آنجایی که یک بیت است، اگر آن را برای هر مجوزی تنظیم کنید، باید برای همه مجوزها تنظیم شود. شما می توانید آن را به عنوان یک بیت قدیمی در نظر بگیرید زیرا برای اجازه استفاده از مجوزها توسط برنامه هایی که از آنها پشتیبانی نمی کنند استفاده می شود.

هنگام تعیین مجوزها از طریق setcap سه حرف e, i и p رجوع شود به موثر، ارثی و قابل دسترسی است به ترتیب مجموعه می کند. بنابراین، مشخصات قبلی:

sudo setcap cap_net_raw=eip tracewalk

... نشان می دهد که قطعنامه CAP_NET_RAW باید به مجموعه های موجود و ارثی اضافه شود و بیت موثر نیز باید تنظیم شود. با این کار تمام مجوزهای تنظیم شده قبلی روی فایل لغو می شود. برای تنظیم چندین مجوز به طور همزمان، از یک لیست جدا شده با کاما استفاده کنید:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

راهنمای مجوزها همه اینها را با جزئیات بیشتری مورد بحث قرار می دهد، اما امیدواریم که این پست کمی از آنچه در حال وقوع است ابهام کند. تنها چند نکته و ترفند باقی مانده است که باید به آنها اشاره کرد.

اولاً، قابلیت‌های فایل با پیوندهای نمادین کار نمی‌کنند - شما باید آن‌ها را در خود فایل باینری (یعنی هدف پیوند علامت) اعمال کنید.

دوم اینکه با اسکریپت های تفسیر شده کار نمی کنند. به عنوان مثال، اگر یک اسکریپت پایتون دارید که می خواهید به آن مجوز بدهید، باید آن را به خود مفسر پایتون اختصاص دهید. بدیهی است که این یک مشکل امنیتی بالقوه است زیرا در این صورت همه اسکریپت های اجرا شده با آن مفسر مجوز مشخص شده را خواهند داشت، اگرچه این هنوز به طور قابل توجهی بهتر از ساختن آن SUID است. به نظر می رسد رایج ترین راه حل، نوشتن یک فایل اجرایی جداگانه به زبان C یا معادل آن باشد که بتواند عملیات لازم را انجام دهد و آن را از یک اسکریپت فراخوانی کند. این شبیه به روشی است که توسط Wireshark استفاده می شود که از یک باینری استفاده می کند /usr/bin/dumpcap برای انجام عملیات ممتاز:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

سوم، در صورت استفاده از متغیر محیطی، مجوزهای فایل غیرفعال می شوند LD_LIBRARY_PATH به دلایل امنیتی آشکار(1). همین امر در مورد LD_PRELOAD، تا آنجایی که من میدانم.

1. بدیهی است که یک مهاجم می تواند جایگزین یکی از کتابخانه های استاندارد شده و استفاده کند LD_LIBRARY_PATHبرای وادار کردن کتابخانه خود به فراخوانی در اولویت نسبت به سیستم یک، و بنابراین کد دلخواه خود را با همان امتیازات برنامه فراخوانی اجرا می کند.

همین. جزئیات بیشتر در مورد برنامه دوره را می توانید در اینجا پیدا کنید وبینار که در 24 ژانویه برگزار می شود.

منبع: www.habr.com

اضافه کردن نظر