AppArmor یک سیستم امنیتی مبتنی بر کنترل دسترسی اجباری (Mandatory Access Control – MAC) برای لینوکس است که با هدف محدود کردن دسترسی برنامهها به منابع سیستم طراحی شده است. AppArmor به کمک پروفایلهای امنیتی مشخص میکند که هر برنامه چه فایلها، دایرکتوریها و قابلیتهایی را میتواند باز کند یا اجرا کند.
در این مطلب، به AppArmor، یک مفهوم کلیدی امنیت لینوکس، خواهیم پرداخت. AppArmor به طور گسترده در کانتینرها و Kubernetes استفاده میشود. همچنین یک موضوع مهم برای گواهینامه CKS است. ما آن را با یک مثال عملی تجزیه و تحلیل خواهیم کرد تا به شما در درک نحوه عملکرد آن کمک کنیم.
AppArmor چیست؟
AppArmor (Application Armor) یک ویژگی امنیتی است که در برخی از سیستمهای لینوکس تعبیه شده است و کنترل میکند که برنامهها چه کاری را میتوانند و چه کاری را نمیتوانند انجام دهند.
اگر یک برنامه دارای نقص امنیتی باشد یا توسط بدافزار به خطر بیفتد، AppArmor آسیبی را که میتواند وارد کند محدود میکند.
به عنوان مثال، حتی اگر یک هکر از یک آسیبپذیری در یک وب سرور سوءاستفاده کند، AppArmor میتواند از دسترسی آن به فایلهای حساس سیستم یا اجرای دستورات مضر جلوگیری کند.
مثال مورد استفاده
فرض کنید شما یک وب سرور آپاچی را اجرا میکنید.
بدون AppArmor، اگر آپاچی در معرض خطر قرار گیرد، میتواند هر فایلی را روی سیستم بخواند یا اسکریپتهای تصادفی را اجرا کند که یک خطر امنیتی جدی محسوب میشود.
با یک پروفایل AppArmor، میتوانید دسترسی آپاچی را با موارد زیر محدود کنید:
- اجازه دادن به آن برای خواندن فقط فایلهای /var/www/html (جایی که فایلهای وبسایت ذخیره میشوند).
- اجازه دادن به آن برای نوشتن لاگ فقط در /var/log/apache2.
- محدود کردن آن برای گوش دادن فقط به پورت ۸۰.
در عین حال، نمیتواند به فایلهای کاربر در /home/ دسترسی داشته باشد یا دستورات غیرمجاز را اجرا کند.
ممکن است بپرسیدآیا نمیتوانم این کار را با استفاده از مجوزهای فایل (file permissions) انجام دهم؟ اینجا جایی است که تفاوت وجود دارد.
مجوزهای فایل، دسترسی را بر اساس شناسههای کاربر و گروه کنترل میکنند. اگر کاربری در معرض خطر قرار گیرد، مهاجم میتواند به طور بالقوه به تمام فایلهای متعلق به کاربر دسترسی پیدا کند.
در حالی که AppArmor دسترسی را بر اساس آنچه خود برنامه مجاز به انجام آن است، صرف نظر از اینکه کدام کاربر آن را اجرا میکند، کنترل میکند.
بنابراین حتی اگر آپاچی به خطر بیفتد، هنوز نمیتواند به چیزی خارج از مسیرهای مجاز دسترسی داشته باشد.
کنترل دسترسی اجباری (Mandatory Access Control)
AppArmor زیرمجموعه کنترل دسترسی اجباری (MAC) قرار میگیرد.
کنترل دسترسی اجباری (Mandatory Access Control) یک مدل امنیتی است که در آن دسترسی به منابع (فایلها، دایرکتوریها، پورتهای شبکه و غیره) به شدت توسط یک سیاست مرکزی کنترل میشود.
برخلاف کنترل دسترسی اختیاری (DAC)، که در آن صاحب یک منبع (مثلا یک فایل) میتواند مجوزها (خواندن، نوشتن، اجرا) را تعیین کند، سیاستهای MAC در سراسر سیستم اعمال میشوند و نمیتوانند توسط کاربران یا برنامهها لغو شوند، حتی اگر امتیازات بالایی مانند root داشته باشند.
به عنوان مثال، حتی اگر یک برنامه با امتیازات root اجرا شود، AppArmor میتواند آن را از تغییر /etc/passwd مسدود کند. اگر یک مهاجم برنامه را به خطر بیندازد، همچنان توسط AppArmor محدود میشود.
خرید VPS لینوکس با دسترسی کامل SSH و منابع اختصاصی، مناسب برای برنامهنویسان، توسعهدهندگان و مدیران سایت در پارسدو فراهم است.
AppArmor چگونه کار میکند؟
AppArmor بر اساس پروفایلها، مشابه seccomp، کار میکند.
هر پروفایل یک فایل متنی ساده است که تعریف میکند یک برنامه مجاز به انجام چه کاری است.
در سیستمهای لینوکس، میتوانید پروفایلهای AppArmor موجود را در /etc/apparmor.d/ پیدا کنید.
برای مثال،
$ ls -p /etc/apparmor.d/ | grep -v / lsb_release nvidia_modprobe sbin.dhclient usr.bin.man usr.bin.tcpdump usr.lib.snapd.snap-confine.real usr.sbin.rsyslogd
مثال عملی AppArmor
بیایید یک پروفایل AppArmor را با یک مثال عملی درک کنیم.
ما یک اسکریپت Bash ساده ایجاد خواهیم کرد که سعی میکند /etc/shadow (فایلی که حاوی رمزهای عبور هش شده است و باید محافظت شود) را بخواند.
ایده این است که اسکریپت را از خواندن /etc/shadow، حتی هنگام اجرا به عنوان کاربر root، مسدود کنیم.
بیایید اسکریپت را ایجاد کنیم.
$ echo -e '#!/bin/bash\ncat /etc/shadow' > script.sh $ chmod +x script.sh
اگر اسکریپت را به عنوان root اجرا کنید، هیچ خطایی دریافت نخواهید کرد. محتوای /etc/shadow را نمایش میدهد.
$ root@ubuntu:~# ./script.sh root:*:19579:0:99999:7::: daemon:*:19579:0:99999:7::: . . .
حالا، بیایید یک پروفایل AppArmor ایجاد کنیم که مانع از خواندن /etc/shadow توسط اسکریپت شود.
ما این پروفایل را در /etc/apparmor.d/root.script.sh تعریف خواهیم کرد.
#include <tunables/global> profile /root/script.sh { # Allow reading its own file /root/script.sh r, # Deny access to /etc/shadow deny /etc/shadow r, # Allow execution of Bash /bin/bash rmix, # Allow execution of 'cat' or any other needed commands /usr/bin/cat rmix, }
بیایید پروفایل را بارگذاری کنیم.
sudo apparmor_parser -r /etc/apparmor.d/root.script.sh
وضعیت را بررسی کنید.
$ root@ubuntu:~# sudo apparmor_status | grep script.sh /root/script.sh
اکنون باید مسیر صحیح (/root/script.sh) را نشان دهد.
حالا بیایید اسکریپت را اجرا کنیم و ببینیم چه اتفاقی میافتد. هنگام تلاش برای دسترسی به /etc/shadow، حتی به عنوان root، باید خطای عدم اجازه دسترسی دریافت کنید.
$ root@ubuntu:~# ./script.sh ./script.sh: line 2: /usr/bin/cat: Permission denied
همانطور که میبینید، AppArmor برنامهها را بر اساس پروفایلها محدود میکند، حتی اگر آنها را به عنوان root اجرا کنید.
چرا AppArmor Root را محدود میکند؟
Root دسترسی کامل به سیستم دارد، اما AppArmor کنترل میکند که یک برنامه (حتی برنامهای که توسط root اجرا میشود) چه کاری میتواند انجام دهد.
این امر از حملات privilege escalationجلوگیری میکند (به عنوان مثال، یک اسکریپت root آسیبدیده نمیتواند به فایلهای حساس مانند /etc/shadow دسترسی پیدا کند). این حداقل امتیاز را اعمال میکند و فقط مجوزهای لازم را مجاز میداند.
AppArmor در کانتینرها
AppArmor در ران تایمهای کانتینر ادغام شده است تا کنترل دسترسی اجباری (MAC) را بر روی فرآیندهای کانتینر اعمال کند.
زمان اجرا این پروفایلها را هنگام شروع یک کانتینر بارگذاری میکند و تضمین میکند که هر کانتینر در یک sandbox کار میکند.
به عنوان مثال، Docker با یک پروفایل پیشفرض به نام docker-default ارائه میشود. این پروفایل برای هر کانتینر اعمال میشود مگر اینکه لغو شود. میتوانید پروفایل را اینجا بررسی کنید.
این برنامه به گونهای طراحی شده است که
- اجازه عملیات اولیه (مثلا خواندن/نوشتن در سیستم فایل کانتینر) را میدهد.
- اقدامات خطرناک (مثلا نصب /proc یا دسترسی به /etc/passwd روی میزبان) را مسدود میکند.
در این بخش یک مثال ساده وجود دارد که نشان میدهد پروفایل پیشفرض AppArmor در docker، خواندن /proc/sysrq-trigger را با استفاده از cat مسدود میکند.
نتیجهگیری
AppArmor با محدود کردن اقدامات برنامه، جلوگیری از سوءاستفادهها و تضمین حداقل امتیاز، امنیت لینوکس را بهبود میبخشد. دانستن این موضوع برای مدیران سیستم و علاقهمندان به CKS ضروری است!