Posts Tagged ‘ FreeBSD

Roundcube 0.9.5 Upgrade to 1.0.3 — «DB Schema: NOT OK»

Тот кто сталкивался с обновлением Roundcube наверняка знает что обновить его это тот еще гемор 🙂 Вот и в этот раз я столкнулся с трудностями обновления с версии 0.9.5 до 1.0.3. То что конфиги разные и имеют разный формат — это ложка дегтя … ну да ладно. А вот обновления БД всегда были «поребриком» о который спотыкается каждый 🙂 Короче, наткнулся на такую вот ошибку: «DB Schema: NOT OK»
В инсталлере есть кнопочка «Update» которая якобы должна решить эту проблему, вот же она:

Roundcube - Upgrade SQL DB
но какую бы версию я не выбирал — ничего Читать полностью

Ошибка в FreeBSD — «Error from bsd.apache.mk. apache22 is installed (or APACHE_PORT is defined) and port requires apache.»

При установке mod_php для apache22 нарвался на вот такую ошибку:

root@ns:/usr/ports/www/mod_php56# make install clean
===>  mod_php56-5.6.2 is marked as broken: : Error from bsd.apache.mk. apache22 is installed (or APACHE_PORT is defined) and port requires apache.
*** [install] Error code 1

Stop in /usr/ports/www/mod_php56.
root@ns:/usr/ports/www/mod_php56#

Ох уж эта фря … опять чтото ей не нравится 🙁 Решение оказалось простое, нужно добавить опцию DEFAULT_VERSIONS+=apache=2.2 в make.conf
Читать полностью

Серьезная проблема с Bash — срочно обновиться!

Вот так нежданно-негаданно в мире Open Source вылезла еще одна масштабная проблема. Мир еще не успел оправиться от дырок в OpenSSL (все помнят Heartbleed), а тут на тебе — оказывается «фундамент тоже сыроват»! На этот раз свинью подложил Bash! А ведь он основной shell почти во всех дистрибутивах Linux и часто активно юзается админами *BSD! Уловили масштаб трагедии??? Можно подумать, ну баш и баш — что такого то? Проблема в том что он так или иначе связан с серьезными системными сервисами, например sshd, apache, git, некоторыми ftp и тд. Не говоря уже о том что ленивые админы и программисты не желая разбираться в хитроумных встроенных библиотеках python, perl и прочих языков в том или ином виде юзают «башизмы в CGI скриптах (сам такой, реализация find в perl выедает мне моск), которые выставлены в Интернет на всеобщее обозрение и легко могут быть использованы со злым умыслом 🙂 Сама суть проблемы в том что злоумышленник может через тот же ssh или apache подменить переменные ENV, что позволит ему удаленно выполнять произвольный код на системе жертвы без какойлибо авторизации! Заманчиво? Глядите на простейшую реализацию хака … простота неописуемая! Но идем дальше … Читать полностью

rspamd — проблемы с патчем для exim-4.84

Итак, с последним обновлением exim в FreeBSD возникла проблемка. Точнее не с самим Exim, а с патчем для интеграции rspamd в Exim. При попытке пропатчить исходники получил вот что: 2 out of 11 hunks failed—saving rejects to src/spam.c.rej
Нагляднее ниже в листинге …. Читать полностью

FreeBSD 9.2 и «хитрый NAT» в PF

Итак, стоит задача пробросить пакеты «с мира» внутрь сети, да еще и «отнатить» их на внутреннем интерфейсе. Для визуализации задачи вот такая схемка:

Host_A (IP 91.91.91.91) -> Host_B (WAN_IP 15.15.15.15 -> LAN_IP 192.168.100.100) -> Host_C (LAN_Router) -> Host_D (IP 172.15.99.99)

Это все довольно просто делается на FreeBSD в PF, если на out политик нету, то достаточно трех правил:

INET_IF = "em0"
INET_LOCAL = "em1"
BACULA_SD = "172.15.99.99"

rdr on $INET_IF proto tcp from 91.91.91.91 to $INET_IF port 9103 -> $BACULA_SD port 9103
nat on $INET_LOCAL from 91.91.91.91 to $BACULA_SD -> $INET_LOCAL
pass in quick log on $INET_IF inet proto tcp from 91.91.91.91 to any port 9103 flags S/SA keep state

Правда провозился я долго, оказалось что тупо забыл включить ip-forwarding 🙂 Читать полностью

Proftpd Bruteforce — Достойный ответ для подбирателей паролей

Бредовое вступление.
Давно я чтото не делился с вами своими простенькими поделиями на bash. Не от того что перестал их писать, просто лень описывать 🙂 Но вот чтото захотелось …. Ловите!

Последнее время розвелось много ботов-подбирателей паролей ко всему чему угодно. Рано или поздно это надоедает! Да и ничего хорошего от ботов ждать не приходится, только создают никому ненужную сетевую активность, засоряют логи и грузят сервис непотребными действиями. Решил дать достойный отпор, ибо задолбало!
Потихоньку-неспеша накропал такой вот скриптец, который брутфорсеров отправляет в некую таблицу фаервола, где им имитируется 99% потерь в канале 🙂

