Использование Bacula для файлов с контекстом безопасности

Редактировал(а) Владимир Белянкин 2021/09/28 13:41

Bacula – это система централизованного резервирования информационных ресурсов, основными преимуществами которой являются:

  • возможность функционирования в гетерогенных средах;
  • централизованное управление как в текстовом, так и в графическом режимах;
  • обеспечение высокого уровня безопасности резервных копий;
  • поддержка широкого спектра оборудования (ленточные библиотеки и т.д.).

Реализована как сетевая клиент-серверная программа для резервного копирования, архивирования и восстановления. Предлагая широкие возможности для управления хранилищами данных, облегчает поиск и восстановление потерянных или поврежденных файлов. Благодаря модульной структуре, Bacula масштабируется и может работать как на маленьких, так и на крупных системах, состоящих из сотен компьютеров, расположенных в большой сети.

Система резервирования данных Bacula состоит из четырех основных элементов: Director Daemon, Storage Daemon, File Daemon и Bacula Console. Все эти элементы реализованы в виде самостоятельных приложений.

Director Daemon (DD) – это центральный элемент системы, осуществляющий управление ее остальными компонентами. В его задачи входит управление процессом резервирования/восстановления данных, обеспечение интерфейса управления для администраторов и многое другое. Говоря проще – это диспетчер, который инициирует все процессы и отслеживает ход их выполнения.

Storage Daemon (SD) – приложение, отвечающее за чтение/запись данных непосредственно на устройства хранения информации. Принимает управляющие команды от DD, а также резервируемые данные от/к File Daemon.

File Daemon (FD) – этот элемент еще можно назвать Агентом. Ведь именно он работает в рамках ОС, данные которой необходимо резервировать. File Daemon выполняет всю рутину, осуществляя обращение к резервируемым файлам и их дальнейшую передачу к SD. Также на стороне FD выполняется шифрование резервных копий, если это определено конфигурацией.

Bacula Console (BC) – интерфейс администратора сиcтемы. По своей сути, это командный интерпретатор для управления Bacula. Строго говоря, Bacula Console может быть расширена с помощью графических систем управления, которые, как правило, являются всего лишь надстройкой над BC. К таким системам можно отнести Tray Monitor и Bat. Первая устанавливается на компьютере администратора системы и осуществляет наблюдение за работой системы резервирования, а вторая обеспечивает возможность управления посредством графического интерфейса.

Bacula Catalog – БД, в которой хранятся сведения обо всех зарезервированных файлах и их местонахождении в резервных копиях. Каталог необходим для обеспечения эффективной адресации к требуемым файлам. Поддерживаются MySql, PostgreSql и SqLite.

Такое структурное деление позволяет организовать очень гибкую систему резервирования, когда Storage Daemon разворачивается на выделенном сервере с несколькими устройствами хранения данных. Также Bacula Director может управлять несколькими экземплярами SD, обеспечивая резервирование части данных на одно устройство хранения, а части – на другое.

Все указанные компоненты могут находиться как на одном компьютере, так и на нескольких, объединенных в сеть.

Программа Bacula обеспечивает поддержку сохранения расширенных атрибутов каталогов и файлов и, при необходимости, их последующее восстановление.

Далее описан пример настройки комплекса программ Bacula.

Все действия выполняются от имени учетной записи администратора с использованием механизма sudo.

В примере использована следующая инфраструктура:

  • выделенный сервер dd.ex.net с IP-адресом 10.0.0.10 (на нем будет
    функционировать Director Daemon – это главный сервер, осуществляющий резервное копирование);
  • выделенный сервер sd.ex.net с IP-адресом 10.0.0.20 (на нем будет функционировать Storage Daemon – это машина, на которой будут размещаться резервные копии данных);
  • персональный компьютер fd.ex.net с IP-адресом 10.0.0.30 (на нем будет функционировать File Daemon – это машина, с которой будут копироваться данные и на которую будут восстанавливаться резервные копии данных).

Подготовка инфраструктуры для управления системой резервного копирования выполняется следующим образом:

1) установить Postgresql на сервер, где будет работать Director Daemon:

sudo aptitude install postgresql-9.6

