FreeBSD – свободная UNIX-подобная операционная система, прямой потомок системы AT&T Unix (разумеется, я имею в виду ветку BSD-подобных ОС), разработанный в университете Беркли. FreeBSD поддерживает различные платформы, в том числе X86, IA-64, AMD64, DEC Alpha, Sun UltraSPARC, PowerPC, NEC PC-98 и ARM. В отличие от GNU/Linux, FreeBSD разрабатывается как целостная операционная система.
Весь исходный код ядра, драйверов устройств, пользовательских программ, таких как командные оболочки и др., содержится в одной ветке системы контроля версий Subversion и контролируется коммитерами. В GNU/Linux ядро разрабатывается одной группой специалистов, а пользовательские программы – другими разработчиками. Большие группы авторов дистрибутивов собирают это в одно целое, а затем выпускают в виде всевозможных вариаций GNU/Linux.
FreeBSD отлично зарекомендовала себя как система для создания интранет- и интернет-серверов различной направленности. Она предоставляет очень надёжные сетевые службы и рациональное управление памятью. FreeBSD широко представлена в списке Web-серверов с самым большим временем непрерывной работы (так называемый uptime), по данным исследования компании Netcraft.
Кроме своей стабильности, эта система известна благодаря BSD-лицензии, которая значительно отличается от лицензии GNU GPL. Лицензия BSD позволяет использовать код не только в свободном ПО, но и в проприетарном, коммерческом. В отличие от GNU GPL, которая тоже позволяет использовать свободный код в несвободных программах, лицензия BSD более лаконичная и демократичная и дает большую свободу разработчикам в средствах реализации их продукции.
Установка и настройка
Более подробно установка самой системы была описана мной в предыдущих статьях, поэтому пробежимся только по основным моментам, выделив, таким образом, квинтэссенцию процесса из общей рутины длительных и не всегда простых действий.
В результате долгих лет тренировок в установке и использовании этой системы могу предложить оптимальный, на мой взгляд, вариант этого процесса. После попадания в “Sysinstall Main Menu” выберите “Custom” – эта опция даст вам возможность самостоятельно и в полной мере руководить процессом установки системы. Перейдите к разделу “Partitions”, где необходимо создать разделы будущей системы, затем в “Label” для привязки точек монтирования к так называемым слайсам (файловым системам) на созданном разделе. Теперь самое интересное – переход к “Distributions”, где нужно выбрать набор устанавливаемого вами минимального (на мой взгляд) ПО для обеспечения функционирования системы. Там переходим на “Custom”, и в нем выбираем “man”, “ports” и “src”, а в последнем – “sys” и “include”. Кроме этого надо, конечно, отметить подпункт “Minimal”, что приблизительно и по аналогии соответствует пресловутому Linux-base, но только в формате FreeBSD.
После выбора источника установки ПО и подтверждения начала установки переходим к самой инсталляции. По ее окончании нужно зайти в пункт меню “FreeBSD Config Menu”, установить пароль для root и ряд других опций – мышь, шрифт и т.д. Затем необходимо сконфигурировать временную зону, настроить сетевые интерфейсы, через “Sysinstall Main Menu” выйти на “Exit install” и после перезагрузки попасть в работающую систему, которая встретит вас своим фирменным приветствием.
Теперь самое время перейти непосредственно к формированию того, что будет называться Web-сервер с поддержкой apache+php+mysql. Но прежде давайте посмотрим, что мы имеем в системе. А имеем мы почти «голую» ОС, как я уже говорил, с аналогом Linux-base, системой man, коллекцией портов (ports – набор инструкций по сборке и установке сторонних приложений через Интернет) и заголовочными файлами библиотек. Можно устанавливать необходимое ПО с диска, но лучше воспользоваться системой портов и ставить через нее самые последние версии программ. Для этого будем использовать утилиту portupgrade, которую саму надо сначала установить. Перейдем в ее каталог (/usr/ports/sysutils/portupgrade) и там выполним команду make install clean. Результатом ее выполнения будет установка утилиты в систему. Теперь все просто: если нам надо что-то установить, дадим команду portupgrade –NRr mc-4.6.1_6 в случае необходимости установки файлового менеджера midnight commander, а если нужно только обновить уже установленный пакет, то команду portupgrade –Rr mc-4.6.1_6. И никакого мусора в системе, никаких лишних пакетов, их кусков и прочих прелестей!
Если вам что-то не нравится или возникают определенные трудности, то возможен обычный способ установки из портов путем перехода в каталог порта и подачи оттуда стандартного ряда команд в виде make install clean.
Да и всегда есть альтернатива установки пакетов с инсталляционных дисков. Для этого нужно выполнить в консоли команду sysinstall перейти в меню sysinstall Main menu -> Configure -> Packages -> CD/DVD и в этом режиме, после получения доступа к носителю, установить требуемые пакеты.
Рассмотрим инсталляцию необходимого программного обеспечения через систему портов. Для начала установим Web-сервер apache21. Переходим в каталог /usr/ports/www/apache21 и там выполняем известные уже команды #make install clean. Успешное завершение установки отобразится в консоли соответствующим сообщением.
Теперь необходимо поставить интерпретатор php5, причем не забудьте в опциях указать, что компилировать его надо как модуль к httpd серверу apache (рисунок 1).
Рисунок 1.
После удачной установки php5 нам остается добавить СУБД mysql5. Переходим в каталог /usr/ports/databases/mysql51-server и выполняем там команды # make install clean. После успешной установки (без сообщений об ошибках), необходимо настроить СУБД. Для этого нужно выполнить команды:
Код: Выделить всё
# cp /usr/local/share/mysql/my-medium.cnf /usr/local/etc/my.cnf
# mysql_install_db
Рисунок 2.
Чтобы весь этот комплекс работал, требуется провести ряд дополнительных настроек. Нужно добавить в конфигурационный файл /etc/rc.conf следующие строки:
Код: Выделить всё
apache22_enable=”YES”
mysql_enable=”YES”
Стартовые скрипты для этих служб находятся в каталоге /usr/local/etc/rc.d/mysql-server.sh, и тут же apache22, но управление их запуском осуществляется из файла /etc/rc.conf.
Для включения поддержки php5 в виде модуля в Web-сервер apache21 в его конфигурационный файл, который находится в /usr/local/etc/apache22/httpd.conf, надо добавить:
Код: Выделить всё
LoadModule php5_module libexec/apache21/libphp5.so
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Внимание! Во фрагменте “…x-httpd-php .php” пробел между “x-httpd-php” и “.php “ обязателен, во второй строке – тоже. Будьте внимательны. Часто ошибаются в этих же строках, когда пишут “http” вместо “httpd” – просто обратите на это внимание. Теперь осталось немногое. Необходимо создать файл (выполнив команду touch file_name.php) в каталоге /usr/local/www/apache22/data/, например, с именем my.php и в него вписать:
Код: Выделить всё
<?php
echo phpinfo();
?>
Рисунок 3.
Выполнив конфигурацию php и сделав все остальное, мы получим хороший сервер на мощной системе FreeBSD, осталось только ее правильно защитить. Предлагаю для этой цели использовать сетевой фильтр с сохранением состояния на интерфейсах IPFILTER(IPF). Традиционный пакетный фильтр, входящий во FreeBSD и называемый IPFW, очень хорош и проверен временем, но не поддерживает сохранение состояния на интерфейсах и имеет другую, более сложную логику работы. Его изучение не входит в рамки данной статьи.
Защита системы с помощью сетевого фильтра IPFILTER
Программу IPFILTER разработал Дарен Рид (Darren Reed). Ее особенностью является независимость от операционной системы. Сама программа была портирована на операционные системы FreeBSD, NetBSD, OpenBSD, SunOS, HP/UX, и Solaris. IPFILTER постоянно развивается и усовершенствуется, а его разработчики регулярно выпускают свежие версии.
Сам пакет IPFILTER основан на сетевом экране уровня ядра, а технология NAT, если она нужна, управляется и контролируется через пользовательский интерфейс. Правила сетевого экрана устанавливаются или удаляются утилитой ipfmon. Правила NAT могут устанавливаться или удаляться утилитой ipnat. Утилита ipfstat может выводить статистику IPFILTER ядра. Программа ipmon заносит действия IPFILTER в системные файлы для их последующего анализа и принятия решения системным инженером.
IPFILTER был изначально написан в соответствии с правилом ''применяется последнее совпадение'' и с правилами без сохранения состояния. С течением времени он был расширен и доработан до самого современного уровня, и на сегодняшний день включает в себя параметры ''quick'' и ''keep state'' (сохранение состояния), которые глобально изменяют весь порядок обработки пакетов.
В официальной документации к IPFILTER есть масса разделов, включающих в себя традиционные параметры правил с особым механизмом обработки последовательностей пакетов. Измененные функции включены в виде отдельных параметров, которые необходимы для создания мощного и производительного межсетевого экрана. Теперь необходимо реализовать такой экран на базе IPFILTER и настроить его для нужд нашей системы.
Рисунок 4.
IPF включен в основную конфигурацию системы FreeBSD в качестве отдельного загружаемого модуля. Система может динамически загрузить модуль IPF, если в ее основном конфигурационном файле rc.conf указана переменная ipfilter_enable="YES". Сам модуль создается с включенным протоколированием и некоторым набором правил по умолчанию, которые, конечно, придется адаптировать к нуждам нашей системы и тем сетевым службам, которые она поддерживает. Для изменения правил не обязательно собирать ядро с новыми параметрами, можно просто добавить их в существующий набор, реализовав тем самым необходимый функционал. Изначально основное правило для ipf – это свободный пропуск всех пакетов во всех направлениях, так что достаточно указать в /etc/rc.conf опцию ipfilter_enable=”YES”, и мы уже получим работающий сетевой фильтр без опасения что-либо заблокировать или отключить. Затем можно поэтапно переходить к созданию минимального набора правил и его тестированию, постепенно наращивая функционал и переходя от простого к сложному.
Все возможные опции для работы ipmon и ipf включены в файл /etc/defaults/rc.conf, после их изучения стоит внести следующие изменения в файл /etc/rc.conf:
Код: Выделить всё
ipfilter_enable=”YES”
ipfilter_rules=”/etc/ipf.rules”
ipmon_enable=”YES”
ipmon_program=”/sbin/ipmon”
ipmon_flags=”-D /var/log/ipflog”
Если все сделано правильно, то после перезагрузки системы (или после выполнения скрипта /etc/netstart, который не требует перезагрузки) можно увидеть сакраментальную надпись, которая является сообщением ядра: “IP FILTER: v4.1.8 initialized. Default = pass, Logging = enabled /etc/rc: WARNING: IP-filter: NO IPF RULES”. Все это говорит нам о том, что IPFILTER загружен системой как модуль успешно, имеет правила по умолчанию pass (проход разрешен всем и везде, что равносильно отсутствию каких-либо правил вообще), включено протоколирование событий и здесь же нас предупреждают, что IPFILTER не имеет пока других правил работы, кроме основного – pass. На мой взгляд, для ознакомления с продуктом достаточно следующих правил, добавленных в файл /etc/ipf.rules: #OUTBOUND
Код: Выделить всё
#LOOPBACK
pass in quick on lo0 all
pass out quick on lo0 all
#DNS
pass out quick on lnc0 proto tcp from any to any port = 53 flags S keep state
pass out quick on lnc0 proto udp from any to any port = 53 keep state
#HTTP&HTTPS(over TLS/SSL)
pass out quick on lnc0 proto tcp from any to any port = 80 flags S keep state
pass out quick on lnc0 proto tcp from any to any port = 443 flags S keep state
#TIME
pass out quick on lnc0 proto tcp from any to any port = 37 flags S keep state
#SSH
pass out quick on lnc0 proto tcp from any to any port = 22 flags S keep state
#PING
pass out quick on lnc0 proto icmp from any to any icmp-type 8 keep state
block out log first quick on lnc0 all
#INBOUND
#block
block in quick on lnc0 from 127.0.0.0/8 to any
block in quick on lnc0 from 0.0.0.0/8 to any
block in quick on lnc0 all with frags
block in quick on lnc0 proto tcp all with short
block in quick on lnc0 all with ipopts
#pass
pass in quick on lnc0 proto tcp from any to any port = 80 flags S keep state
pass in quick on lnc0 proto tcp from any to any port = 22 flags S keep state
block in log first quick on lnc0 all
#END
Если присмотреться, то становится понятным, что все правила разделены на три секции. Это #OUTBOUND, #INBOUND и #END. В секции #OUTBOUND составлены правила, регламентирующие выход пакетов наружу, за пределы системы. Первые две строчки разрешают следование пакетов с петлевого интерфейса Loopback. Затем разрешается работа с любым DNS-сервером, потом связь с http- и HTTPS-серверами, протокол, разрешающий синхронизацию времени в системе, SSH, PING, после чего все остальное блокируется строкой “block out log first quick on lnc0 all”.
В следующем разделе составлены правила, регламентирующие вход пакетов внутрь системы. Но до них стоят правила, защищающие систему от ряда потенциально опасных соединений. Полное описание их сути выходит за рамки этой статьи. Далее идет стандартный набор для входа на 80 порт HTTP, и на 22 порт SSH, которые помогут инженеру организовать доступ к системе и «заливку» наполнения сайта через SFTP. Обычным FTP пользоваться не рекомендую по известным причинам – из-за передачи пароля в процессе сессии в незашифрованном виде.
Как и в предыдущей части, в конце блока все остальные виды соединений блокируются “block in log first quick on lnc0 all”.
Конечно, все это далеко не исчерпывает возможности защиты с помощью IPFILTER, но поможет инженерам сделать быстрый старт.
Необходимо сказать несколько слов об управлении межсетевым экраном. Есть ряд утилит, облегчающих наблюдение и управление IPFILTER. Начнем по порядку. Если бывает необходимо быстро в консоли посмотреть статистику работы IPFILTER, то сделать это можно командой
Код: Выделить всё
ipfstat –t.
Рисунок 5.
Вывод всех действующих правил в данный момент времени для блока входящих соединений осуществляется командой:
Код: Выделить всё
ipfstat –i
Код: Выделить всё
ipfstat –o
Код: Выделить всё
ipfstat –s
Рисунок 6.
а исчерпывающую информацию, включая статистику обработанных пакетов, разного рода ошибок и целый ряд дополнительных параметров, получаем командой:
Код: Выделить всё
ipfstat (рисунок 7).
Таким образом, в нашем распоряжении имеется мощная и производительная система, включающая Web-сервер с поддержкой технологии php+mysql и защищенная пакетным фильтром с сохранением состояния на интерфейсах IPFILTER.
Выводы
В этой статье был проведен краткий экскурс по операционной системе FreeBSD. Показаны ее сильные стороны, такие как высокая стабильность и производительность, защищенность и чистота исходного кода, проходящего строгий контроль со стороны коммитеров. Самым подробным образом освещены вопросы установки и этапы предварительной настройки операционной системы, выбор требуемых инсталляционных пакетов FreeBSD, освещены моменты постустановочного обслуживания системы, пояснены методики работы с портами и пакетами системы. Пошагово рассмотрен вопрос установки и настройки связки apache22+php5+mysql, а также проверки ее работоспособности. Описан процесс активизации и настройки системного фильтра пакетов IPFILTER и даны его общие характеристики, а также способы настройки межсетевого экрана.
Все особо ответственные шаги при описании ключевых технологий снабжены реальными иллюстрациями, поясняющими и дополняющими изложенный материал.
Оригинал