Главная » FreeBSD-сервер для линуксоида: приведение конфигурации к виду, в котором удобно работать
Примечание: в статье рассматривается ОС FreeBSD 6.2 (впрочем,рекомендации в значительной степени должны быть справедливы и длядругих версий).
   
   
    Сцена первая: подготовка к установке
   
   
    И здесь первым же моментом — удобство: для установки полностьюработоспособной системы достаточно скачать первый из двух образовдисков (забегая вперёд: качать второй — никакого смысла).
   
   
    Сцена вторая: собственно установка
   
   
    Ничего особенно выдающегося. Единственное — мягко говоря,непривычная для человека, ранее имевшего дело только с Linux, логикаразбиения диска (надо всё сделать правильно на этапе установки — в ужеустановленной системе в конфигурации по умолчанию структуру разделов неизменить). Главное здесь — не забыть поставить исходники всегонеобходимого (в первую очередь, ядра) и коллекцию портов.
   
    И сразу — подарочный набор граблей от FreeBSD Team: после установкисистема нормально загружается, ТОЛЬКО если корневой раздел был указанпервым. Если же, как в моём случае, после привычки к Linux первымразделом на автопилоте указывается SWAP, то — добро пожаловать к танцамс бубном (дилемма: переустанавливать или искать LiveCD с поддержкойUFS2).
   
    В зависимости от назначения разворачиваемого сервера можетоказаться необходимым предусмотреть отдельный, достаточно большойраздел на жёстком диске под /var.
   
    Для упрощения дальнейшей настройки в процессе установки следуетуказать имя хоста, основной IP-адрес, маршрутизатор, первичныйDNS-сервер. А также завести себе пользователя (не забыв добавить его вгруппу wheel) и указать на старт при загрузке демона ssh.
   
    После этого можно давать команду на перезагрузку, извлекать дистрибутивный диск и переходить в тёплое место.
   
    На случай правки/дополнения введённой информации:
    Доменное имя и используемые DNS-серверы прописываются в файле /etc/resolv.conf. Формат файла:
   
domain MYDOMAIN
nameserver NAMESERVER1
nameserver NAMESERVER2   
    Имя хоста берётся из команды активации сетевого интерфейса в /etc/rc.conf.
    Также эти имена фигурируют в локальном дополнении DNS-сервера — файле /etc/hosts.
   
    В процессе установки (в отличие от Linux) выполнение большей части действий по настройке не предусмотрено.
   
   
    Сцена третья (настройка): берём в руки напильник
   
   
    Необходимые действия следующие:
Задать пароль суперпользователя root (процесс входитв стандартную процедуру установки опцией, а по умолчанию этот пароль —пустой). Одновременно категорически рекомендовано в /etc/passwdв профиле пользователя root дописать имя хоста. Это значительнооблегчит жизнь при идентификации отчётов и извещений рассылаемыхсервером.    После получения shell'а с правами суперпользователя произвести предварительную минимально необходимую настройку окружения. По умолчанию в FreeBSD для пользователя root задан csh — соответственно, редактировать будем файл ~/.cshrc. В этом файле:
    Заменить значение переменной PAGER с more на less:
    setenv PAGER less
    Прописать настройки соединения с сетью (предполагается, что используется PROXY-сервер):
setenv HTTP_PROXY PROTOCOL://ADRESS:PORT
setenv FTP_PROXY PROTOCOL://ADRESS:PORT
setenv http_proxy PROTOCOL://ADRESS:PORT
setenv ftp_proxy PROTOCOL://ADRESS:PORT
    После этого надо перечитать конфиг:
    # csh
    Теперь можно заняться приведением библиотеки ПО к актуальному состоянию:
   
   
    /* Примечание: необходимо учитывать, что далеко не все порты написаны корректно и элементарно работоспособны. */
   
   