2) предполагается, что на всех машинах изначально установлены все пакеты, касающиеся Bacula, из состава ОС. C помощью менеджера пакетов Synaptic по ключевому слову «bacula» установить все пакеты, кроме тех, где в названии фигурирует «-sqlite3»:

  • bacula-bscan
  • bacula-common
  • bacula-common-pgsql
  • bacula-console
  • bacula-director
  • bacula-director-pgsql
  • bacula-fd
  • bacula-sd
  • bacula-server

Также должен быть установлен пакет attr:

sudo aptitude install attr

При настройке Bacula появится интерфейс для настройки совместимости с БД, в качестве имени базы указать bacula и пароль bacula.

При настройке базы Bacula может произойти ошибка, на данном этапе необходимо ее игнорировать, база будет настроена позже.

П р и м е ч а н и е. Далее в любом случае созданная БД будет перенастроена.

3) подготовить БД для Bacula, для чего:

  • в файле /etc/postgresql/9.6/main/postgresql.conf параметру listen_addresses= присвоить значение '*';
  • в файле /etc/postgresql/9.6/main/pg_hba.conf внести необходимые изменения, для простоты можно указать метод trust для всех соединений, удалить любую дополнительную конфигурацию после метода типа mod=;
  • обязательно добавить host с IP-адресом, где будет работать Director Daemon. В случае если все демоны Bacula будут установлены на одну машину, указывать IP-адрес не обязательно, т.к. работа будет идти через localhost.

Пример файла pg_hba.conf:

local all postgres trust
local all all trust
host all all 127.0.0.1/32 trust
host all all 10.0.0.1/24 trust
  • присвоить пароль postgres:
sudo passwd postgres
  • присвоить для Bacula пароль bacula:
sudo passwd bacula
  • выполнить перезапуск БД:
sudo pg_ctlcluster 9.6 main restart
  • cоздать пользователя БД для работы с Bacula и настроить ему привилегии (выполнять не от имени учетной записи администратора):
# psql template1 -U postgres -h 10.0.0.10

template1=# CREATE ROLE bacula;

template1=# ALTER USER bacula PASSWORD 'bacula';

template1=# ALTER USER bacula LOGIN SUPERUSER CREATEDB CREATEROLE;
  • не завершая работу с интерпретатором psql создать БД и присвоить ей владельца:
template1=# CREATE DATABASE bacula;

template1=# ALTER DATABASE bacula OWNER TO bacula;

4) на сервере dd.ex.net запустить скрипты, которые создадут все необходимые таблицы и привилегии:

  • в скрипте /usr/share/bacula-director/make_postgresql_tables внести изменения:
db_name=${db_name:-bacula}
psql -U bacula -h 10.0.0.10 -f - -d ${db_name} $* <<END-OF-DATA
  • в скрипте /usr/share/bacula-director/grant_postgresql_privileges внести изменения:
db_user=${db_user:-bacula}
bindir=/usr/bin
db_name=${db_name:-bacula}
db_password=bacula
if [ "$db_password" != "" ]; then
pass="password '$db_password'"
fi
$bindir/psql -U bacula -h 10.0.0.10 -f - -d ${db_name} $* <<END-OF-DATA
  • сохранить изменения и выполнить скрипты:
make_postgresql_tables

grant_postgresql_privileges

5) на машине, где будет работать Storage Daemon, необходимо создать каталог /back, в котором будут храниться резервные копии данных, и присвоить каталогу владельца bacula:

sudo mkdir /back

sudo chown -R bacula /back

6) на машине, где будет работать File Daemon, необходимо создать каталог /etc2, в который будут восстанавливаться данные из резервной копии:

sudo mkdir /etc2

Если подготовительные настройки выполнены корректно, БД стартует без ошибок и скрипты выполнились без ошибок, то можно приступить к настройке Bacula.

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

Далее приступить к настройке Director Daemon в конфигурационном файле /etc/bacula/bacula-dir сервера dd.ex.net. В первую очередь определить основные параметры в секции Director. На начальном этапе важно установить параметры Name и Password. Name задает уникальное имя Director Daemon, а Password - пароль, который будет использоваться при соединениях BC с DD. Остальные параметры можно оставить в значениях по умолчанию.

Director { # define myself
Name = bacula-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = "/etc/bacula/scripts/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run/bacula"
Maximum Concurrent Jobs = 1
Password = "1" # Console password
Messages = Daemon
DirAddress = 10.0.0.10
}