1. Скрипт, bash, FreeBSD … что это? Куда я попал и где мои вещи?
Ну, обо всем по порядку! Вот сам скрипт, он на bash:

root@black:~# cat /root/scripts/ftp_bots.sh
#!/usr/local/bin/bash

ban_log="/var/log/ftp_ban.log"

[ -f ${ban_log} ] || touch ${ban_log}

ftp_log="/var/log/proftpd.log"
ftp_bots=`grep -E -e 'no such user' ${ftp_log} |egrep -v '77.99.175.111|111.222.200.100' |sed -e 's/^.*from //' -e 's/\ .*//'| sort -nr | uniq -c | awk '{if($1>7)print $2}'`

for bot in $ftp_bots
 do
  TIME_NOW=`date "+%F %T"`

    pfctl -q -t bots -T test $bot

    if [ $? -eq 0 ]
        then
          continue
        else
         pfctl -q -t bruteforce -T test $bot
          if [ $? -eq 0 ]
            then
                continue
            else
                pfctl -q -t bruteforce -T add $bot
                pfctl -q -K $bot
                pfctl -q -k $bot
                echo "${TIME_NOW} --- Banned IP --- $bot" >> ${ban_log}
          fi
    fi
done

2. И это работает? Да ладно!!! Какието букавки непонятные … и что же этот скрипт делает?
Чуток опишу логику работы скрипта:
/var/log/ftp_ban.log — лог файл скрипта. Туда будут писаться дата-время-ip заблокированных ботов
ftp_log=»/var/log/proftpd.log» — лог FTP сервера
77.99.175.111|111.222.200.100 — некие IP адреса которые я хочу исключить из лога, заведомо считаем что это «белый список». Рекомендую вписать сюда свои IP, а также самых активных пользователей сервера. Заведомо даем им возможность делать ошибки в регистрации, мало ли что 🙂 Как обычно — разраб. сайта пароль на FTP забудет 🙂
ftp_bots — это переменная-список в которую попадут все кроме «белого списка», которые получили от proftpd ошибку — ‘no such user’ более 7 раз!
for bot in $ftp_bots — Ну дальше берем список $ftp_bots и смотрим есть ли IP из списка в таблице bots, если есть — следующий по списку ip, если нету, проверяем есть ли IP из списка в таблице bruteforce, если есть — следующий по списку ip, если нету, добавляем ip в таблицу bruteforce и делаем об этом запись в ${ban_log} и следующая итерация … до тех пор пока список $ftp_bots не закончится.

3. Таблицы, фаерволы … что это и как оно работает?
Теперь про таблицы и фаервол. В качестве фаервола — PF. Обожаю его, простой как двери и достаточно функциональный. В нем есть 2 таблицы — bots и bruteforce. В таблицу bots я закидываю «особо отличившихся» красавчиков. Эта таблица блочится для мира начисто:

block in log quick on $INET_IF from <bots> to any

Для тех же кто просто балуется брутфорсиком — есть табличка bruteforce для ip которой фаерволом имитируются потери в канале 99%

block in log quick on $INET_IF from <bruteforce> to any probability 99%

4. А если этих самых ботов тыщи???
Ну и чтобы не копить себе IP злоумышленников до бесконечности (они всетаки захламляют RAM) — по cron периодически очищаем табличку bruteforce от старых записей. Я настроил на очистку записей старше 86400 секунд, тоесть даю боту сутки на то чтоб подумал надо своим поведением. Также по крону запускаю скрипт ftp_bots.sh каждые 5 минут.

root@black:~# crontab -l
MAILTO=""
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#### <- For clean entries from table SSH BRUTEFORCE older than 1 day ! -> ####
52      *       *       *       *       /sbin/pfctl -t bruteforce -T expire 86400
#### <= FTP bots => ####
*/5     *       *       *       *       /root/scripts/ftp_bots.sh

root@black:~#

5. А зачем нам лог в скрипте? С ним что делать?
Ну и на последок, так выглядит log файл. Его можно глянуть в случай если вам ктото позвонил и грозно заявил что «сервер перестал видеться в сети …». Там можно найти кого в последнее время банили чтобы оперативно розбанить:

root@black:~# cat /var/log/ftp_ban.log
2014-06-03 11:15:20 --- Banned IP --- 109.186.76.161
2014-06-03 19:45:00 --- Banned IP --- 199.193.71.123
2014-06-03 19:00:00 --- Banned IP --- 186.205.53.223
2014-06-03 19:00:00 --- Banned IP --- 91.121.195.189
2014-06-03 19:05:00 --- Banned IP --- 59.58.139.120
2014-06-04 12:25:00 --- Banned IP --- 109.186.76.161
2014-06-04 20:00:00 --- Banned IP --- 199.193.71.123
2014-06-04 20:55:00 --- Banned IP --- 186.205.53.223
2014-06-04 20:55:01 --- Banned IP --- 91.121.195.189
2014-06-04 20:55:01 --- Banned IP --- 59.58.139.120
root@black:~#

