Безопасность и оптимизация Linux.Редакция для Red Hat

Запуск Apache в chroot окружении


Эта часть фокусируется на предотвращении использования Apache как точку взлома системы. Apache по умолчанию запускается как не root пользователь, ограничивая тем самым любые разрушения, действиями, котрые может выполнить обычный пользователь с локальным shell. Конечно, в большинстве случаев такой защиты достаточно, но можно сделать еще один дополнительный шаг – запуск Apache в chroot окружении.

Основная выгода от использования chroot - это ограничение части файловой системы, которую демон может видеть как корневой каталог. Дополнительно, так как эта часть файловой системы нужна только для поддержки Apache, то количество программ доступное на ней чрезвычайно ограничено. Наиболее важно то, что здесь не нужно иметь setuid-root программ, которые можно использовать для получения root доступа и взлома chroot ограничений.

Chrooting apache – это не простая задача. Перед ее решением мы рассмотрим некоторые “за” и “против”, чтобы вы решили нужно ли вам это.

За:

    Если apache будет взломан, то атакующий не получит доступ к элементам файловой системы.

    Плохо написанные CGI скрипты, которые могут позволить кому-нибудь получить доступ к вашему серверу не будут работать.

    Против:

      Существуют дополнительные библиотеки, которые вы должны иметь в chroot окружении, чтобы Apache работал корректно.

      Если вы используете любые Perl/CGI возможности в Apache, вам нужно будетскопировать необходимые двоичные файлы, Perl библиотеки и файлы в предназначенное место chroot пространства. Тоже самое относится и к SSL, PHP, LDAP, PostgresSQL и другим программам третьих лиц.

      chroot конфигурация приведенная ниже полагает, что вы компилировали ваш сервер Apache со внешней программой mod_ssl. Различия в том, что вы компилировали с вашим веб сервером Apache постоянно находится в библиотеках и двоичных файлах, которые вы должны копировать в chroot каталог.

      Помните, что если вы компилировали Apache с поддержкой mod_perl, вы должны скопировать все связанные двоичные файлы и Perl библиотеки в chroot каталог. Perl находится в “/usr/lib/perl5” и в случае использования возможностей Perl, копируйте каталог Perl в “/chroot/httpd/usr/lib/perl5/”. Не забудьте перед копированием создать каталог “/chroot/httpd/usr/lib/perl5” в вашей chroot структуре.

      Ниже приводятся все необходимые шаги для запуска веб сервера Apache в chroot окружении:
      Шаг 1


      Мы должны определить разделяемые библиотеки от которых зависит httpd. Их надо будет позже скопировать в chroot каталог.
      Для поиска разделяемых библиотек от которых зависит httpd выполните следующую команду:
      [root@deep /]# ldd /usr/sbin/httpd

      libpam.so.0 => /lib/libpam.so.0 (0x40016000)

      libm.so.6 => /lib/libm.so.6 (0x4001f000)

      libdl.so.2 => /lib/libdl.so.2 (0x4003b000)

      libcrypt.so.1 => /lib/libcrypt.so.1 (0x4003e000)

      libnsl.so.1 => /lib/libnsl.so.1 (0x4006b000)

      libresolv.so.2 => /lib/libresolv.so.2 (0x40081000)

      libdb.so.3 => /lib/libdb.so.3 (0x40090000)

      libc.so.6 => /lib/libc.so.6 (0x400cb000)

      /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

      Сделайте заметки об этих файлах; они потребуются нам позже.
      Шаг 2

      Создайте новый UID и GID, если этой же не сделано, необходимые для запуска Apache httpd. Это важно, потому что запуск из под root ликвидирует преимущества chroot окружения, а использование UID, которые уже существуют на системе (например, nobody) может дать доступ сервису к другим ресурсам. Представьте себе, что веб сервер запущен из под пользователя nobody, или любого другого используемого UID/GID и был взломан. Взломщик получит доступ из chroot к любым другим процессам запущенным как. Здесь приведены типичные UID и GID. Проверьте файлы “/etc/passwd” и “/etc/group” файлы на наличие свободных UID/GID. В нашей конфигурации мы используем значение “80” и UID/GID “www”.
      [root@deep /]# useradd -c “Apache Server” -u 80 -s /bin/false -r -d /home/httpd www 2>/dev/null :



      Вышеприведенная команда создаст группу “www” с числовым GID равном 80, и пользователя “www” с числовым номером UID равном 80.
      Шаг 3

      Установим chroot окружение. Первое, мы должны создать chroot структуру для Apache. Мы используем “/chroot/httpd” как chroot каталог для Apache. “/chroot/httpd” – это только каталог на отдельном разделе, где мы решили разместить apache для большей безопасности.
      [root@deep /]# /etc/rc.d/init.d/httpd stop (только если Apache уже инсталлирован и запущен на вашей системе). Shutting down http: [ OK ]



      [root@deep /]# mkdir /chroot/httpd

      Далее мы создаем остальные каталоги:
      [root@deep /]# mkdir /chroot/httpd/dev

      [root@deep /]# mkdir /chroot/httpd/lib

      [root@deep /]# mkdir /chroot/httpd/etc

      [root@deep /]# mkdir -p /chroot/httpd/usr/sbin

      [root@deep /]# mkdir -p /chroot/httpd/var/run

      [root@deep /]# mkdir -p /chroot/httpd/var/log/httpd

      [root@deep /]# chmod 750 /chroot/httpd/var/log/httpd/

      [root@deep /]# mkdir -p /chroot/httpd/home/httpd

      Копируйте основной конфигурационный каталог, конфигурационные файлы, каталог cgi-bin, root каталог и программу httpd в chroot окружение:
      [root@deep /]# cp -r /etc/httpd /chroot/httpd/etc/

      [root@deep /]# cp -r /home/httpd/cgi-bin /chroot/httpd/home/httpd/

      [root@deep /]# cp -r /home/httpd/your-DocumentRoot /chroot/httpd/home/httpd/

      [root@deep /]# mknod /chroot/httpd/dev/null c 1 3

      [root@deep /]# chmod 666 /chroot/httpd/dev/null

      [root@deep /]# cp /usr/sbin/httpd /chroot/httpd/usr/sbin/

      Нам нужны каталоги “/chroot/httpd/etc”, “/chroot/httpd/dev”, “/chroot/httpd/lib”, “/chroot/httpd/usr/sbin”, “/chroot/httpd/var/run”, “/chroot/httpd/home/httpd” и “/chroot/httpd/var/log/httpd”, потому что “/” считается от точки chroot.
      Шаг 4

      Если вы скомпилировали Apache с поддержкой SSL, вы должны скопировать элементы каталога “/etc/ssl”, который содержит все приватные и публичные ключи в chroot окружение.
      [root@deep /]# cp -r /etc/ssl /chroot/httpd/etc/

      (требуется только если включена поддержка mod_ssl).
      [root@deep /]# chmod 600 /chroot/httpd/etc/ssl/certs/ca.crt

      (требуется только если включена поддержка mod_ssl).
      [root@deep /]# chmod 600 /chroot/httpd//etc/ssl/certs/server.crt

      (требуется только если включена поддержка mod_ssl).
      [root@deep /]# chmod 600 /chroot/httpd/etc/ssl/private/ca.key

      (требуется только если включена поддержка mod_ssl).
      [root@deep /]# chmod 600 /chroot/httpd/etc/ssl/private/server.key

      (требуется только если включена поддержка mod_ssl).

      Шаг 5

      Так как мы компилировали apache с использованием разделяемых библиотек, нам нужно инсталлировать их в структуру chroot каталога. Используйте ldd /chroot/httpd/usr/sbin/httpd для поиска требуемых библиотек. Вывод этой команды будет выглядеть примерно так:
      libpam.so.0 => /lib/libpam.so.0 (0x40016000)




      libm.so.6 => /lib/libm.so.6 (0x4001f000)

      libdl.so.2 => /lib/libdl.so.2 (0x4003b000)

      libcrypt.so.1 => /lib/libcrypt.so.1 (0x4003e000)

      libnsl.so.1 => /lib/libnsl.so.1 (0x4006b000)

      libresolv.so.2 => /lib/libresolv.so.2 (0x40081000)

      libdb.so.3 => /lib/libdb.so.3 (0x40090000)

      libc.so.6 => /lib/libc.so.6 (0x400cb000)

      /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

      Копируйте разделяемые библиотеки определенные выше:
      [root@deep /]# cp /lib/libpam.so.0 /chroot/httpd/lib/

      [root@deep /]# cp /lib/libm.so.6 /chroot/httpd/lib/

      [root@deep /]# cp /lib/libdl.so.2 /chroot/httpd/lib/

      [root@deep /]# cp /lib/libcrypt.so.1 /chroot/httpd/lib/

      [root@deep /]# cp /lib/libnsl* /chroot/httpd/lib/

      [root@deep /]# cp /lib/libresolv* /chroot/httpd/lib/

      [root@deep /]# cp /lib/libdb.so.3 /chroot/httpd/lib/

      [root@deep /]# cp /lib/libc.so.6 /chroot/httpd/lib/

      [root@deep /]# cp /lib/ld-linux.so.2 /chroot/httpd/lib/

      Вам также нужны следующие дополнительные библиотеки для некоторых сетевых функций, подобных резолвингу:
      [root@deep /]# cp /lib/libnss_compat* /chroot/httpd/lib/

      [root@deep /]# cp /lib/libnss_dns* /chroot/httpd/lib/

      [root@deep /]# cp /lib/libnss_files* /chroot/httpd/lib/

      Шаг 6

      Мы должны скопировать passwd и group файлы в “/chroot/httpd/etc”. Концепция их использования такая же как и в ftpd. Затем, мы удаляем все элементы из этих файлов, за исключением пользователя и группы под которыми запускается apache.
      [root@deep /]# cp /etc/passwd /chroot/httpd/etc/

      [root@deep /]# cp /etc/group /chroot/httpd/etc/

      Редактируйте файл passwd (vi /chroot/httpd/etc/passwd) и удалите все элементы, кроме пользователя под которым мы запускаем apache (в нашем случае это “www”):
      www:x:80:80::/home/www:/bin/bash

      Редактируйте файл group (vi /chroot/httpd/etc/group) и удалите все элементы, кроме группы под которой запускается apache (в нашем случае это “www”):
      www:x:80:

      Шаг 7

      Вам потребуются файлы “/etc/resolv.conf”, “/etc/nsswitch.conf” и “/etc/hosts” в вашем chroot окружении.
      [root@deep /]# cp /etc/resolv.conf /chroot/httpd/etc/




      [root@deep /]# cp /etc/hosts /chroot/httpd/etc/

      [root@deep /]# cp /etc/nsswitch.conf /chroot/httpd/etc/

      Шаг 8

      Сейчас на некоторые файлы в chroot окружении мы установим бит “постоянства” для лучшей безопасности.
      Установите бит “постоянства” на файл “passwd”:
      [root@deep /]# cd /chroot/httpd/etc/

      [root@deep /]# chattr +i passwd

      Установите бит “постоянства” на файл “group”:
      [root@deep /]# cd /chroot/httpd/etc/

      [root@deep /]# chattr +i group

      Установите бит “постоянства” на файл “httpd.conf”:
      [root@deep /]# cd /chroot/httpd/etc/httpd/conf/

      [root@deep /]# chattr +i httpd.conf

      Установите бит “постоянства” на файл “resolv.conf”:
      [root@deep /]# cd /chroot/httpd/etc/

      [root@deep /]# chattr +i resolv.conf

      Установите бит “постоянства” на файл “hosts”:
      [root@deep /]# cd /chroot/httpd/etc/

      [root@deep /]# chattr +i hosts

      Установите бит “постоянства” на файл “nsswitch.conf”:
      [root@deep /]# cd /chroot/httpd/etc/

      [root@deep /]# chattr +i nsswitch.conf

      Шаг 9

      Копируйте файл “localtime” в chroot так, чтобы регистрационные входы были правильно откорректированы для вашей локальной timezone:
      [root@deep /]# cp /etc/localtime /chroot/httpd/etc/

      Шаг 10

      Удалите не нужные Apache файлы и каталоги:
      [root@deep /]# rm -rf /var/log/httpd/

      [root@deep /]# rm -rf /etc/httpd/

      [root@deep /]# rm -rf /home/httpd/

      [root@deep /]# rm -f /usr/sbin/httpd

      Мы можем спокойно удалить все вышеназванные файлы и каталоги , так как они сейчас находятся в нашем chroot каталоге.
      Шаг 11.

      Сказать syslogd о новом chroot сервисе. Нормально, процессы обращаются к syslogd через “/dev/log”. В chroot окружении это невозможно, поэтому syslogd должен слушать “/chroot/httpd/dev/log”. Чтобы сделать это, редактируйте скрипт запуска syslog для определения дополнительного места, которое необходимо слушать.

      Редактируйте скрипт syslog (vi /etc/rc.d/init.d/syslog) и измените строку:

      daemon syslogd -m 0

      на:
      daemon syslogd -m 0 -a /chroot/httpd/dev/log

      Шаг 12

      По умолчанию скрипт httpd запускает демон “httpd” вне chroot окружения. Мы должны изменить это, для этого редактируйте скрипт httpd (vi /etc/rc.d/init.d/httpd) и измените следующие строки:

      daemon httpd




      на:
      /usr/sbin/chroot /chroot/httpd/ /usr/sbin/httpd -DSSL

      rm -f /var/run/httpd.pid

      на:
      rm -f /chroot/httpd/var/run/httpd.pid

      Шаг 13

      В заключении, вы должны проверить новую chroot конфигурацию вашего веб сервера Apache.

      Первое, перезагрузите демон syslogd: [root@deep /]# /etc/rc.d/init.d/syslog restart Shutting down kernel logger:         [ OK ] Shutting down system logger:         [ OK ] Starting system logger:              [ OK ] Starting kernel logger:              [ OK ]

      Затем, запустите Apache в chroot окружении: [root@deep /]# /etc/rc.d/init.d/httpd start Starting httpd:                      [ OK ]

      Если вы не получили каких-либо ошибок дайте команду:
      [root@deep /]# ps ax | grep httpd

      14373 ? S 0:00 httpd -DSSL

      14376 ? S 0:00 httpd -DSSL

      14377 ? S 0:00 httpd -DSSL

      14378 ? S 0:00 httpd -DSSL

      14379 ? S 0:00 httpd -DSSL

      14380 ? S 0:00 httpd –DSSL

      14381 ? S 0:00 httpd -DSSL

      14382 ? S 0:00 httpd -DSSL

      14383 ? S 0:00 httpd -DSSL

      14384 ? S 0:00 httpd -DSSL

      14385 ? S 0:00 httpd -DSSL

      14386 ? S 0:00 httpd -DSSL

      14387 ? S 0:00 httpd -DSSL

      14388 ? S 0:00 httpd -DSSL

      14389 ? S 0:00 httpd -DSSL

      14390 ? S 0:00 httpd -DSSL

      14391 ? S 0:00 httpd -DSSL

      14397 ? S 0:00 httpd -DSSL

      14476 ? S 0:00 httpd -DSSL

      14477 ? S 0:00 httpd -DSSL

      14478 ? S 0:00 httpd -DSSL

      Если это так, то проверьте действительно процесс сменил корень (chroot):
      [root@deep /]# ls -la /proc/14373/root/

      Вы должны увидеть:

      dev

      etc

      home

      lib

      usr

      var

      где 14373 PID одного из процессов httpd.
      Поздравляем!

      Так же как описано выше, если вы используете Perl, вам нужно скопировать или создать жесткие ссылки любых системных библиотек, perl библиотек “/usr/lib/perl5” и двоичных файлов в chroot структуре. Также надо действовать для SSL, PHP, LDAP, PostgreSQL и других программ.


      Содержание раздела