# cd /usr/ports/net/cvsup-without-gui
# make && make install && make clean
# cd
# cp /usr/share/examples/cvsup/ports-supfile .
# vi ports-supfile
   
    В указанном в приведённой строке файле необходимо заменить значениепо умолчанию на имя хоста или IP-адрес PROXY-сервера (который, к томуже, должен быть правильно настроен):
   
    *default host=CHANGE_THIS.FreeBSD.org
   
    И произвести обновление дерева портов:
   
    # cvsup -g -L 2 ports-supfile
    (обновление дерева портов может не иметь смысла лишь в течение 1—2 недель с момента выхода дистрибутива.)
# cd /usr/ports/ports-mgmt/portupgrade
# make && make install && make clean
   
   
    Теперь небольшое лирическое отступление про FreeBSD 6.2(справделиво и для предыдущих версий 6-й ветки) в её современномсостоянии. После выхода FreeBSD 6.2 был произведён переход на новыеверсии некоторых узловых элементов. В связи с этим просто обновлениемдерева портов ограничиться не получится и придётся произвести ряддополнительных действий. Например:
    # portupgrade -rf gettext
    Конец первого лирического отступления.
   
   
# cd /usr/ports/shells/bash
# make && make install && make clean
   
    Ставить shell из портов в качестве стандартной оболочкисуперпользователя опасно, ибо не всегда получается уделить достаточновнимания файлу /usr/ports/UPDATING.С другой стороны, не все приложения понимают запуск одного шелла изнастроечного файла другого. Поэтому пускать bash придётся вручную. Чтодля сервера (куда заходишь не каждый день и, строго говоря, не каждуюнеделю) не так уж и фатально.
   
   
    И второе лирическое отступление:
    # setenv XORG_UPGRADE yes
    Конец второго лирического отступления.
   
   