Пробуйте … пишите комменты, замечания и т.д.
P.S. Некоторые в таких случаях еще заявляют — а как же клиенты за NAT, многопользовательские сети/сервера и прочее. IP залочен одним нехорошим клиентом — остальная масса пользователей за NAT тоже получается залочены. Мой ответ прост — да мне пофигу! Мой сервер, мой ресурс и мое решение. Если какойто Вася поймал вирь и от этого 200 клиентов рядом с ним перестали видеть мой сервер — мне жаль их 🙂 Пусть почитают с соседнего сервера статью про маленьких пушистых котиков …

Хай щастить!

Настройка nginx + GeoIP на FreeBSD

Зачем это надо? Да много чего можно наворотить! Например разным странам выдавать разный контент, проксировать трафик на разные сервера и тд. Мне, например, для ограничения нежелательного трафика на некий тестовый web-сервер. Хочу дать туда доступ только из Украины, остальных — в баню!
У меня уже был установлен и настроен nginx, поэтому тут упомяну только о включении в его сборку необходимого модуля.
Для начала я установил GeoIP из портов:

root@gw:~# cd /usr/ports/net/GeoIP
root@gw:/usr/ports/net/GeoIP# make install clean

После этого проверил стоит ли в собранном ранее nginx необходимый флаг HTTP_GEOIP:

root@gw:/usr/ports/net/GeoIP# cd /usr/ports/www/nginx
root@gw:/usr/ports/www/nginx# make config

Читать полностью

FreeBSD — настройка bacula с SSL шифрованием трафика

Сначала чуть данных из wiki
Bacula — кроссплатформенное клиент-серверное программное обеспечение, позволяющее управлять резервным копированием, восстановлением, и проверкой данных по сети для компьютеров и операционных систем различных типов.
Итак, это то что мне нужно! Более подробно рассмотрим из чего состоит bacula, это даст больше понимания о том как она работает.
Director (DIR) — осуществляет централизованный контроль и администрирование всего комплекса задач. Планирование и управление заданиями на резервное копирование (Job). Обслуживание Каталога (Catalog) — центральной БД для хранения метаданных.
File Daemon (FD) — сервис, выполняющий непосредственное копирование, восстановление и проверку данных по запросу Director. File Daemon должен быть установлен на каждой клиентской машине. File Daemon обменивается информацией с Director и Storage Daemon.
Storage Daemon (SD) — читает и пишет данные на физический носитель: диск, ленту, DVD, USB.
Console — управляющая консоль оператора или администратора. Поддерживаются ACL для разных пользователей консоли. Типы консолей: TTY, wxWidgets (GUI) для Linux, Unix, Win32, GNOME (GUI), несколько веб-интерфейсов, Qt4.
Catalog database — база данных SQL : MySQL, PostgreSQL, или SQLite для хранения метаданных.
Tray Monitor — апплет GNOME/KDE/Win32 GUI для показа активности Director, File daemons, Storage daemon в реальном времени.

Вот как выглядит работа настроенной системы:
Bacula applications

Что такого уникального я опишу в данной статье? Зачем она вообще нужна? Такие вопросы лезли мне в голову когда я брался это писать.
Хочу написать, в первую очередь для себя! Дело в том что данную систему я настраивал уже 3 раза и каждый раз рассчитывал на то что «нагуглю» рецепт и спокойненько настрою, тем более что в голове уже есть понимание что к чему. Но каждый раз было одно и тоже — все рецепты в сети оказывались для меня непригодны по разным причинам.
Сразу скажу, эта заметка не подходит для тех кто будет настраивать систему первый раз не имея понимания «что это и как его едят». Делаю для себя чтоб в следующий раз заюзать по принципу «Ctrl + C, Ctrl + V» потом минимально подправил и «поехали». Тут нету разжеванных опций и подробных описаний, за этим либо в google либо на официальный сайт в документацию.

Чего мы хотим?
Я хочу не так много — бекапить сервера через сеть Интернет с шифрованием трафика. Просто звучит, но чтоб настроить придется поработать 🙂

Что нужно подготовить перед тем как взяться за настройку? Многое … пойдем по порядку.
1. Определим кто есть кто! Сразу оговорюсь что все сервера у меня под FreeBSD. Но для Linux статья вполне сойдет, только обратите внимание на пути к директориям/файлам. Также отмечу, что у меня 2 физических сервера, поэтому на одном будет DIR + SD, а второй будет FD (его будем бэкапить). В дальнейшем данное решение абсолютно просто масштабируется. Я опишу это в конце заметки.

dir1.domain.ua — директор, тут же будет расположен каталог (БД mysql)
sd1.domain.ua — сторадж, тут будут храниться бэкапы в виде файлов (pools) на HDD
fd1.domain.ua — клиент, это та машина которую мы будем бэкапить

