Создание профиля AppArmor для Nginx в Ubuntu 14.04

При администрировании сервера необходимо постоянно отслеживать появление новых уязвимостей.

К сожалению, даже самые актуальные патчи безопасности для приложений и операционной системы не могут обеспечить стопроцентной защиты, и сервер может быть подвержен атакам нулевого дня.

Примечание: 0day, или атаки нулевого дня – это неизвестные уязвимости и вредоносные программы, от которых ещё нет защитных механизмов.

AppArmor – это базовый модуль Linux, используемый в качестве системы контроля доступа, которая защищает сервер от подобных атак. Этот модуль по умолчанию доступен в системах Ubuntu с момента выхода Ubuntu 8.04.

Когда AppArmor включен для какого-либо приложения, операционная система открывает ему доступ к только к тем файлы и папки, которые указаны в его профиле безопасности. Таким образом, хорошо продуманный профиль безопасности может предотвратить атаку или минимизировать её ущерб.

Данное руководство поможет создать простой профиль AppArmor для веб-сервера Nginx.

Для демонстрации примеров Nginx будет обслуживать статические файлы из каталогов /data/www/safe и /data/www/unsafe. AppArmor настроит Nginx для обслуживания только /data/www/safe.

Таким образом, когда AppArmor отключен, внешний пользователь сможет получить доступ к файлам из обоих каталогов. С включенным модулем AppArmor будет доступен только контент каталога /data/www/safe.

Требования

1: Установка Nginx

Установить Nginx можно при помощи стандартного пакетного менеджера apt-get.

sudo apt-get update
sudo apt-get install nginx

По умолчанию сервер Nginx прослушивает порт 80. Чтобы убедиться в этом, откройте в браузере домен или IP сервера и укажите порт:

http://<домен-или-IP>:80

На экране появится приветственная страница Nginx:

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. …

2: Настройка Nginx для обслуживания статических файлов

Создайте следующие каталоги статических файлов:

sudo mkdir -p /data/www/safe
sudo mkdir -p /data/www/unsafe

Добавьте файл в каталог safe:

sudo nano /data/www/safe/index.html

Поместите в него такой код:

<html>
<b>Hello! Accessing this file is allowed.</b>
</html>

Затем добавьте в каталог /data/www/unsafe файл по имени index.html и поместите в него такой код:

<html>
<b>Hello! Accessing this file is NOT allowed.</b>
</html>

Конфигурационный файл Nginx находится в /etc/nginx/nginx.conf. Отредактируйте этот файл, настройте прослушивание пота 8080 и поддержку каталога /data/www.

Закомментируйте строку:

include /etc/nginx/sites-enabled/*;

добавив диез в начале. Кроме того, нужно добавить целый блок server. После редактирования файл должен выглядеть так, как показано ниже (комментарии в файле опущены для удобства).

user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
server {
listen 8080;
location / {
root /data/www;
}
}
}

Сохраните и закройте файл. Перезапустите Nginx, чтоб обновить настройки:

sudo nginx -s reload

На данный момент Nginx может обслуживать файлы http://<домен-или-IP>:8080/safe/index.html и http://<домен-или-IP>:8080/unsafe/index.html, поскольку модуль AppArmor еще не включен.

Страница из каталога safe выглядит так:

Hello! Accessing this file is allowed.

3: Проверка профилей AppArmor

Ubuntu 14.04 поставляется с предварительно загруженными профилями AppArmor. Установить большую их часть можно при помощи команды:

sudo apt-get install apparmor-profiles

Чтобы просмотреть список доступных профилей, используйте команду:

sudo apparmor_status

Список содержит довольно много профилей. Некоторые из них будут в активны (enforce mode), а некоторые в режиме complain (это значит, что AppArmor будет регистрировать активность такого приложения, не ограничивая его в доступе).

Лог-файлы будут храниться в каталоге /var/log/nginx.

AppArmor ограничивает доступ только тех приложений, чей профиль находится в режиме enforce.

Также вы заметите, что в списке нет профиля для Nginx. Его нужно создать самостоятельно.

4: Создание профиля AppArmor для Nginx

Установите apparmor-utils – набор утилит для управления AppArmor.

sudo apt-get install apparmor-utils

Команда aa-autodep создаст пустой профиль в каталоге /etc/apparmor.d.

cd /etc/apparmor.d/
sudo aa-autodep nginx

Затем используйте следующую команду, чтобы включить режим complain.

sudo aa-complain nginx

Перезапустите Nginx.

sudo service nginx restart

Откройте в браузере:

http://<IP-адрес>:8080/safe/index.html.

После этого в логе Nginx появятся записи о посещении данного сайта.

Вернитесь в терминал. Используйте утилиту AppArmor, чтобы просмотреть логи Nginx и одобрить или отклонить перечисленные там действия.

sudo aa-logprof

Эта команда сканирует лог-файлы и обновляет профиль Nginx. AppArmor несколько раз предложит разрешить или отклонить функцию. Если на данный момент сервер не подвержен атаке, можно просто нажать А на все запросы программы (поскольку все предложенные функции важны для работы Nginx). Чтобы сохранить изменения, нажмите S.

Итак, чтобы включить AppArmor для нового приложения:

  • Создайте пустой профиль приложения.
  • Откройте приложение и выполните несколько обычных действий, чтобы в логах появились записи.
  • Запустите утилиту AppArmor, которая проверит логи и одобрит (или отклонит) перечисленные в них действия приложения.

5: Редактирование профиля AppArmor для Nginx

Профиль для Nginx был сгенерирован автоматически, потом он требует дополнительного редактирования. Откройте файл /etc/apparmor.d/usr.sbin.nginx:

sudo nano /etc/apparmor.d/usr.sbin.nginx

Изменения, которые нужно внести:

  • Добавьте строку (обязательно со знаком диеза):

#include <abstractions/apache2-common

  • Добавьте строки capability setgid и capability setuid.
  • В строке /data/www/safe/ задайте весь каталог (при помощи символа *).
  • Добавьте строку (обязательно с запятой в конце):

deny /data/www/unsafe/* r,

  • Чтобы Nginx получил право на запись в логе ошибок, установите w в строке /var/log/nginx/error.log.

Строка apache2-common позволяет Nginx слушать разные порты. Строки capability позволяют запускать новые процессы. Правило deny блокирует доступ к каталогу /data/www/unsafe/.

В результате профиль будет выглядеть так:

#include <tunables/global>
/usr/sbin/nginx {
#include <abstractions/apache2-common>
#include <abstractions/base>
#include <abstractions/nis>
capability dac_override,
capability dac_read_search,
capability net_bind_service,
capability setgid,
capability setuid,
/data/www/safe/* r,
deny /data/www/unsafe/* r,
/etc/group r,
/etc/nginx/conf.d/ r,
/etc/nginx/mime.types r,
/etc/nginx/nginx.conf r,
/etc/nsswitch.conf r,
/etc/passwd r,
/etc/ssl/openssl.cnf r,
/run/nginx.pid rw,
/usr/sbin/nginx mr,
/var/log/nginx/access.log w,
/var/log/nginx/error.log w,
}

Ваш профиль может выглядеть немного иначе, так как он создаётся на основе лог-файла. Вы можете самостоятельно изучить параметры и обновить индивидуальные настройки профиля, а можете просто скопировать этот файл, подогнав его под свою серверную среду. Настройки AppArmor могут случайно заблокировать доступ к безопасным каталогам, потому будьте готовы к устранению неполадок.

Чтобы включить профиль AppArmor для Nginx, используйте:

sudo aa-enforce nginx

Рекомендуется перезапустить все профили и Nginx, чтобы обновит настройки.

sudo /etc/init.d/apparmor reload
sudo service nginx restart

В случае возникновения ошибки на любом этапе настройки проверьте конфигурационный файл и /var/log/syslog.

Проверьте состояние AppArmor:

sudo apparmor_status

Процесс Nginx должен быть в исполнении.

Снова откройте браузер и посетите страницу:

http://<server-IP>:8080/safe/index.html

На экране должна появиться страница из каталога safe. Затем посетите:

http://<server-IP>:8080/unsafe/index.html

Сервер должен вернуть ошибку 403 Forbidden.

Устранение неполадок

Если сервер Nginx не запускается после включения профиля, то, скорее всего, у него недостаточно прав. Обратите внимание на:

  • Текст ошибки.
  • var/log/syslog
  • /var/log/nginx/error.log

Отредактируйте профиль, чтобы устранить ошибку.

К примеру, если в файл профиля не добавить строку abstractions/apache2-common, возникнет ошибка:

[emerg] 3611#0: socket() 0.0.0.0:8080 failed (13: Permission denied)

Настройка профиля AppArmor требует внимания.

Заключение

Профили AppArmor очень важны в производственных системах, поскольку блокируют доступ к уязвимым точкам сервера.

Tags: , ,

Добавить комментарий