# cd /usr/ports/editors/vim
# make && make install && make clean
   
    Затем надо скопировать (и привести к соответствующему данному конкретному случаю виду) конфигурационные файлы bash (который в FreeBSD почему-то зовётся ~/.profile) и vim (~/.vimrc и ~/.viminfo), запустить шелл:
   
    # /usr/local/bin/bash -login
   
    Теперь вроде жить можно (в ~/.profile уже заданы нужные alias'ы и правильные значения основных переменных типа EDITOR).
   
    Из стандартно устанавливаемых приложений осталось только обеспечить контроль безопасности. Проверку установленного ПО на наличие известных уязвимостей осуществляет приложение portaudit (см. /usr/ports/ports-mgmt/portaudit/).
   
    Теперь надо перелогиниться, и тогда можно переходить к установке необходимого для жизни софта.
   
    Первый этап — обеспечение безопасности (см. «FreeBSD enable security port auditing to avoid vulnerabilities»на cyberciti.biz — правда, статья не вполне соответствуетдействительности), в смысле проверки устанавливаемого ПО на известныеуязвимости. Сначала установка portaudit:
   
# cd /usr/ports/ports-mgmt/portaudit/
# make && make install && make clean
   
    Скрипт, осуществляющий проверку в рамках стандартных системныхежедневно выполняемых задач (periodic daily || weekly || monthly),живёт по следующему пути: /usr/local/etc/periodic/security/410.portaudit.
   
    Как скрестить portaudit в режиме скачивания базы с демоном cron,я так и не понял. Поэтому буду исходить из того, что база скачиваетсяявно системными командами. Файл базы расположен по адресу www.freebsd.org/ports/auditfile.tbz.
   
    Теперь можно написать скрипт следующего содержания:
   
#!/usr/local/bin/bash
#
# Скрипт проверки установленного ПО.
#
export PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin
export HOME=/var/log
#
export FTP_PASSIVE_MODE=YES
export FTP_PROXY=http://$MY_PROXY_IP:$MY_PROXY_PORT
export HTTP_PROXY=http://$MY_PROXY_IP:$MY_PROXY_PORT
export ftp_proxy=http://$MY_PROXY_IP:$MY_PROXY_PORT
export http_proxy=http://$MY_PROXY_IP:$MY_PROXY_PORT
#
#
cd /var/db/portaudit
if [ -s auditfile.tbz ]
then
mv -f auditfile.tbz auditfile.tbz.tmp
else
date > /root/portaudit.log
echo "Error!!!" >> /root/portaudit.log
echo "portaudit database doesn't exist!!!" >> /root/portaudit.log
mail -s "ldap-server portaudit report" my_admin_email@mydomain.ru < /root/portaudit.log
exit 1
fi
fetch http://www.freebsd.org/ports/auditfile.tbz
#
if [ -s /var/db/portaudit/auditfile.tbz ]
then
date > /root/portaudit.log
echo "portaudit report" >> /root/portaudit.log
echo "" >> /root/portaudit.log
portaudit -da 2>&1 >> /root/portaudit.log
else
date > /root/portaudit.log
echo "portaudit report" >> /root/portaudit.log
echo "" >> /root/portaudit.log
echo "Error while fetching audit database" >> /root/portaudit.log
fi
#
diff auditfile.tbz.tmp auditfile.tbz > /root/audit-report.flag
#
if [ -s /root/audit-report.flag ]
then
mail -s "ldap-server portaudit report" my_admin_email@mydomain.ru < /root/portaudit.log
rm -f /root/audit-report.flag
fi
#
rm -f /root/audit-report.flag
#
exit 0   
    Приведённый скрипт предполагает наличие базы уязвимостей и её резервной копии в /var/db/portaudit. Обеспечим необходимые исходные данные (а заодно проверим установленное ПО):
   
# portaudit -Fda
# cd /var/db/portaudit
# cp auditfile.tbz auditfile.tbz.tmp
   
    После этого приведённый скрипт нужно поставить в cron(время выполнения и периодичность — по вкусу) и по факту обновлениябазы уязвимостей он будет посылать туда отчёты об известных уязвимостяхв установленном ПО.
   
   
    Следующий шаг — переход к собственно настройке системы.
   
   
    Для начала локализация:
   
    vi /etc/ttys
   
    Для всех терминалов тип cons25 меняется на cons25r,а первый выключается (on -> off) для того, чтобы в случаевозникновения необходимости было удобнее читать системные сообщения.
   
    Это необходимо и достаточно для работы за физическим терминалом. Для корректной локализации при работе с виртуальным (через ssh) надо задать тип терминала в профиле (что в некоторой степени дублирует изменения, внесённые в /etc/ttys).
   
$ cat ~/.profile | grep TERM
export TERM=${TERM:-cons25r}
    (В прилагаемых мной файлах профиля это уже учтено).
   
    Для корректной локализации осталось прописать login class "russian" для пользователя. Редактирование профиля простым пользователем осуществляется командой chpass, с правами суперпользователя можно редктировать непосредственно в базе пользователей (команда vipw).
   
    И на системном уровне — используемые шрифты/раскладку клавиатуры:
   
    В файл /etc/rc.conf вставляется следующий блок:
   
# System console options:
keymap=ru.koi8-r
scrnmap=koi8-r2cp866
font8x16=cp866b-8x16
font8x14=cp866-8x14
font8x8=cp866-8x8
    Переключение кодировок производится клавишей CapsLock.
   
    Совершенно незаслуженно забыт такой архинужный файл, как ~/.bash_logout, в котором для нулевого приближения достаточно прописать всего одну команду: clear.
   
    Если предполагается добавление заметного количества пользователей,для которых желательно сразу получить указанные настройки, вероятно,имеет смысл скопировать эти файлы (~/.profile, ~/.bash_logout и ~/.vimrc в /usr/share/skel, с добавлением приставки dot).
   
    Теперь модификация значений по умолчанию в системном логировании:
   
    Для анализа поведения системы обычно бывает полезно раскомментировать в файле /etc/syslog.conf строку, содержащую описание all.log (при этом в /etc/newsyslog.conf соответствующая запись вносится автоматически).
   
    И ещё по настройке логирования: в строке, содержащей объявление /var/log/messages, рекомендуется убрать упоминание размера лога (т.е. ротировать по времени независимо от объёма записанной информации).
   
    Предпоследний шаг — настройка стандартно запускаемых сервисов.
   
    # vim /etc/rc.conf /etc/defaults/rc.conf
   
Из /etc/defaults/rc.conf в основной конфигурационный файл переносится секция, относящаяся к запуску ssh (потому как то, что пишет sysinstallвыглядит совсем непристойно). Из второго файла в первый переноситсясекция, посвящённая настройке ssh, демон ssh разрешается, в конфигедемона (/etc/ssh/sshd_config) прописывается запрет регистрации пользователя root, но мы этим не ограничиваемся и прописываем директиву AllowUsers(с разделителем пробел — пользователи, которым разрешено заходить всистему по ssh). Также категорически имеет смысл в домашней директориисвоего пользователя создать каталог ~/.ssh и скопировать в него под именем authorized_keys свой публичный ключ, после чего в конфиге sshd_config запретить ещё и авторизацию по паролю.    В стандартной конфигурации FreeBSD (файл /etc/defaults/rc.conf) crondиспользуется. Однако для наглядности считаю правильным перенестисекцию, описывающую запуск этого демона, из конфига по умолчанию восновной. И ещё один момент: по умолчанию файл crontab вFreeBSD 6.X пустой. Что лично меня несколько напрягает придобавлении/редактировании пользователей. Для удобства считаюцелесообразным добавить в crontab всех пользователей, где этоактуально, шапку следующего вида:
   
# /etc/crontab - root's crontab for FreeBSD
#
#SHELL=/bin/sh
#PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
#HOME=/var/log
#
#minute hour mday month wday who command
Почта. По умолчанию в FreeBSD интегрирован sendmail,полное отключение которого отмечено как категорически нежелательное. Встандартной настройке он умеет принимать и приземлять или, принеобходимости, перенаправлять вовне письма. Что и нужно. Если серверпредполагается использовать как почтовый (см. «Установка и настройка почтового сервера на базе FreeBSD и sendmail»),то необходимо изменить значения по умолчанию параметров запускаsendmail (с тем, чтобы он не только отправлял, но и принимал почту), впротивном случае считаю правильным оставить всё как есть в /etc/defaults/rc.conf.    Время. Надеюсь, о важности этого параметра распространяться не надо. Задание временного пояса в FreeBSD осуществляется утилитой tzsetup.Синхронизироваться можно либо с локального сервера точного времени,либо с использованием соответствующего сервиса. Для России это[например] 0.ru.pool.ntp.org. Первоначальная установка правильного времени осуществляется командой:
   
    # ntpdate 0.ru.pool.ntp.org
   
    Но постоянное её использование не всегда допустимо, ибо она изменяет системное время ступенчато. Для активации демона в /etc/rc.conf необходимо добавить (точнее, перенести из стандартного с исправлением значений) секцию следующего вида:
   
##############################################################
##### Network Time Services options: ###
##############################################################

timed_enable="NO" # Run the time daemon (or NO).
timed_flags="" # Flags to timed (if enabled).
ntpdate_enable="NO" # Run ntpdate to sync time on boot (or NO).
ntpdate_program="/usr/sbin/ntpdate" # path to ntpdate, if you want a different one.
ntpdate_flags="-b" # Flags to ntpdate (if enabled).
ntpdate_config="/etc/ntp/ntp.conf" # ntpdate(8) configuration file
ntpdate_hosts="" # Whitespace-separated list of ntpdate(8) servers.
ntpd_enable="YES" # Run ntpd Network Time Protocol (or NO).
ntpd_program="/usr/sbin/ntpd" # path to ntpd, if you want a different one.
ntpd_config="/etc/ntp/ntp.conf" # ntpd(8) configuration file
ntpd_sync_on_start="YES" # Sync time on ntpd startup, even if offset is high
ntpd_flags="-p /var/run/ntpd.pid -f /var/db/ntpd.drift"
# Flags to ntpd (if enabled).   
    В конфигурационном файле /etc/ntp/ntp.conf достаточно указать следующие праметры:
   
server 0.ru.pool.ntp.org
driftfile /var/db/ntp.drift
   
    Теперь можно запускать демона точного времени:
   
    # /etc/rc.d/ntpd start
   
    В случае перезагрузки сервера он запустится автоматически.
    Часто бывает нужен (и для внутреннего сервера достаточен) сервис передачи файлов или FTP.В состав FreeBSD входит стандартный FTP-сервер, который по умолчаниюотключён. Запускать его можно как в качестве самостоятельного демона,так и через inetd. Лично я для большинства случаев считаю правильным запуск в качестве самостоятельного демона. В /etc/rc.conf переносится следующая секция (с заменой значения NO на YES):
   
ftpd_enable="YES" # Enable stand-alone ftpd.
ftpd_program="/usr/libexec/ftpd" # Path to ftpd, if you want a different one.
ftpd_flags="" # Additional flags to stand-alone ftpd.   
    После чего запускается демон:
   
    # /etc/rc.d/ftpd start
    Последним этапом в конфигурации базовых стандартных компонентов системы(строго говоря, переходить к нему или как минимум формироватьокончательную конфигурацию должно после настройки не только базовыхсервисов, но и тех служб, для которых собственно и строится сервер)является настройка файрволла. В большинстве случаев функциональности стандартного пакетного фильтра FreeBSD ipfw достаточно. Для его активации в основной конфигурационный файл добавляется следующий блок:
   
##############################################################
### Network configuration sub-section ######################
##############################################################

### Basic network and firewall/security options: ###
firewall_enable="YES" # Set to YES to enable firewall functionality
firewall_script="/etc/rc.firewall" # Which script to run to set up the firewall
firewall_type="/etc/ipfw.rules" # Firewall type (see /etc/rc.firewall)
firewall_quiet="NO" # Set to YES to suppress rule display
firewall_logging="YES" # Set to YES to enable events logging
firewall_flags="" # Flags passed to ipfw when type is a file   
    Базовое описание формата правил представлено в статье «Стартовый минигид по пакетному фильтру FreeBSD ipfw».
   
    После написания файла с правилами файрволла их следуетактивировать. Однако необходимо учитывать, что в данном случае, еслипросто выполнить /etc/rc.d/ipfw start,брандмауэр не прочитает конфигурационный файл, а просто активируетправило по умолчанию, запрещающее всё для всех, и выключит ssh-сессию.
   
    Следующая команда:
    # /etc/rc.d/ipfw restart
    — не только активирует это правило по умолчанию, но и прочитает те,что [предположительно правильно] записаны в созданном конфигурационномфайле.
    На этом базовая часть конфигурирования сервера завершена. Осталось(в смысле, считаю удобным и, как следствие, категорическирекомендованным) создать два файла:
/root/admin.log — список установленных явно (не в качестве зависимости) портов;/root/patching.log — журнал наложения патчей.    А также — каталог, содержащий собственно файлы наложенных патчей: /root/patches/.
   
   
    Завершающий штрих развёртывания: проверка конфигурации (пересборка) ядра
   
   
    Процедура компиляции достаточно хорошо описана в Handbook. Тем не менее, вкратце (по шагам) рассмотрю этот процесс.
   
    Конфигурация ядра размещается в простом текстовом файле, прозрачномдля чтения и редактирования, да ещё и снабжённого практическисамодостаточными комментариями. Я бы даже сказал, что процедураконфигурации ядра в FreeBSD удобнее и понятнее, чем в Linux… Если бы неодно «но»: в стандартном конфигурационном файле присутствуют далеко невсе возможные опции. О многом, пока не упрёшься, и не догадаешься.
   
# cp /usr/src/sys/i386/conf/GENERIC ~/MY_KERNEL
# ln -s /root/MY_KERNEL /usr/src/sys/i386/conf/MY_KERNEL
# vim /root/MY_KERNEL
   
    В правке конфига ядра (точнее, в выяснении используемых модулей) незаменимым подспорьем является файл /var/run/dmesg.boot.Особо оговариваю тот момент, что в данном случае (да и, наверное, впринципе) отключать бинарную совместимость с предыдущими версиямиFreeBSD категорически НЕ рекомендуется.
   
    После приведения файла конфигурации в соответствие со своимипредставлениями о том, что должно работать на сервере (с учётом реальноиспользуемых модулей) сборка ядра завершается:
   
# cd /usr/src/sys/i386/conf/
# /usr/sbin/config MY_KERNEL_CONFIG
# cd ../compile/MY_KERNEL_CONFIG
# make clean
# make cleandepend
# make depend
# make
# make install
# shutdown -r now
   
    (Команда make clean крайне полезна при пересборке. По make install автоматически переписывается загрузчик.)
   
    И ещё один момент в плане комментария: в ядро зашивается текущее значение hostname!
   
    Также полезно учитывать, что:
В конфиге GENERIC представлен далеко не полный список опций.В вышеописанной конфигурации всё равно будут собраны все (дажеотсутствующие в конфигурационном файле) компоненты. Только те, которыевыносятся из конфига, будут собраны модулями. Что неприятно — причёмдаже не (с)только потому, что увеличивает время сборки ядра.    Исправляется добавлением в /etc/make.conf строки:
    NO_MODULES
   
    При этом модули (за исключением явно перечисленных в конфиге ядра)собираться вообще не будут. При желании, список модулей, перечисленныхв конфиге ядра, можно дополнить аргументами прописываемой в /etc/make.conf переменной MODULES_OVERRIDE:
   
MODULES_OVERRIDE="cd9660 netgraph nfsserver nfsclient"   
    В FreeBSD модули ядра живут в каталоге /boot/kernel. Соответственно, полный список модулей, собирающихся в стандартной процедуре сборки ядра, можно посмотреть командой:
   
    $ ls /boot/kernel
   
    Перед добавлением в /etc/make.conf опции NO_MODULESкатегорически рекомендуется выяснить, какие модули могут потребоватьсяи, если они явно не указаны в конфиге ядра, то перечислить их в /etc/make.conf в списке аргументов параметра MODULES_OVERRIDE.
   
   
   
    После настройки основных сервисов также архи-полезно решить задачурезервного копирования. Но здесь я склонен считать, что раскрытие этойтемы выходит за рамки данной статьи.
   
   
    Таким образом, Свободная Бздя приводится к состоянию, когда в ней более не менее можно работать. Ноты никогда не будешь знать, когда и на какие именно грабли ты наступишьв следующий раз.
   
    Напоследок, некоторые особенности, с которыми придётся столкнуться при конфигурировании сервисов:
Во избежание путаницы рекомендую запуск всех приложений прописывать только в /etc/rc.conf.Правильно написанный стартовый скрипт не запустит приложение при отсутствии разрешающей записи в /etc/rc.conf.Но это — ерунда. Неприятным (и непривычным) здесь является то, что приэтом никакого вывода на экран не производится (во всех остальныхслучаях на экран выводится одна или несколько строк с описаниемвыполняемых действий — к этому надо привыкнуть). И неудобным —постоянно держать в голове необходимость отмены запуска приложений припроведении тестирования.Также непривычным, нелогичным и неудобным является периодическивозникающая необходимость правки дистрибутивных стартовых скриптов дляобеспечения нужного порядка старта сервисов.    И один момент про настройку ротации логов: если приложение пишет логи через syslogd, то указание файла PID'а в /etc/newsyslog.conf избыточно; если же приложение пишет лог в файл, то для корректной записи логов указывать PID необходимо.
   
   
    После обновления XOrg из портов до версии 7.2 может возникнуть проблема с работой X11 Forwarding sshd (если оный XForwarding используется). Причина в изменении стандартных путей к командам на не совпадающие с использованными при компиляции значения.
   
    В данном конкретном случае решается следующим образом:
   
# cd /usr
# ln -s local X11R6
   
    Ранее (когда существовал не пустой каталог /usr/X11R6/bin) проблема решилась созданием в нём символической ссылки на исполняемый файл xauth. К текущему моменту выяснилось, что зависимость от xauth полностью сломана. Исправляется следующим образом:
   
# cd /usr/ports/x11/xauth
# make && make install && make clean

Категория: Интересные статьи | Просмотров: 494