Эти имена должны правильно резолвиться на любой из данных ПК. Это можно реализовать либо создав соответствующие записи в DNS в виде host A либо просто прописать в /etc/hosts

Например на каждой машине прописать в /etc/hosts

111.111.111.111 dir1.domain.ua sd1.domain.ua
111.111.222.222 fd1.domain.ua

Проверить с помощью ping связь между собой для каждого хоста.

2. Определиться какие части системы на каких хостах (серверах) будут установлены. У меня будет так:
111.111.111.111 — директор (DIR) + БД MySQL (Catalog) + сторадж демон (SD) + консоль управления (Console)
111.111.222.222 — клиент (FD)

3. Настроить фаервол. Если он есть то необходимо открыть порты на вход/выход для хостов:
Console -> DIR:9101
DIR -> SD:9103
DIR -> FD:9102
FD -> SD:9103

4. На директоре установить и настроить MySQL. Я писал об этом ранее, вполне подойдет и для этой задачи.

5. Сгенерить необходимые SSL сертификаты. Этот процесс я также описывал ранее.
Важно! В процессе генерации не забываем прописывать корректно параметр Common Name (eg, YOUR name) Прописывать туда нужно FQDN сервера для которого данный сертификат генерится. Например в процессе генерации запроса на сертификат для сервера fd1.domain.ua параметр Common Name будет fd1.domain.ua Это очень важно!

6. Скопировать сертификаты на хосты. Создаем директорию /usr/local/etc/bacula-ssl и копируем (rsync, scp) туда сертификаты таким образом:
DIR, SD — ca.crt, dir1.crt, dir1.key, sd1.crt, sd1.key
FD — ca.crt, fd1.crt, fd1.key

7. Установить порты (напомню что я настраиваю на FreeBSD):
dir1.domain.ua (он же sd1.domain.ua) — bacula-server с опциями MYSQL, NLS, OPENSSL
fd1.domain.ua — bacula-client с опциями NLS, OPENSSL
И добавить в rc.conf опции для автозагрузки
На сервере dir1.domain.ua

# <= Bacula => #
bacula_dir_enable="YES"
bacula_sd_enable="YES"

На сервере fd1.domain.ua

# <= Bacula => #
bacula_fd_enable="YES"

8. На сервере dir1.domain.ua настроить в MySQL базу данных для bacula. Для этого есть готовые скрипты, которые нужно выполнить от рута:

root@dir1# /usr/local/share/bacula/grant_mysql_privileges
root@dir1# /usr/local/share/bacula/create_mysql_database
Creation of bacula database succeeded.
root@dir1# /usr/local/share/bacula/make_mysql_tables
Creation of Bacula MySQL tables succeeded.
root@dir1#

9. Создать на сервере хранения директорию для бэкапов и дать права :

root@dir1# mkdir -p /home/bacula/pools

И дать права бакуле туда писать/читать:

root@dir1# chown bacula:bacula /home/bacula

10. Ну и собственно сами конфиги, начнем с простого — файл-сервер (FD), это у нас хост fd1.domain.ua
Ранее мы на этом серваке установили bacula-client и настроили его автозапуск.
Также напомню что на сервере уже должны быть сертификаты, у меня они расположены в /usr/local/etc/bacula-ssl:

root@fd1:~# ls -l /usr/local/etc/bacula-ssl/
total 16
-rw-r--r--  1 root  bacula  1655 23 окт 15:38 ca.crt
-rw-r--r--  1 root  bacula  4632 23 окт 15:43 fd1.crt
-rw-r--r--  1 root  bacula  1679 23 окт 15:42 fd1.key
root@fd1:~#

Теперь настроим конфиг:

root@fd1:~# cat /usr/local/etc/bacula/bacula-fd.conf |egrep -v '^#|^$'
Director {
  Name = dir1
  Password = "fd1_5XLGGiNNxLfjMxCcfgLM"
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Verify Peer = yes
  TLS Allowed CN = "fd1.domain.ua"
  TLS Allowed CN = "sd1.domain.ua"
  TLS Allowed CN = "dir1.domain.ua"
}
FileDaemon {
  Name = fd1
  FDport = 9102
  WorkingDirectory = /var/db/bacula
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
  FDAddress = fd1.domain.ua
  Heartbeat Interval = 30 sec
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
Messages {
  Name = Standard
  director = dir1 = all, !skipped, !restored
}
root@fd1:~#

Ну вот, первая ласточка пошла 🙂 УРА! Перегрузите сервис (или запустите) стандартными средствами:

root@fd1:~# service bacula-fd restart

Настройку FD можно считать завершенной! Идем дальше …

11. Дальше чуть сложнее но тоже осилим! Настройка сервера хранения бэкапов (SD) — это у нас хост sd1.domain.ua Напомню что у меня DIR и SD на одном сервере, если у вас на разных, предварительно нужно на SD-сервер скопировать необходимые сертификаты ca.crt, sd1.crt и ключ sd1.key

root@dir1:~# cat /usr/local/etc/bacula/bacula-sd.conf |egrep -v '^#|^$'
Storage {
  Name = sd1
  SDPort = 9103
  WorkingDirectory = "/var/db/bacula"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
  SDAddress = sd1.domain.ua
  Heartbeat Interval = 30 sec
  TLS Enable = yes
  TLS Require = yes
  TLS Verify Peer = no
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Key = /usr/local/etc/bacula-ssl/sd1.key
  TLS Certificate = /usr/local/etc/bacula-ssl/sd1.crt
}
Director {
  Name = dir1
  Password = "sd1_ho6a&teSuA@CC2HnEEgu"
  TLS Enable = yes
  TLS Require = yes
  TLS Verify Peer = yes
  TLS Allowed CN = "fd1.domain.ua"
  TLS Allowed CN = "dir1.domain.ua"
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Key = /usr/local/etc/bacula-ssl/sd1.key
  TLS Certificate = /usr/local/etc/bacula-ssl/sd1.crt
}
Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /home/bacula/pools
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}
Messages {
  Name = Standard
  director = dir1 = all
}
root@dir1:~#

