SELinux تنها نگهبان اجباری لینوکس نیست. امشب AppArmor را با یک برنامهٔ اختصاصی آزمایش می‌کنیم و نقش Smack و چارچوب LSM را می‌شناسیم؛ بدون آنکه محدودیت یک ابزار عمومی را روی تمام سیستم تحمیل کنیم.

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

محیط تمرین: Ubuntu 24.04؛ apparmor و apparmor-utils؛ VM Clone؛ sudo؛ تمرین عملی فراتر از سطح آگاهی آزمون است.

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

چارچوب و سیاست را جدا کن#

LSM یعنی Linux Security Modules؛ نقاط اتصال کنترل‌های امنیتی به کرنل. SELinux، AppArmor و Smack با مدل‌های متفاوت از آن استفاده می‌کنند. AppArmor بیشتر به profile برنامه و مسیرها تکیه می‌کند؛ Smack کنترل دسترسی مبتنی بر label ساده‌تر خود را دارد. فعال بودن یک LSM به معنی فعال بودن profile مناسب تمام برنامه‌ها نیست.

cat /sys/kernel/security/lsm
sudo aa-status

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

خوانندهٔ اختصاصی کتابخانه#

در Clone فقط یک کپی ویژهٔ آزمایشگاه را محدود می‌کنیم؛ روی /usr/bin/cat عمومی profile تازه نمی‌گذاریم.

sudo install -m 755 /usr/bin/cat /usr/local/bin/lpic303-reader
sudo install -d -m 755 /srv/lpic303-aa
printf 'public shelf\n' | sudo tee /srv/lpic303-aa/allowed.txt >/dev/null
printf 'private shelf\n' | sudo tee /srv/lpic303-aa/blocked.txt >/dev/null
sudo chmod 644 /srv/lpic303-aa/*.txt

فایل /etc/apparmor.d/lpic303-reader را بساز:

#include <tunables/global>
profile lpic303-reader /usr/local/bin/lpic303-reader {
    #include <abstractions/base>
    /usr/local/bin/lpic303-reader mr,
    /srv/lpic303-aa/allowed.txt r,
}

abstractions/base نیازهای پایهٔ runtime را پوشش می‌دهد؛ مجوز فایل هدف را صریح داده‌ایم. سپس:

sudo apparmor_parser -r /etc/apparmor.d/lpic303-reader
LC_ALL=C /usr/local/bin/lpic303-reader /srv/lpic303-aa/allowed.txt
LC_ALL=C /usr/local/bin/lpic303-reader /srv/lpic303-aa/blocked.txt
sudo journalctl -k --since '5 minutes ago'

فایل اول باید خوانده و فایل دوم باید منع شود، با اینکه DAC هر دو را خواندنی کرده است. LC_ALL=C نیاز به فایل‌های locale را کاهش می‌دهد. اگر برنامه پیش از خواندن هدف منع شد، denial وابستگی‌ها را بخوان؛ مجوز تمام / را اضافه نکن.

حالت یادگیری و حالت اعمال#

Complain برای مشاهدهٔ نیازهای profile کاربرد دارد؛ enforce منع را اجرا می‌کند. افزودن هر مورد ثبت‌شده به policy بدون بررسی، می‌تواند رفتار اشتباه برنامه را مشروع کند؛ همان دام audit2allow اینجا هم وجود دارد. در Smack نیز نام label و قواعد بین labelها مهم‌اند؛ اجرای همان profile AppArmor روی Smack معنی ندارد.

پایان تمرین: sudo apparmor_parser -R /etc/apparmor.d/lpic303-reader فقط profile خودمان را unload می‌کند. سرویس AppArmor کل سیستم را خاموش نکن.

پرسش: اگر مسیر یک فایل مجاز عوض شود، انتظار یکسانی از AppArmor و SELinux داریم؟ پاسخ را با تفاوت تصمیم مبتنی بر مسیر و label توضیح بده. منابع: AppArmor در Ubuntu و Smack در مستندات کرنل .