Следующей группой параметров, которые необходимо определить, является секция Catalog. Здесь необходимо указать реквизиты доступа к БД, а также назначить уникальное имя данного Bacula Catalog с помощью параметра Name.

Catalog {
Name = MyCatalog
# Uncomment the following line if you want the dbi
PS. driver
# dbdriver = "dbi:sqlite3"; dbaddress = 127.0.0.1; dbport =
dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula"
DB Address = 10.0.0.10
}

Определить SD, на который будет производиться передача данных для дальнейшей записи на устройство хранения. Storage Daemon настроен и готов к работе, необходимо определить реквизиты доступа к нему в секции Storage файла bacula-dir.conf. Основные параметры:

1) Name – уникальное имя, использующееся для адресации секции Storage в рамках файла bacula-dir.conf;

2) Device и MediaType дублируют одноименные параметры файла bacula-sd.conf;

3) Password содержит пароль, который будет использоваться при подключении к Storage Daemon.

Storage {
Name = File
# Do not use "localhost" here
Address = 10.0.0.20 # N.B. Use a fully qualified name here
SDPort = 9103
Password = "1"
Device = FileStorage
Media Type = File
}

Секция Pool определяет набор носителей информации и параметры, определяющие то, как SD будет их обрабатывать. Каждый Pool взаимодействует с устройством хранения данных, и поэтому необходимо создать столько же пулов, сколько определено устройств хранения. Фактически если для каждого File Daemon вы определяете отдельное устройство, то для каждого FD необходимо определить и Pool. Основные параметры:

1) Name определяет уникальное имя пула;

2) Pool Type определяет тип, и для резервных копий должен быть установлен в значение Backup;

3) Maximum Volume Jobs рекомендуется установить в значение 1. Это будет означать, что в рамках одного носителя данных могут быть размещены резервные данные, полученные в ходе выполнения только одного задания. Носитель данных - это устройство, на которое непосредственно записываются данные (оптические диски, магнитные ленты). Если размер созданной резервной копии много меньше размера носителя, то имеет смысл сохранить на него и другие копии, которые будут создаваться в будущем. Но если говорится о файлах, то желательно придерживаться правила «один файл - одна копия», т.е. в одном файле Bacula должны храниться резервные данные, которые были сформированы в рамках выполнения одного задания. Для каждого последующего будут создаваться новые файлы;

4) Volume Retention – время, по прошествии которого, данные о резервной копии, хранящейся на носителе, будут удалены из каталога. Для обеспечения работоспособности Bacula необходимо помнить о том, что информация обо всех зарезервированных файлах хранится в БД, по записи на каждый файл. Если резервируются тысячи файлов, то очень скоро БД станет огромной, что может затруднить работу Bacula. Поэтому очень важно своевременно очищать базу от устаревшей информации. При этом сам носитель информации не будет очищен автоматически. Он
будет промаркирован как устаревший, но всегда можно будет использовать его для восстановления данных в ручном режиме;

5) Maximum Volumes – максимальное количество носителей (в нашем случае файлов), доступных в данном пуле. Параметр Recycle указывает на необходимость повторного использования носителей, помеченных как устаревшие. При этом реальная перезапись носителя произойдет лишь в случае, когда свободных носителей не останется. Свободные носители определяются из параметра Maximum Volumes;

6) AutoPrune указывает на необходимость удаления устаревших записей из Bacula Catalog автоматически после завершения выполнения очередного задания;

7) Label Format определяет префикс, который будет использован Bacula для маркирования носителей информации, в нашем случае – для именования файлов;

8) Storage указывает на имя устройства хранения данных, указанного в параметре Name секции Storage файла bacula-dir.conf.

Pool {
Name = Default
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 1 month # one year
Maximum Volume Jobs = 1
Maximum Volumes = 32
Storage = File
Label Format = "volume-"
}

Секция FileSet позволяет предопределить несколько наборов резервируемых файлов. Например, один набор для Windows, другой – для Linux или один для серверов, а другой – для рабочих станций. Параметр Name определяет уникальное имя набора.

Секция Include содержит пути к резервируемым файлам/каталогам, а Exclude – пути к файлам и каталогам, которые необходимо исключить из списка резервируемых. В секции Include возможна секция Options, в которой определяются параметры резервирования. Основные параметры:

