Профиль AppArmor для nginx

Экспериментальный профиль AppArmor для nginx в Ubuntu Linux

Данный профиль предназначается тем, кто знает, что такое и сознательно решил использовать профиль для . Профиль не является законченным решением, работающим из коробки, а должен рассматриваться только как шаблон.

При построении профиля молчаливо предполагалось:

  • рабочие процессы 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:

[-]
View Code (Unknown Language)
#include <tunables/global>

/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 должна быть строка

[-]
View Code Text
create 660 www-data root

PS — при возникновении проблем с профилем aa-complain и aa-genprof — лучшие друзья :-)

Автор: ; опубликовано в: Linux, nginx, Администрирование; метки: AppArmor, nginx, безопасность
21
Ноя
2009

RSS Комментарии к статье «Профиль AppArmor для nginx» (4)  »

  1. ArtRay

    Можно более подробно, как обойтись без CAP_DAC_OVERRIDE или CAP_CHOWN с примерами конфига nginx и logrotate?

    • /etc/logrotate.d/nginx.conf:

      [-]
      View Code Text
      /var/log/nginx/*.log {
          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 нужно проверять наличие лог-файлов (всех!) и создавать их, если их нет:

      [-]
      View Code Bash
          touch /var/log/nginx/error.log
          touch /var/log/nginx/access.log
      # Остальные файлы, на которые есть ссылки в конфиге nginx
      #...
          chmod 0660 /var/log/nginx/*.log
          chown www-data:root /var/log/nginx/*.log
      # Здесь пойдет запуск nginx
  2. ArtRay

    Заготовки для php-fpm нету случайно? :)

    • Нет.

      С ним труднее, так как PHP-файлы могут лежать где угодно. Ну и PHP-расширениями проблема :-)

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

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Профиль AppArmor для nginx»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा