При администрировании сервера необходимо постоянно отслеживать появление новых уязвимостей.
К сожалению, даже самые актуальные патчи безопасности для приложений и операционной системы не могут обеспечить стопроцентной защиты, и сервер может быть подвержен атакам нулевого дня.
Примечание: 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.
Требования
- Сервер Ubuntu 14.04.
- Пользователь с доступом к sudo
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 очень важны в производственных системах, поскольку блокируют доступ к уязвимым точкам сервера.