1) signature указывает алгоритм вычисления контрольных сумм файлов;

2) compression указывает алгоритм компрессии файлов;

3) recurse указывает на необходимость рекурсивного резервирования, включая подкаталоги и файлы;

4) File указывает на каталог, который копируется;

5)  xattrsupport указывает на возможность включения поддержки расширенных атрибутов, это обязательный параметр для работы с мандатными метками.

FileSet {
Name = "Catalog"
Include {
Options {
signature = MD5
compression = GZIP
# recurse = yes
aclsupport = yes
xattrsupport = yes
}
File = /etc
}
}

Все настройки связываются воедино с помощью секции Job, в которой дается задание планировщику по выполнению резервирования данных. Основные параметры:

1) Type указывает на тип задания. Типов существует несколько. Здесь достаточно указать Backup;

2) Schedule указывает на предопределенное расписание, согласно которому будет выполняться резервирование данных. Все расписания определены здесь же, в файле bacula-dir.conf;

3) Where указывает на каталог, в котором будут восстанавливаться данные из резервной копии;

4) Write Bootstrap указывает путь к файлу, в который будет записываться информация, с помощью которой данные могут быть восстановлены из резервной копии без наличия подключения к Bacula Catalog. Вместо %n будет подставлено значение параметра Name.

Schedule {
Name = "DailyCycle"
Run = Full daily at 16:10
# Run = Differential 2nd-5th sun at 23:05
Run = Incremental mon-sat at 23:05
}
Job {
Name = "RestoreFiles"
Type = Restore
Client= bacula-fd
FileSet="Catalog"
Storage = File
Pool = Default
Messages = Standard
Where = /etc2
}
Job {
Name = "BackupCilent1"
Type = Backup
Client = bacula-fd
FileSet = "Catalog"
Schedule = "DailyCycle"
Messages = Standard
Pool = Default
Write Bootstrap = "/var/lib/bacula/Client1.bsr"
Priority = 1
}

Указать параметры единственного Агента.

Client {
Name = bacula-fd
Address = 10.0.0.30
FDPort = 9102
Catalog = MyCatalog
Password = "1" # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}

Закомментировать все остальные секции: Job, JobDefs, Client и Console, на данном этапе они не понадобятся. Трафик данных будет идти по тем портам, которые указаны в конфигурационных файлах каждого из компонентов Bacula.

Далее настроить доступ к DD со стороны Bacula Console в файле /etc/bacula/bconsole.conf сервера dd.ex.net:

Director {
Name = bacula-dir
DIRport = 9101
address = 10.0.0.10
Password = "1"
}

На машине, где будет Director Daemon удалить пакеты bacula-sd и bacula-fd:

sudo apt-get remove bacula-sd

sudo apt-get remove bacula-fd

Конфигурационные файлы bacula-sd и bacula-fd в /etc/bacula следует либо переименовать, либо удалить. Сервисы bacula-sd и bacula-fd следует остановить:

sudo systemctl stop bacula-sd

sudo systemctl stop bacula-fd

Далее начать подготовку Storage Daemon, который будет отвечать за непосредственную работу с устройством хранения данных. Bacula поддерживает широкий спектр устройств, начиная от оптических дисков и заканчивая полнофункциональными ленточными библиотеками. Например, самый распространенный вариант – обычный жесткий диск с существующей ФС (например, ext3). Итак, на сервере sd.ex.net необходимо отредактировать файл /etc/bacula/bacula-sd.conf. В секции основных параметров – Storage необходимо определить параметр Name, который задает уникальное имя Storage Daemon. Остальные параметры можно оставить в значениях по умолчанию.

Секция Director необходима для указания уникального имени DD и пароля, с которым этот DD может подключаться к SD. Секций может быть несколько, что дает возможность использовать единый сервер хранения данных для нескольких систем резервирования. Все остальные секции Director, найденные в файле, закомментировать.

Storage { # definition of myself
Name = bacula-sd
SDPort = 9103 # Director’s port
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
SDAddress = 10.0.0.20
}
Director {
Name = bacula-dir
Password = "1"
}

Но основные настройки, определяющие взаимодействие с устройствами хранения, находятся в секции Device. Ниже приведены параметры, необходимые для хранения резервных копий в рамках существующей ФС, подключенной в каталог /back:

1) Name определяет уникальное имя подключенного устройства. Если планируется создавать изолированные друг от друга резервные копии для каждого из File Daemon, то необходимо создать несколько секций Device с уникальными именами. В противном случае резервируемые файлы со всех FD будут размещаться в одном и том же файле, что может затруднить дальнейшее обслуживание системы;