Перегрузите сервис (или запустите) стандартными средствами:

root@dir1:~# service bacula-sd restart

Настройку SD можно считать завершенной! Идем дальше …

12. Настроим директор (DIR) — это основная часть системы. Тут будет много всяких параметров, углубляться не буду, для этого есть официальные доки. Вот что у меня:

root@dir1:~# cat /usr/local/etc/bacula/bacula-dir.conf |egrep -v '^#|^$'
Director {
  Name = dir1
  DIRport = 9101
  QueryFile = "/usr/local/share/bacula/query.sql"
  WorkingDirectory = "/var/db/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 1
  Password = "dir1_Ag@6Uzp8tHUW6PuRumc"
  Messages = Daemon
  DirAddress = dir1.domain.ua
  Heartbeat Interval = 30 sec
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/dir1.crt
  TLS Key = /usr/local/etc/bacula-ssl/dir1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
  TLS Verify Peer = yes
  TLS Allowed CN = "fd1.domain.ua"
  TLS Allowed CN = "sd1.domain.ua"
  TLS Allowed CN = "dir1.domain.ua"
}
Job {
  Name = "RestoreFiles"
  Type = Restore
  Client=fd1                
  FileSet="Full Set"                  
  Storage = sd1                      
  Pool = Default
  Messages = Standard
  Where = /tmp/bacula-restores
}
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
    }
    File = /usr/local/sbin
  }
  Exclude {
    File = /var/db/bacula
    File = /tmp
    File = /proc
    File = /tmp
    File = /.journal
    File = /.fsck
  }
}
Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sun at 23:05
  Run = Differential 2nd-5th sun at 23:05
  Run = Incremental mon-sat at 23:05
}
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 23:10
}
FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/db/bacula/bacula.sql"
  }
}
Storage {
  Name = sd1
  Address = sd1.domain.ua                # Use ONLY a FQDN here
  SDPort = 9103
  Password = "sd1_ho6a&teSuA@CC2HnEEgu"
  Device = FileStorage
  Media Type = File
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
Catalog {
  Name = MyCatalog
  dbname = "BACULA_DB"; DB Address = "127.0.0.1"; dbuser = "BACULA_USER"; dbpassword = "bacula_db_password"
}
Messages {
  Name = Standard
  mailcommand = "/usr/local/sbin/bsmtp -h localhost -f "\(Bacula\) \<%r\>" -s "Bacula: %t %e of %c %l" %r"
  operatorcommand = "/usr/local/sbin/bsmtp -h localhost -f "\(Bacula\) \<%r\>" -s "Bacula: Intervention needed for %j" %r"
  mail = admin@domain.ua = all, !skipped            
  operator = admin@domain.ua = mount
  console = all, !skipped, !saved
  append = "/var/log/bacula.log" = all, !skipped
  catalog = all
}
Messages {
  Name = Daemon
  mailcommand = "/usr/local/sbin/bsmtp -h localhost -f "\(Bacula\) \<%r\>" -s "Bacula daemon message" %r"
  mail = admin@domain.ua = all, !skipped            
  console = all, !skipped, !saved
  append = "/var/log/bacula.log" = all, !skipped
}
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365 days         # one year
}
Pool {
  Name = File
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 90 days          # 90 days
  Maximum Volume Bytes = 50G          # Limit Volume size to something reasonable
  Maximum Volumes = 100               # Limit number of Volumes in Pool
}
Pool {
  Name = Scratch
  Pool Type = Backup
}
Console {
  Name = mon
  Password = "console_"
  CommandACL = status, .status
}
@/usr/local/etc/bacula-fd1.conf
root@dir1:~#

Что такого необычного мы видим в этом конфиге? Да ничего особенного, все просто «как двери». В конце данного конфига включен дополнительный файл настроек, в котором прописаны уникальные настройки для fd1.

