Профиль AppArmor для nginx
Экспериментальный профиль AppArmor для nginx в Ubuntu Linux
Данный профиль AppArmor предназначается тем, кто знает, что такое AppArmor и сознательно решил использовать профиль для nginx. Профиль не является законченным решением, работающим из коробки, а должен рассматриваться только как шаблон.
При построении профиля молчаливо предполагалось:
- рабочие процессы nginx выполняются от имени
www-data:www-data; - файлы конфигурации nginx находятся в
/etc/nginx(/etc/nginx/sites-enabled,/etc/nginx/sites-available,/etc/nginx/conf.d/*.conf,/etc/nginx/ssl); - пользовательские сайты расположены в
/home/<user>/htdocs; - логи записываются в
/var/log/nginx/*.log
Получился такой профиль AppArmor:
/usr/sbin/nginx {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/ssl_certs>
deny /root/** rw,
# Лучше бы это убрать
capability chown,
capability setgid,
capability setuid,
# Поддержка OpenSSL
/usr/lib/ssl/openssl.cnf r,
/etc/ssl/openssl.cnf r,
owner /etc/nginx/ssl/* r,
# Пользовательские файлы конфигурации nginx
owner /etc/nginx/conf.d/ r,
owner /etc/nginx/conf.d/*.conf r,
# Здесь должны быть перечислены все используемые файлы из /etc/nginx
owner /etc/nginx/fastcgi_params r,
owner /etc/nginx/mime.types r,
owner /etc/nginx/nginx.conf r,
# Конфиги виртуальных хостов
/etc/nginx/sites-available/* r,
owner /etc/nginx/sites-enabled/ r,
# Сайты пользователей
/home/*/htdocs/** r,
# Поддержка замены nginx на лету
/usr/sbin/nginx rix,
# Логи nginx
/var/log/nginx/*.log w,
# PID
owner /var/run/nginx.pid rw,
}
CAP_CHOWN (capability chown) — довольно опасная вещь: если злоумышленник может использовать chown(), то права доступа у файлам особой роли не играют. nginx пользуется CAP_CHOWN при получении сигнала SIGUSR1: файлы журналов переводятся под управление пользователя, от имени которого выполняются рабочие процессы nginx.
Чтобы избавиться от CAP_CHOWN, без танцев с бубном не обойтись. Для этого, как минимум, файлы журналов должны иметь права u+w,g+w и находиться под владением www-data:root (полагая, что рабочие процессы выполняются от имени www-data). Кроме того, все необходимые лог-файлы должны существовать до запуска nginx (в противном случае nginx их создаст с правами 0644, root:root, не сможет открыть созданные файлы — об этом далее — и не сможет выполнить chown() при получении SIGUSR1).
Очень важно, чтобы логи имели права на групповую запись: дело в том, что при правах 0644, www-data:root, мастер-процесс nginx, выполняющийся от имени root, не имеет прав на запись в лог (такой вот бесправный root). Неудобств можно избежать, если добавить в профиль capability dac_override, но у неё те же недостатки, что и у CAP_CHOWN.
Если есть желание обойтись без CAP_DAC_OVERRIDE или CAP_CHOWN, то нужно правильно настроить logrotate: в частности. в файле конфигурации logrotate должна быть строка
PS — при возникновении проблем с профилем aa-complain и aa-genprof — лучшие друзья
Ноя
2009
Комментарии к статье «Профиль AppArmor для nginx» (4) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Профиль AppArmor для nginx»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


Можно более подробно, как обойтись без CAP_DAC_OVERRIDE или CAP_CHOWN с примерами конфига nginx и logrotate?
/etc/logrotate.d/nginx.conf:weekly
missingok
rotate 52
compress
nodelaycompress
notifempty
create 660 www-data root
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
В конфиге nginx ничего не изменится, изменится только init-скрипт (который
/etc/init.d/nginx): перед запуском nginx нужно проверять наличие лог-файлов (всех!) и создавать их, если их нет:touch /var/log/nginx/access.log
# Остальные файлы, на которые есть ссылки в конфиге nginx
#...
chmod 0660 /var/log/nginx/*.log
chown www-data:root /var/log/nginx/*.log
# Здесь пойдет запуск nginx
Заготовки для php-fpm нету случайно?
Нет.
С ним труднее, так как PHP-файлы могут лежать где угодно. Ну и PHP-расширениями проблема
Вообще я делал профиль для php под заказ, но на него ушла уйма времени, и заточен он был под специфическую конфигурацию.