2) Media Type определяет произвольное уникальное имя, которое будет использоваться Bacula при восстановлении данных. Согласно ему определяется устройство хранения, с которого будет производиться восстановление. Если резервные копии хранятся в файлах, то для каждой секции Device должен быть задан уникальный Media Type;

3) Archive Device указывает путь к файлу устройства в каталоге /dev или путь к каталогу, в котором будут размещаться резервные копии;

4) Device Type определяет тип устройства. Для размещения в существующей ФС указывается File;

5) Random Access указывает на возможность случайной (непоследовательной) адресации. Для файлов указывается Yes;

6) RemovableMedia указывает, возможно ли извлечение устройства хранения. Необходимо для ленточных устройств, приводов оптических дисков и т.д.

Для файлов устанавливается в значение No. Параметр LabelMedia указывает на необходимость автоматического маркирования носителей информации.

Device {
Name = FileStorage
Media Type = File
Archive Device = /back
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}

Для базовой настройки этого достаточно.

На машине, где будет Storage Daemon, удалить пакет bacula-fd:

sudo apt-get remove bacula-fd

Конфигурационный файл bacula-fd в /etc/bacula следует либо переименовать, либо удалить. Сервис bacula-fd следует остановить:

sudo systemctl stop bacula-fd

Для настройки File Daemon на рабочей станции fd.ex.net используется файл /etc/bacula/bacula-fd, в котором для базовой настройки достаточно лишь определить параметры секции Director, где указывается пароль, который будет использовать DD при подключении к FD, а также секции FileDaemon, где указываются настройки FD. Все остальные секции Director, найденные в файле, необходимо закомментировать.

Director {
Name = bacula-dir
Password = "1"
}

В секции FileDaemon на данном этапе необходим только параметр Name, в котором указывается уникальное имя File Daemon:

FileDaemon { # this is me
Name = bacula-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 20
FDAddress = 10.0.0.30
}

На машине, где будет File Daemon, удалить пакет bacula-sd:

sudo apt-get remove bacula-sd

Конфигурационный файл bacula-sd в /etc/bacula следует либо переименовать, либо удалить.

Сервис bacula-sd остановить:

sudo systemctl stop bacula-sd

Юнит systemd bacula-fd необходимо скорректировать для корректной работы с мандатным контекстом. Для этого в юните в секции [service] необходимо добавить строку:

NESSCTX="t=CHCTX,SETXATTR_OMITMAC,OMIT"

Далее запустить все компоненты соответствующими командами, данными на соответствующих серверах:

sudo systemctl restart bacula-director

sudo systemctl restart bacula-sd

sudo systemctl restart bacula-fd

После этого Bacula будет работать. Управление Bacula осуществляется через bconsole. Настройки каталогов, заданий, расписаний и прочие задаются в конфигурационных файлах.

Для тестовой проверки необходимо:

  • выполнить bconsole;
  • выполнить run;
  • выбрать job 1;
  • войти в меню, набрав mod;
  • выбрать 1 (Level);
  • выбрать 1 (Full);
  • подтвердить выполнение, набрав yes.

Будет создана резервная копия данных в каталоге /back на машине с Storage Daemon.

Для восстановления объектов ФС с установленными мандатными атрибутами необходимо запустить консоль управления Bacula с необходимыми привилегиями, выполнив команду:

sudo runcon t=CHCTX,SETXATTR_OMITMAC,OMIT bconsole

Для восстановления данных из резервной копии необходимо:

  • выполнить restore;
  • выбрать пункт 12;
  • ввести номер job id;
  • указать параметр маркировки mark *;
  • подтвердить выполнение командой done.

Данные из резервной копии будут восстановлены в каталоге /etc2 на машине с File Daemon.

Также управление Bacula возможно с помощью графической утилиты bacula-console-qt, ее конфигурационный файл расположен в /etc/bacula/bat.

strelets.net
telegram: @os_strelets