0887 371 498 support@itservice-bg.net
10.10.2021 · Самуил Арсов · Linux commands, Ubuntu

AppArmor на Ubuntu Server: кога пречи и как се маха

AppArmor е разширение за сигурност на Linux (подобно на SELinux), което ограничава достъпа на програмите до системни ресурси, файлове и мрежови възможности чрез профили. Целта е да се намали щетата при компрометирано приложение — дори превзет процес да получи контрол, той може да пипа само това, което профилът му разрешава.

Когато обаче става въпрос за сървъри, тази логика понякога се обръща срещу нас. Според моя опит AppArmor на Ubuntu Server причинява повече проблеми, отколкото ползи. Няма да забравя случая, когато дълго не разбирах защо DNS не работи добре. Оказа се, че AppArmor е ограничил услугата, която работеше с хаотични прекъсвания, в които нямаше никаква логика. Затова на всяка нова инсталация на Ubuntu Server го деактивирам.

Проверка на статуса

sudo apparmor_status

Изходът показва колко профила са заредени и в какъв режим са. Двата режима са:

  • enforce — забраненото се блокира наистина
  • complain — нищо не се блокира, но всяко нарушение се записва в лога

Как се разбира, че AppArmor е виновникът

Това е най-полезното нещо в цялата статия. Симптомът е услуга, която се държи необяснимо — не може да пише във файл, не отваря сокет, работи с прекъсвания без логика в тях. Проверката е бърза:

sudo dmesg | grep -i apparmor
sudo journalctl -k | grep -i 'apparmor.*DENIED'
sudo grep DENIED /var/log/syslog

Редовете с DENIED казват точно кой профил е спрял коя операция върху кой път. Ако там пише името на услугата, която ви създава проблеми, търсенето свърши.

Кое се прави преди пълното деактивиране

Ако не искате да махате защитата от цялата машина заради една услуга, конкретният профил може да мине в complain — тогава той не пречи, но продължава да записва какво би блокирал:

sudo apt install apparmor-utils
sudo aa-complain /etc/apparmor.d/usr.sbin.named
sudo aa-status

Обратно в enforce:

sudo aa-enforce /etc/apparmor.d/usr.sbin.named

Единичен профил може и напълно да се изключи, без да се пипат останалите:

sudo ln -s /etc/apparmor.d/usr.sbin.named /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.named

Деактивиране на AppArmor

На съвременни Ubuntu Server системи (с systemd):

sudo systemctl stop apparmor
sudo systemctl disable apparmor

За пълно премахване на пакета:

sudo apt-get remove apparmor apparmor-utils

На по-стари Ubuntu версии (преди systemd) се използваха sudo service apparmor stop и sudo update-rc.d -f apparmor remove.

Активиране отново

sudo apt-get install apparmor apparmor-utils
sudo systemctl enable apparmor
sudo systemctl start apparmor

Заключение

AppArmor е полезен инструмент в десктоп и контейнеризирани среди, но на production Ubuntu сървъри може да причини трудно диагностицируеми проблеми с услуги като Bind9, пощенски и уеб сървъри. Ако забележите необяснимо поведение на услуга, погледнете за DENIED в лога, преди да търсите другаде — може да е именно той.

Едно уточнение за пълнота: на машина, изложена директно към интернет и с чужд код върху нея (споделен хостинг, чужди приложения), премахването на AppArmor сваля един защитен слой. Там по-разумният ход е complain за проблемния профил, не изключване на всичко.