این بار خطای دسترسی را مثل یک کارآگاه بررسی می‌کنیم: کدام فرآیند، به کدام شیء، چه عملیاتی خواسته است؟ هدف، تولید خودکار یک policy بزرگ نیست؛ پیدا کردن کوچک‌ترین اصلاح درست است.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: Rocky Linux 9؛ آزمایش Apache شب نوزدهم؛ audit و ابزارهای SELinux؛ حالت enforcing.

جایگاه در دوره: هدف‌های 333.2 آزمون 303-300.

رویداد را به زبان سؤال بخوان#

AVC مخفف Access Vector Cache است؛ رویدادهای deny آن برای تشخیص تصمیم SELinux مفیدند. در رکورد، source context، target context، class و permission را پیدا کن. آیا برنامه فایل را می‌خواند، به شبکه وصل می‌شود یا روی پورت تازه bind می‌کند؟ سه خواستهٔ متفاوت، سه اصلاح متفاوت دارند.

sudo ausearch -m AVC,USER_AVC -ts recent -i
sudo ausearch -m AVC -ts recent | audit2why
sudo semanage port -l
getsebool httpd_can_network_connect

audit2why دلیل احتمالی را توضیح می‌دهد؛ دانستن علت با اجازه دادن بی‌قیدوشرط فرق دارد. اگر ابزار نصب نیست، بستهٔ مرتبط را از مخزن توزیع نصب کن؛ متن لاگ را هم می‌توان بدون ابزار گرافیکی خواند.

پورت متفاوت، علت متفاوت#

در Clone، قبل از تغییر Apache به TCP/18080 بررسی کن این پورت در policy چه type دارد و آیا سرویس دیگری از آن استفاده می‌کند. اگر پورت قبلاً برای policy دیگری تعریف نشده، به‌صورت آزمایشگاهی:

sudo semanage port -a -t http_port_t -p tcp 18080

Apache باید Listen 18080 و VirtualHost متناظر داشته باشد. بعد از httpd -t و reload، با curl -H 'Host: library.example.test' http://127.0.0.1:18080/ رفتار را ببین. -a روی ورودی موجود خطا می‌دهد؛ از -m برای تغییر type سرویس دیگری بدون تحلیل استفاده نکن. در پایان، پورت و Listen افزوده‌شدهٔ همین آزمایش را حذف کن.

boolean را برای نیاز واقعی تغییر بده#

اگر reverse proxy واقعاً باید به backend وصل شود، یک boolean مرتبط ممکن است وجود داشته باشد. تغییر httpd_can_network_connect دامنهٔ ارتباط شبکهٔ httpd را گسترش می‌دهد؛ آن را صرفاً برای خواندن فایل فعال نکن. قبل و بعد را ثبت کن؛ گزینهٔ -P تغییر را پایدار می‌کند. مشکل label را با boolean نامرتبط حل نمی‌کنیم.

audit2allow می‌تواند از log پیشنهاد policy بسازد؛ اگر برنامه به‌دلیل خطای مسیر، کلیدهای خصوصی را می‌خواند، دادن همان مجوز اشتباه را دائمی می‌کند. ابتدا DAC، label، rule مسیر، نوع پورت و booleanهای موجود را بررسی کن. ماژول محلی باید بازبینی و محدود شود.

نقش‌ها و ابزارهای کمتر دیده‌شده#

RBAC یعنی کنترل دسترسی بر اساس نقش. SELinux user و Linux user یکی نیستند؛ نگاشت loginها را با semanage login -l ببین. newrole، runcon و setcon تنها در چارچوب policy و context مجاز عمل می‌کنند، نه راهی برای دور زدن آن. seinfo و ابزارهای SETools برای پرس‌وجوی policy، و ابزارهایی مانند apol برای تحلیل ساختار مفیدند؛ حضور ابزار گرافیکی در سرور headless فرض نمی‌شود. setfiles و fixfiles نیز ابزارهای relabel هستند و اثر گسترده‌شان باید پیش از اجرا مشخص باشد.

مأموریت امشب#

یک AVC واقعی آزمایشگاه را به چهار ستون «فرآیند، شیء، خواسته، اصلاح» تبدیل کن. اگر لاگ خالی است، احتمال DAC، درخواست به VirtualHost اشتباه یا نبودن رویداد را هم بررسی کن. «AVC ندیدم» به معنی «همهٔ کنترل‌ها مجازند» نیست.

مرجع: عیب‌یابی SELinux و SETools .