13. И наконец конфиг бэкапа для fd1, тот что /usr/local/etc/bacula-fd1.conf

root@dir1:~# cat /usr/local/etc/bacula-fd1.conf |egrep -v '^#|^$'
Job {
    Name = "www-backup"
    Type = Backup
    Level = Full
    Client = fd1
    FileSet = "www Set"
    Schedule = "WeeklyCycle_www"
    Messages = Standard
    Pool = www-pool
    Full Backup Pool = www-pool-FULL
    Differential Backup Pool = www-pool-DIFF
    Incremental Backup Pool = www-pool-INCR
    Write Bootstrap = "/var/db/bacula/www-fd1.bsr"
    Priority = 3
}
FileSet {
  Name = "www Set"
  Include {
    Options {
      signature = MD5
      compression = GZIP
      recurse = yes
      xattrsupport = yes
    }
    File = /etc
    File = /usr/local/etc
    File = /home/backup
    File = /root
    File = /usr/local/www
    File = /usr/home/user1/htdocs
    File = /usr/home/user2/htdocs
    File = /usr/home/user3/htdocs
  }
  Exclude {
    File = /usr/local/www/apache22/data/somedomain.org.ua/drupal/sites/default/files
  }
}
Schedule {
  Name = "WeeklyCycle_www"
  Run = Level=Full 1st sun at 4:05
  Run = Level=Differential 2nd-5th sun at 4:02
  Run = Level=Incremental mon-sat at 4:07
}
Client {
  Name = fd1
  Address = fd1.domain.ua
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd1_5XLGGiNNxLfjMxCcfgLM"
  File Retention = 45 days
  Job Retention = 6 months
  AutoPrune = yes
  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/fd1.crt
  TLS Key = /usr/local/etc/bacula-ssl/fd1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
Pool {
  Name = www-pool
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 65 days        # 65 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-vol"
  Storage = sd1
}
Pool {
  Name = www-pool-FULL
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 60 days        # 60 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-FULL-vol"
  Storage = sd1
}
Pool {
  Name = www-pool-DIFF
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 60 days        # 60 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-DIFF-vol"
  Storage = sd1
}
Pool {
  Name = www-pool-INCR
  Pool Type = Backup
  Recycle = yes                     # Bacula can automatically recycle Volumes
  AutoPrune = yes                   # Prune expired volumes
  Volume Retention = 60 days        # 60 days
  Recycle Oldest Volume = yes
  Maximum Volume Bytes = 4400m      # Limit Volume size to something reasonable
  Maximum Volumes = 7               # Limit number of Volumes in Pool
  Label Format = "www_pool-INCR-vol"
  Storage = sd1
}
root@dir1:~#

Как видим, тут описано само задание на бэкап (Job), также описан FileSet — собственно те файлы/папки которые хотим бэкапить, время/день недели когда делаются бэкапы Shedule, а также пулы. Все относительно просто, для детального описания каждой опции смотрите официальную документацию.

Перегрузите сервис (или запустите) стандартными средствами:

root@dir1:~# service bacula-dir restart

Настройку DIR можно считать завершенной! Идем дальше …

14. Настроим консоль. Консоль я буду пользовать на сервере там же где и директор (dir1). Для настройки рихтуем конфиг:

root@dir1:~# cat /usr/local/etc/bacula/bconsole.conf
#
# Bacula User Agent (or Console) Configuration File
#

Director {
  Name = dir1
  DIRport = 9101
  address = dir1.domain.ua
  Password = "dir1_Ag@6Uzp8tHUW6PuRumc"

  TLS Enable = yes
  TLS Require = yes
  TLS Certificate = /usr/local/etc/bacula-ssl/dir1.crt
  TLS Key = /usr/local/etc/bacula-ssl/dir1.key
  TLS CA Certificate File = /usr/local/etc/bacula-ssl/ca.crt
}
root@dir1:~#

Настройку консоли можно считать завершенной.

15. Тестируем! Для этого на сервере dir1.domain.ua запускаем в root-овой консоли bconsole:

root@dir1:~# bconsole
Connecting to Director dir1.domain.ua:9101
1000 OK: dir1 Version: 5.2.12 (12 September 2012)
Enter a period to cancel a command.
*

Видим что вошли в консоль. Тут куча всяких возможностей, можно проверить статус всех компонентов командой (у меня выхлоп с рабочей системы, у вас будет покороче — не пугайтесь):

*status all
dir1 Version: 5.2.12 (12 September 2012) i386-portbld-freebsd9.0 freebsd 9.0-RELEASE-p3
Daemon started 23-Mar-14 20:36. Jobs: run=4, running=0 mode=0,0
 Heap: heap=0 smbytes=80,026 max_bytes=113,890 bufs=296 max_bufs=327

Scheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup     3  28-Mar-14 04:07    www-backup         Vol_1
====

Running Jobs:
Console connected at 27-Mar-14 11:16
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
====================================================================
   379  Incr        101    6.737 M  OK       18-Mar-14 04:07 www-backup
   380  Incr         27    6.536 M  OK       19-Mar-14 04:07 www-backup
   381  Incr      1,634    18.16 M  OK       20-Mar-14 04:07 www-backup
   382  Incr         18    6.401 M  OK       21-Mar-14 04:07 www-backup
   383  Incr         17    6.402 M  OK       22-Mar-14 04:07 www-backup
   384  Diff         42    18.34 M  Error    23-Mar-14 04:02 www-backup
   385  Incr         27    12.79 M  OK       24-Mar-14 04:07 www-backup
   386  Incr      1,413    15.02 M  OK       25-Mar-14 04:07 www-backup
   387  Incr         22    6.412 M  OK       26-Mar-14 04:07 www-backup
   388  Incr         29    6.863 M  OK       27-Mar-14 04:07 www-backup

====
Connecting to Storage daemon sd1 at sd1.domain.ua:9103

sd1 Version: 5.2.12 (12 September 2012) i386-portbld-freebsd9.0 freebsd 9.0-RELEASE-p3
Daemon started 23-Mar-14 20:36. Jobs: run=4, running=0.
 Heap: heap=0 smbytes=90,823 max_bytes=224,190 bufs=93 max_bufs=113
 Sizes: boffset_t=8 size_t=4 int32_t=4 int64_t=8 mode=0,0

Running Jobs:
No Jobs running.
====

Jobs waiting to reserve a drive:
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
===================================================================
   379  Incr        101    6.755 M  OK       18-Mar-14 04:07 www-backup
   380  Incr         27    6.540 M  OK       19-Mar-14 04:07 www-backup
   381  Incr      1,634    18.39 M  OK       20-Mar-14 04:07 www-backup
   382  Incr         18    6.403 M  OK       21-Mar-14 04:07 www-backup
   383  Incr         17    6.405 M  OK       22-Mar-14 04:07 www-backup
   384  Diff         42    18.14 M  Error    23-Mar-14 04:02 www-backup
   385  Incr         27    12.80 M  OK       24-Mar-14 04:07 www-backup
   386  Incr      1,413    15.22 M  OK       25-Mar-14 04:07 www-backup
   387  Incr         22    6.416 M  OK       26-Mar-14 04:07 www-backup
   388  Incr         29    6.867 M  OK       27-Mar-14 04:07 www-backup
====

Device status:
Device "FileStorage" (/home/bacula/pools) is not open.
====

Used Volume status:
====

====

Connecting to Client fd1 at fd1.domain.ua:9102

fd1 Version: 5.2.12 (12 September 2012)  amd64-portbld-freebsd9.0 freebsd 9.0-RELEASE-p3
Daemon started 20-Mar-14 12:11. Jobs: run=7 running=0.
 Heap: heap=0 smbytes=23,861 max_bytes=372,763 bufs=73 max_bufs=215
 Sizeof: boffset_t=8 size_t=8 debug=0 trace=0
Running Jobs:
Director connected at: 27-Mar-14 11:16
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
======================================================================
   379  Incr        101    6.737 M  OK       18-Mar-14 04:07 www-backup
   380  Incr         27    6.536 M  OK       19-Mar-14 04:07 www-backup
   381  Incr      1,634    18.16 M  OK       20-Mar-14 04:07 www-backup
   382  Incr         18    6.401 M  OK       21-Mar-14 04:07 www-backup
   383  Incr         17    6.402 M  OK       22-Mar-14 04:07 www-backup
   384  Diff         42    18.34 M  Error    23-Mar-14 04:02 www-backup
   385  Incr         27    12.79 M  OK       24-Mar-14 04:07 www-backup
   386  Incr      1,413    15.02 M  OK       25-Mar-14 04:07 www-backup
   387  Incr         22    6.412 M  OK       26-Mar-14 04:07 www-backup
   388  Incr         29    6.863 M  OK       27-Mar-14 04:07 www-backup
====

*

Можно ради интереса запустить бэкап прямо сейчас, не дожидаясь ночного автозапуска (учтите нагрузку на сервер! Если у вас боевой сервер — лучше это делать в момент наименьшей нагрузки … вечером/ночью/рано утром):

*run job=www-backup

И через пару минут опять проверить статус, задание должно быть либо в процессе либо выполнено.

16. И пара слов про восстановление. В случай необходимости восстановить файлы идем в консоль и делаем следующее:

*restore

После чего выбрать те Job в которых находится необходимый вам файл. В случае как у меня, когда делается full бэкап раз в месяц, а каждый день либо diff либо incremental — нужно выбирать все Job-ы от full и до последнего Incremental-а. Дальше все просто, следуйте указаниям мастера восстановления.

Что делать если хотим добавить еще один FD в эту систему?
Да все проще простого:
— на новом сервере fd2 установить bacula-client и настроить также как описано выше для fd1
— на сервере dir1 копируем файлик настроек FD /usr/local/etc/bacula-fd1.conf в какойнить /usr/local/etc/bacula-fd2.conf
— генерим для fd2.domain.ua сертификат и ключ
— прописываем FileSet в новом конфиге и меняем пароль/сертификаты. По желанию можно по-другому назвать пулы или перестроить время бэкапа
Вот собственно, и все. 5 минут работы и сервак добавлен в систему. Просто? Ато!
Так же просто «перенести» SD на другую железку. Или подключить второй SD, для того чтобы разные FD бэкапить на разные SD. Система очень гибко настраивается — это дополнительный плюс.

P.S. Получилось не очень стройно, както сумбурно и не особо детально. Но статья рассчитана скорее на человека который уже имеет понимание и просто хочет «по быстрому подкинуть конфиги» и с минимальными правками стартонуть систему, а не на тех кто совсем с нуля осваивается. Можно конечно и с нуля разобраться, но придется изрядно поглядеть в официальные доки.

Mysql server на FreeBSD

Очень часто в различных проэктах используется БД mysql. Я хочу показать как я инсталлирую ее на примере своего домашнего сервера под FreeBSD 9.2
Установку я делал из портов:

root@gw:~# cd /usr/ports/databases/mysql56-server
root@gw:~# make install clean

Автозапуск при старте системы нужно прописать в rc.conf

root@gw:~# echo 'mysql_enable="YES"' >> /etc/rc.conf

Основной конфигурационный файл mysql-server в FreeBSD находится тут /var/db/mysql/my.cnf
Я сгенерил свой конфиг с помощью online конфигуратора от percona (ссылка есть в шапке конфига). В конфигураторе вводил что у меня 2GB RAM и честный сервер (не виртуалка). А также указал что это будет Slave-сервер, поэтому ID = 11. Вот что получилось в итоге:

# Generated by Percona Wizard (http://tools.percona.com/)
# Configuration name home generated for admin@somedomain.net.ua

[mysql]

# CLIENT #
port                           = 3306
socket                         = /tmp/mysql.sock

[mysqld]

# GENERAL #
user                           = mysql
default-storage-engine         = InnoDB
socket                         = /tmp/mysql.sock
pid-file                       = /var/db/mysql/mysql.pid

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

# SAFETY #
max-allowed-packet             = 16M
max-connect-errors             = 1000000

# DATA STORAGE #
datadir                        = /var/db/mysql/

# BINARY LOGGING #
log-bin                        = /var/db/mysql/mysql-bin
binlog_format                  = mixed
expire-logs-days               = 7
sync-binlog                    = 1

# REPLICATION #
server-id                      = 11
log-slave-updates              = 1
relay-log                      = /var/db/mysql/relay-bin
slave-net-timeout              = 60
sync-master-info               = 1
sync-relay-log                 = 1
sync-relay-log-info            = 1

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
max-connections                = 500
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 1024
table-open-cache               = 2048

# INNODB #
innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 128M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 1024M

# LOGGING #
log-error                      = /var/db/mysql/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /var/db/mysql/mysql-slow.log

Итак, конфиг есть — запускаем mysql-server так:

root@gw:~# service mysql-server start

Убедиться что он работает можно по логам — /var/db/mysql/mysql-error.log или командой:

root@gw:~# sockstat |grep mysql
mysql    mysqld     74112 16 tcp4 6 *:3306                *:*
mysql    mysqld     74112 18 stream /tmp/mysql.sock
root@gw:~#

FreeBSD 9.x — обновление perl5.12 или perl5.14 до 5.16 … 5.18

Увидел при очередном обновлении портов что версия Perl5.14 уже считается старой и рекомендацию обновиться.
Как любой порядочный фряшник, полез читать что пишут по этому поводу в /usr/ports/UPDATING и вот что нашел:

20131120:
  AFFECTS: users of lang/perl5.12 lang/perl5.14 lang/perl5.16 and lang/perl5.18
  AUTHOR: mat@FreeBSD.org

  The THREADS option has been enabled by default in all Perl. If you're using
  binary packages you need to do :

    # pkg install -Rf perl5

  If you'
re not using binary packages, and want to switch from non threaded
  Perl to threaded Perl, you need to recompile and reinstall most ports
  depending on Perl. Supposing you have Perl 5.16, you would do:

  Portupgrade users:
    0) Fix pkgdb.db (for safety):
        pkgdb -Ff

    1) Change the option in lang/perl5.16:
        make -C /usr/ports/lang/perl5.16 config

    2) Reinstall everything that depends on Perl:
        portupgrade -fr lang/perl5.16

  Portmaster users:
    1) Change the option in lang/perl5.16:
        make -C /usr/ports/lang/perl5.16 config

    2) Reinstall everything that depends on Perl:
        portmaster -r perl5-

  Note: The installed Perl package was named perl and is now named perl5, if
        you have not updated your installation in a long time, you may need to
        use "perl-" here.

Но проделав все пункты для portupgrade ничего в результате не обновилось, вообще ничего толкового не произошло. Версия Perl осталась прежней — 5.14. Читать полностью