Bareos Backup

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Hinweis

Die nachfolgenden Zeilen sollen nicht Bacula/Bareos erklären. Dafür gibt es im Netz eh schon Haufen Zeugs. Das Bacula Buch ist es in jedem Fall wert zu kaufen. Es geht mir einzig darum ein Setup bereitzustellen, mit dem man gleich produktiv arbeiten kann. Lediglich über die Aufbewahrungsfrist etc. muss man sich Gedanken machen ;-)

Client / Server Backup mit Bareos

Lange Zeit habe ich für meine privaten Backups "backup-manager" eingesetzt, welches ein recht flexibles Tool ist und aus Bash/Perl besteht. Im einfachsten Fall erzeugt "backup-manager" von vorher definierten Verzeichnissen eine Tar Datei und überträgt es bei Bedarf auf einen anderen Rechner via Rsync, FTP etc. . Der große Vorteil ist die Trivialität, mit dem das Tool arbeitet, sodass bei einem Wiederherstellen von Dateien einfach das Kommando "tar" reicht. Der Nachteil ergibt sich später aus der Größe der Tar Dateien. Je größer das Tar, desto mehr Gedanken muss man sich beim Wiederherstellen machen, da das Auffinden von einzelnen Dateien dauern kann. Es gäbe zwar Mittel und Wege die dem abhelfen, aber eine zentrale Datenbank die Zeit, Ort und Name der gesicherten Dateien festhält, wäre wünschenswert.

Hintergrund

In diese Kerbe schlägt das Backup Programm Bareos. Bareos selbst ist "nur" ein Klon von Bacula, aber aufgrund von Unstimmigkeiten wie nicht angekommener Patches, Bevorzugung der Kaufversion (Enterprise) was neue Funktionen angeht etc. haben sich einige Entwickler dazu entschlossen, den Klon Bareos aus der Taufe zu heben. Eines der wichtigsten Features für mich war dabei die SD-to-SD Kommunkation. SD steht dabei für "Storage Device" und ist ein Server Dienst innerhalb von Bareos/Bacula, der die eigentlichen Backup Daten auf ein Medium schreibt. Das kann ein Bandlaufwerk sein, oder eben auch Festplatten.

SD-SD ist dabei die Möglichkeit dem Bareos mitzuteilen, zu sichernde Daten zwischen zwei SD Servern auszutauschen. Das wird zum Beispiel nötig, wenn ich einen lokalen SD verwende um auf Festplatte zu sichern, aber noch an einem zweiten Server ein Bandlaufwerk für längerfristige Backups angeschlossen habe. Innerhalb von Bareos/Bacula gibt es die Möglichkeit sogenannte "Copy/Migration" Jobs zu erstellen. Dabei werden die Daten entweder auf ein kopiert oder migriert. Beim copy Job bleiben die Daten sowohl auf dem einen Medium, als auch zusätzlich auf dem anderen. Wird das Backup auf dem ersten Medium gelöscht/überschrieben weil die Retention Zeit abgelaufen ist, blendet Bareos die Kopie ein. Praktisch um zum Beispiel für einen Monat auf Festplatte zu sichern, und dann die Daten auf ein Bandlaufwerk zu kopieren für eine längerfristige Speicherung. Das klappt bei Bacula nur dann, wenn sowohl die Festplatten als auch das Bandlaufwerk am selben Rechner hängen. Sind sie es nicht, braucht es Bareos.

Bareos ist zu 100% zu der Bacula Konfiguration kompatibel. Auch muss man nicht überall den Bacula-fd Client durch bareos-filedaemon zu ersetzen. Einzig der Director und SD müssen Bareos sein ... aber das nur als Info.


Installation

Für Bareos gibt es mittlerweile fertige Pakete. Für Debian Wheezy gilt zum Beispiel:

  • Key installieren
Debian-term.png
wget -q http://download.bareos.org/bareos/release/latest/Debian_7.0/Release.key -O- | apt-key add -
  • /etc/apt/sources.list
Ascii.png
deb http://download.bareos.org/bareos/release/latest/Debian_7.0/ ./


  • Update und Installation
Debian-term.png
aptitude update && aptitude install postgresql-9.1 bareos-database-postgresql bareos -y

Damit wird der Director, der Storage Daemon sowie die Client Programme installiert. Des weiteren ziehe ich persönlich bei Bareos/Bacula Postgresql definitiv MySQL/MariaDB vor, besonders wenn die Datenbank auf einige Gigabyte wächst.

Datenbank

Nach der Installation von Postgresql sind nur noch wenige Schritte notwendig, um die notwendigen Tabellen einzurichten. Dafür gibt es die passenden Scripte.

Debian-term.png
cd /tmp
su postgres -c /usr/lib/bareos/scripts/create_bareos_database
su postgres -c /usr/lib/bareos/scripts/make_bareos_tables
su postgres -c /usr/lib/bareos/scripts/grant_bareos_privileges

Konfiguration

Da es eine Weile dauert, bis man eine Konfiguration stehen hat, stelle ich hier meine zur Verfügung, die aber zu einem nicht unerheblichen Teil aus dem Bacula Buch stammen, mit ein paar Erweiterungen. Dazu zählen:

  • Gesplittete Konfigurationsdateien
  • SD-SD Kommunikation
  • Einbindung passiver Clients (dazu später mehr)
  • SSL für die Verbindungen

Split

Die Bareos Konfiguration kann recht groß ausfallen, daher empfiehlt es sich die Dateien sinnvoll aufzuspalten, sodass später die Pflege stark vereinfacht wird.

Das Stammverzeichnis ist /etc/bareos:

  • bareos-dir.conf - Hauptkonfiguration
  • bareos-sd.conf - Für den Storage (Geräte) Daemon
  • bareos-fd.conf - Filedaemon
  • conf.d/ - Für die einzelnen Ressourcen
  • conf.d/catalog.conf - Datenbank Konfiguration
  • conf.d/filesets_global.conf - Globale Filesetzt
  • conf.d/jobdefs_global.conf - Globale Jobdefinitionen
  • conf.d/messages.conf - Nachrichten
  • conf.d/schedule_global.conf - Globale Scheduler Konfiguration
  • conf.d/console.conf - Zugriff per bconsole Kommando
  • conf.d/jobs_global.conf - Globale Jobs
  • conf.d/pools.conf - Pooldefinitionen
  • conf.d/storage.conf - Storage Definitionen
  • conf.d/clients-available - Verzeichnis um Bareos Clientdefinitonen zu hinterlegen
  • conf.d/clients-enabled - Verzeichnis für die aktiven Bareos Clients

Zwar mag zuerst die Menge an Dateien einen erschlagen, aber im Alltag erweist sich die Aufteilung sehr sinnvoll, da Änderungen sehr einfach zu dokumentieren und auch übersichtlicher sind.

bareos-dir.conf

Damit die Aufteilung funktioniert, verwende ich folgende Konfiguration für den Director:

  • /etc/bareos/bareos-dir.conf
Ascii.png
Director {                            
  Name = backup.example.com
  QueryFile = "/usr/lib/bareos/scripts/query.sql"
  Maximum Concurrent Jobs = 1
  Password = "secret"         # Konsolen Kennwort
  Messages = Daemon

  # Plugin Directory = /usr/lib/bareos/plugins

#### Noch auskommentiert ####
 ## TLS Certificate = /etc/bareos/ssl/backup.crt
 ## TLS Key = /etc/bareos/ssl/backup.key
 ## TLS DH File = /etc/bareos/ssl/dh2048.pem
 ## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 ## TLS Enable = yes
 ## TLS Require = yes
 ## TLS Verify Peer = yes
}

# Jobdefs
@/etc/bareos/conf.d/jobdefs_global.conf
@/etc/bareos/conf.d/jobs_global.conf
@/etc/bareos/conf.d/filesets_global.conf
@/etc/bareos/conf.d/schedule_global.conf
# find all clients
@|"sh -c ' for f in /etc/bareos/conf.d/clients-enabled/*.conf ; do echo @${f} ; done'"
@/etc/bareos/conf.d/storage.conf
@/etc/bareos/conf.d/catalog.conf
@/etc/bareos/conf.d/messages.conf
@/etc/bareos/conf.d/pools.conf
@/etc/bareos/conf.d/console.conf

Der Übersicht wegen habe ich die Kommentare entfernt. Spannend ist vor allem die Schleife um alle Clients einzubinden, welche sich im Verzeichnis /etc/bareos/conf.d/clients-enabled/ befinden. Auf diese Weise können Clients bequem aktiviert und deaktiviert werden. Der SSL Teil wird später noch separat erläutert.

bareos-sd.conf

Nun folgt die Definition des Storage Daemons, welcher ein Bandlaufwerk anspricht, oder eben Festplatten.

  • /etc/bareos/bareos-sd.conf
Ascii.png
Storage {
  Name = backup.example.com
  Maximum Concurrent Jobs = 20

  # Plugin Directory = /usr/lib/bareos/plugins

#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/backup.crt
## TLS Key = /etc/bareos/ssl/backup.key
## TLS DH File = /etc/bareos/ssl/dh2048.pem
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
## TLS Verify Peer = yes
}

Director {
 Name = backup.example.com
#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/backup.crt
## TLS Key = /etc/bareos/ssl/backup.key
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
## TLS Verify Peer = yes
 Password = "storage-secret"
}


Director {
  Name = backup-mon
  Password = "sd-storagesecret-mon"
  Monitor = yes
}

Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /var/lib/bareos/storage
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}

Messages {
  Name = Standard
  director = backup.example.com = all
}

bareos-fd.conf

Nun folgt die Definition des Filedaemons, um den Backuphost selbst sichern zu können

  • /etc/bareos/bareos-fd.conf
Ascii.png
Director {
 Name = backup.example.com
 Password = "fd-clientsecret"

#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/backup.crt
## TLS Key = /etc/bareos/ssl/backup.key
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
## TLS Verify Peer = yes
}

Director {
  Name = backup-mon
  Password = "fd-clientsecret-mon"
  Monitor = yes
}

FileDaemon {
  Name = backup.example.com
  Maximum Concurrent Jobs = 20

  # Plugin Directory = /usr/lib/bareos/plugins

#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/backup.crt
## TLS Key = /etc/bareos/ssl/backup.key
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
## TLS Verify Peer = yes

}

Messages {
  Name = Standard
  director = backup.example.com = all, !skipped, !restored
}

bconsole.conf

Konfiguration für das bconsole Kommando

  • /etc/bareos/bconsole.conf
Ascii.png
Director {
  Name = backup.example.com
  DIRport = 9101
  address = backup.example.com
  Password = "dir-secret"

### Noch auskommentiert ###
## TLS Certificate = /etc/bareos/ssl/backup.crt
## TLS Key = /etc/bareos/ssl/backup.key
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
}
  • /etc/bareos/conf.d/catalog.conf
Ascii.png
Catalog {
  Name = MyCatalog
  # Uncomment the following lines if you want the dbi driver
  # dbdriver = "dbi:postgresql"; dbaddress = 127.0.0.1; dbport =
  dbdriver = "postgresql"
  dbname = "bareos"
  dbuser = "bareos"
  dbpassword = ""
}

Der Zugriff auf die Datenbank erfolgt nicht per TCP, sondern per Socket.

conf.d/

Nun kommen alle Dateien unterhalb von /etc/bareos/conf.d/

filesets_global.conf

Hier definiere ich nun die globalen Filesets für zum Beispiel ein Linux Server. Abweichende Filesets für zum Beispiel /home etc. werden in der jeweiligen Client Konfiguration definiert.

Dieses Fileset ist vor allem auf Debian Systemen aktiv und schließt eine Menge Verzeichnisse aus, die nicht unbedingt gesichert werden müssen. Diese Liste sollte von jedem nochmal überprüft und angepasst werden. Insbesondere werden /home und /srv ausgeschlossen, da diese bei Bedarf gesondert definiert werden.

  • /etc/bareos/conf.d/filesets_global.conf
Ascii.png
FileSet {
  Name = "Linux Full Set"
  Include {
        Options {
         signature = MD5
         compression= GZIP
        }
        File = /
        File = /boot
        File = /usr
        File = /usr/local
        File = /var
        File = /var/backups
        }
        Exclude {
        File = /tmp
        File = /home
        File = /proc
        File = /sys
        File = /dev
        File = /data
        File = /srv
        File = /mnt
        File = /media
        File = /export
        File = /var/run
        File = /var/tmp
        File = /var/log
        File = /var/www
        File = /.fsck
        File = /lost+found
        File = /selinux
        File = /usr/src
        File = /var/cache/apt/archives
        File = /backup
        File = /var/lib/bareos
        File = /var/lib/bareos/storage
        File = /proc
        File = /tmp
        File = /.journal
        }
}
jobs_global.conf
  • /etc/bareos/conf.d/jobs_global.conf

Diese Datei wäre zum Beispiel dafür geeignet um Jobs zu hinterlegen, die nicht einem Client zuzuordnen sind. Als Beispiel habe ich hier einen Copy Job hinterlegt, um Jobs auf ein anderes Medium (zum Beispiel auf Band) zu kopieren.

Ascii.png
##Job {
##   Name = Copy-Full-Tape
##   Pool = Full-Tape
##   JobDefs = CopyToTape
##}
jobdefs_global.conf
  • /etc/bareos/conf.d/jobs_global.conf

Hier definieren wir die globalen Jobdefinitionen, die bei den Clients verwendet werden könnnen/sollen

Ascii.png
JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Incremental
  Client = backup.example.com
  FileSet = "Linux File Set"
  Schedule = "WeeklyCycle"
  Storage = example-File
  Messages = Standard
  Pool = example-Incr
  Priority = 10
  Write Bootstrap = "/var/lib/bareos/%c.bsr"
}

JobDefs {
  Name = "Default-example.com-Job"
  Type = Backup
  Storage = example-File
  Schedule = "WeeklyCycle"
  Pool = Default
  Messages = Standard
  Priority = 10
  Prefer Mounted Volumes = no
  Write Bootstrap = "/var/lib/bareos/%c.bsr"
  # Run After Job = "/etc/bareos/scripts/bacula2icinga \"%n\" 0 \"%e %l %v\""
  # Run After Failed Job = "/etc/bareos/scripts/bacula2icinga \"%n\" 1 \"%e %l %v\""
  Spool Attributes = yes
  Allow Higher Duplicates = no
  Allow Duplicate Jobs = no
  Cancel Queued Duplicates = yes
  Rerun Failed Levels = yes
  Full Backup Pool = example-Full
  Differential Backup Pool = example-Diff
  Incremental Backup Pool = example-Incr
}
pools.conf
  • /etc/bareos/conf.d/pools.conf


Nun die Pool Definitionen. Sie bestehen im Kern aus:

  • Einem Scratch Pool (den ich hier nicht verwende)
  • Einem Full Pool für alle Vollbackups -> Einmal Monatlich
  • Einem Diff Pool für die differenziellen Backup -> Einmal in der Woche
  • Einem Incr Pool für die inkrementellen Backups -> Einmal Täglich

Der Parameter NextPool ist auskommentiert, da der hier nicht verwendet wird.

Ascii.png

# Scratch pool definition
Pool {
  Name = Scratch
  Pool Type = Backup
}

# Monthly Full
Pool {
  LabelFormat = "example-Full-"
  Name = example-Full
  Pool Type = Backup
#  NextPool = "Tape-Archiv"
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 3 month
  Maximum Volume Bytes = 50G
  Action On Purge = Truncate
  Recycle Oldest Volume = yes
  Maximum Volumes = 5
  Storage = backup.example.com
}

# Weekly Differential
Pool {
  LabelFormat = "example-Diff-"
  Name = example-Diff
  Pool Type = Backup
  #NextPool = "Tape-Archiv"
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 2 month
  Maximum Volume Bytes = 20G
  Action On Purge = Truncate
  Recycle Oldest Volume = yes
  Maximum Volumes = 5
  Storage = backup.example.com
}

# Daily Incremental
Pool {
  LabelFormat = "example-Incr-"
  Name = example-Incr
  Pool Type = Backup
#  NextPool = "Tape-Archiv"
  Recycle = yes                      
  AutoPrune = yes                    
  Volume Retention = 3 weeks
  Maximum Volume Bytes = 10G
  Action On Purge = Truncate
  Recycle Oldest Volume = yes
  Maximum Volumes = 3
  Storage = backup.example.com
}

storage.conf
  • /etc/bareos/conf.d/storage.conf

In dieser Datei werden die Storage Server hinterlegt, mit ihren jeweiligen Paramtern, wie der IP Adresse und Kennwort. In diesem Fall habe ich zwei Storage Server eingetragen. Backup.example.com wäre der primäre Backupserver und backup2.example.com könnte ein sekundärer Backup Speicher sein, an dem weitere Festplatten angeschlossen sind, für die Langzeit Archivierung oder Tape-Laufwerke. Die Kennwörter sollten natürlich unterschiedlich sein.

Ascii.png
Storage {
  Name = example-File
  Address = backu.example.com
  Password = "sd-secret"
  Device = FileStorage
  Media Type = File
#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/backup.crt
## TLS Key = /etc/bareos/ssl/backup.key
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
}

Storage {
  Name = backup2.example.com
  Address = backup2.example.com
  Password = "sd-secret"
  Device = FileStorage
  Media Type = File
#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/backup2.crt
## TLS Key = /etc/bareos/ssl/backup2.key
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
}


console.conf
  • /etc/bareos/conf.d/console.conf

Diese Datei ist zum Beispiel für die Statusabfrage gedacht, aber wird hier nicht verwendet.

Ascii.png
Console {
  Name = backup.exmaple.com
  Password = "XXX_REPLACE_WITH_DIRECTOR_MONITOR_PASSWORD_XXX"
  CommandACL = status, .status
}
messages.conf
  • /etc/bareos/conf.d/messages.conf

Wohin sollen die E-Mails gesendet werden, bzw. die Logs. Hier gehen die E-Mails an backup@example.com und werden per SMTP auf 127.0.0.1 eingeliefert. Daher sollte da ein MTA lauschen.

Ascii.png
Messages {
  Name = Standard

  mailcommand = "/usr/sbin/bsmtp -h 127.0.0.1 -f \"\(Bareos\) \<%r\>\" -s \"Bareos: %t %e of %c %l\" %r"
  operatorcommand = "/usr/sbin/bsmtp -h 127.0.0.1 -f \"\(Bareos\) \<%r\>\" -s \"Bareos: Intervention needed for %j\" %r"
  mail = backup@example.com = all, !skipped
  operator = backup@example.com = mount
  console = all, !skipped, !saved
  append = "/var/log/bareos/bareos.log" = all, !skipped
  catalog = all
}

Messages {
  Name = Daemon
  mailcommand = "/usr/sbin/bsmtp -h 127.0.0.1 -f \"\(Bareos\) \<%r\>\" -s \"Bareos daemon message\" %r"
  mail = backup@example.com = all, !skipped
  console = all, !skipped, !saved
  append = "/var/log/bareos/bareos.log" = all, !skipped
}


schedule_global.conf
  • /etc/bareos/conf.d/schedule_global.conf

Hier definieren wir wann welche Jobs ausgeführt werden sollen.

Ascii.png
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
}

# This schedule does the catalog. It starts after the WeeklyCycle
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 23:10
}

Schedule {
  Name = "HourlyCyle"
  Run = Incremental hourly at 0:33
}

Clients

Nun kommen die Clients an die Reihe. Die eigentlichen Dateien werden in clients-available/ abgelegt und durch einen Softlink in clients-enabled/ aktiviert. Das ist ähnlich zu dem, was für Apache etc. die sites-enabled sind.


Beispiel 1

Hier haben wir als erstes Beispiel den Backup Server selbst. Es wird von dem System ein Backup erzeugt, sowie von der Datenbank:

  • clients-enabled/backup.conf
Ascii.png
Client {
  Name = backup.example.com
  Address = backup.example.com
  Password = "fd-secret"          # password for FileDaemon
  File Retention = 30 days
  Job Retention = 6 months
  AutoPrune = yes
#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/backup.crt
##  TLS Key = /etc/bareos/ssl/backup.key
##  TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
}

# System Backup

Job {
        Name = "Backup Backupserver Linux Server"
        JobDefs = "Default-example.com-Job"
        Client = backup.example.com
        FileSet = "Linux Full Set"
        Full Backup Pool = example-Full
        Differential Backup Pool = example-Diff
        Incremental Backup Pool = example-Incr
}

# Datenbank Backup

Job {
  Name = "BackupCatalog"
  JobDefs = "Default-example.com-Job"
  Client = backup.example.com
  Level = Full
  FileSet="Catalog"
  Schedule = "WeeklyCycleAfterBackup"
  RunBeforeJob = "/usr/lib/bareos/scripts/make_catalog_backup.pl MyCatalog"
  RunAfterJob  = "/usr/lib/bareos/scripts/delete_catalog_backup"
  Write Bootstrap = "|/usr/sbin/bsmtp -h 127.0.0.1 -f \"\(Bareos\) \" -s \"Bootstrap for Job %j\" backup@example.com"
  Priority = 11                   # run after main backup
  Full Backup Pool = example-Full
  Differential Backup Pool = example-Diff
  Incremental Backup Pool = example-Incr
}

# Für den Restore

Job {
  Name = "RestoreFiles"
  Type = Restore
  Client = backup.example.com
  FileSet="Full Set"
  Storage = backup.example.com
  Pool = Default
  Messages = Standard
  Where = /tmp/bareos-restores
}

# Eigenes Fileset, welche nur für diesen Client gilt

FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/lib/bareos/bareos.sql"
    File = "/etc/bareos"
  }
}


Beispiel 2

Nun binden wir einen regulären Client ein, der unter anderem Webseiten ausliefert und somit auch ein eigenes Fileset benötigt.

  • clients-available/webserver.conf


Ascii.png
Client {
  Name = www.example.com
  Address = www.example.com
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-secret"  # password for FileDaemon, in client-file
  AutoPrune = no
#### Noch auskommentiert ####
## TLS Certificate = /etc/bareos/ssl/www.crt
## TLS Key = /etc/bareos/ssl/www.key
## TLS CA Certificate File = /etc/bareos/ssl/ca.crt
## TLS Enable = yes
## TLS Require = yes
}

# Backup des Systems

Job {
        Name = "Backup WWW Linux Server"
        JobDefs = "Default-example.com-Job"
        Client = www.example.com
        FileSet = "Linux Full Set"
        Full Backup Pool = example-Full
        Differential Backup Pool = example-Diff
        Incremental Backup Pool = example-Incr
}

# Backup von Home und var/www

Job {
        Name = "Backup WWW home-var"
        JobDefs = "Default-example.com-Job"
        FileSet = "Backup WWW home-var"
        Client = www.example.com
        Full Backup Pool = example-Full
        Differential Backup Pool = example-Diff
        Incremental Backup Pool = example-Incr
}

# Fileset für /var/www sowie für /home, die ja im filesets_global in der exclude Liste stehen.

FileSet {
        Name = "Backup WWW home-var"
        Include {
                Options {
                signature = SHA1
                compression = GZIP
        }
        File = /var/www
        File = /home
        }
}

Client aktivieren

Um nun die zu sichernden Clients in Bareos einzubinden, genügt es die passenden Links zu erstellen und dann ein Reload durchzuführen. Bevor ihr den "reload" durchführt, solltet ihr unbedingt noch testen, um die Konfiguration im Ganzen "stimmig" ist. Im schlimmsten Fall stürzt der Director sonst ab.

Debian-term.png
# cd /etc/bareos/conf.d/clients-enabled
# ln -s ../clients-available/webserver.conf .
# ln -s ../clients-available/backup.conf .
# bareos-dir -t /etc/bareos/bareos-dir.conf
# bconsole
$ bconsole> reload

Wenn alles passt, spricht nichts gegen erste Backup Tests.

SSL/TLS

Befindet sich alle Clients am selben Switch / Netzwerk, so machen sich die wenigsten Gedanken darum, wie Bareos die Daten über das Netzwerk kopiert. Dies geschieht nämlich unverschlüsselt. Nun sollte man allerdings die letzten NSA Geschichten im Kopf behalten und auch eventuell einkalkulieren, dass man auch externe Clients sichern möchte und nicht auf VPN zurückgreifen kann, oder möchte. Zwar wird an manchen Stellen gern auf [stunnel] verwiesen oder auch auf SSH, doch sind da nicht unerhebliche Vorarbeiten zu leisten und skaliert auch nur unzureichend gut.

Am einfachsten ist es an dieser Stelle Bareos SSL/TLS beizubringen. Allerdings ist mit "einfach" nicht "schnell" gemeint, denn es gilt relativ viele Zertifikate zu erzeugen und auch zu verteilen/verwalten. Da kaum einer gern mit dem "openssl" Kommando hantiert, spricht nichts dagegen auf ein grafisches Frontend zurückzugreifen. Da gibt zwei:

  • tinyCA] Für Linux und Windows
  • xca] Für Linux, Windows und OSX

Da mein Hauptarbeitsplatz OSX ist, greife ich auf xca zurück. Eine Anleitung spare ich mir hier im Detail, da es [hier] eine gibt. Für den Backup Server habe ich mir eine eigene CA erstellt mit selbst signierten Zertifikaten.

Für den Client backup.example.com sieht das zum Beispiel so aus:

Erstellung eines Zertifikat in XCA

Der wirklich wichtige Parameter verbirgt sich auf dem Reiter Netscape. Dort wird als nsType als Standard Server ausgewählt. Tatsächlich aber darf dieser Parameter nicht aktiviert werden, da sonst Bareos/Bacula die Zertifikate nicht akzeptieren:

Netscape Eigenschaften abwählen !

Die Option gilt ebenfalls für tinyCA, daher auch hier passend deaktivieren.

DH für forward secrecy

Um "Forward Secrecy" nutzen zu können, empfiehlt es sich in jedem Fall einen Diffie-Hellman Schlüssel zu erzeugen:

Gnome-terminal.png
# cd /etc/bareos/ssl
# openssl dhparam -out dh2048.pem -5 2048

Wir erzeugen die Datei /etc/bareos/ssl/dh2048.pem mit einer Größe von 2048Bit. Wer einen "stärkeren" Schlüssel bevorzugt kann natürlich auch 4096Bit als Parameter verwenden.

Die Datei wird dann in der Director sowie Storage Konfiguration angegeben, so wie bereits oben geschehen:

  • /etc/bareos/bareos-dir.conf
Ascii.png
Director {
...
 TLS DH File = /etc/bareos/ssl/dh2048.pem
...

}


  • /etc/bareos/bareos-sd.conf
Ascii.png
Storage {
...
 TLS DH File = /etc/bareos/ssl/dh2048.pem
...

}


Orte / Dateien

Hat man die CA erstellt und das erste reguläre Zertifikat erzeugt, kann man dieses Zertifikat als Vorlage verwenden in XCA. Es genügt ein Rechtsklick auf das Zertifikat Export -> Vorlage.

Man benötigt eine Vielzahl von Zertifikaten auf den Servern. Dazu lege ich sie im Ordner /etc/bareos/ssl ab mit "bareos:root" als Eigentümer, sowie '750' als Berechtigung. Die jeweiligen *.key Dateien sollten mit den Rechten'0400 ausgestattet werden, sodass wirklich nur Root und Bareos die Datei lesen kann.

Auf backup.example.com

  • /etc/bareos/ssl
  • Für den Backup Server backup.example.com
    • /etc/bareos/ssl/ca.crt -> Das RootCA Zertifikat
    • /etc/bareos/ssl/backup.crt -> Das Zertifikat für backup.example.com
    • /etc/bareos/ssl/backup.key -> Der private Schlüssel für backup.example.com
  • Für den Webserver www.example.com
    • /etc/bareos/ssl/www.crt -> Das Zertifikat für www.example.com
    • /etc/bareos/ssl/www.key -> Der private Schlüssel für www.example.com
  • Für den sekundären Storage Daemon, sofern man einen verwenden möchte, backup2.example.com
    • /etc/bareos/ssl/backup2.crt -> Das Zertifikat für backup2.example.com
    • /etc/bareos/ssl/backup2.key -> Der private Schlüssel für backup2.example.com

Für drei Rechner haben wir also schon mit 7 Dateien zu verwalten, sofern Key und Zertifikat getrennt gespeichert werden. Ich speichere die Dateien separat, da ich dann bei Bedarf die Zertifikate erneuern kann, ohne den Schlüssel anfassen zu müssen, da dies doch immer eine gewisse Copy/Paste Orgie ist :-)

TLS Bareos Parameter

In den Konfigurationsdateien oben habe ich bereits alle TLS Parameter hinterlegt und müssen nur noch auskommentiert werden. Der wichtigste Punkt ist der, dass überall der FQDN als Adresse verwendet werden muss. Oftmals werden nämlich nur IP Adressen angegeben, zum Beispiel so:

Ascii.png
Client {
  Name = www.example.com
 # !!! FALSCH !!!!
  Address = 192.168.1.10
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-secret"
  AutoPrune = no
 TLS Certificate = /etc/bareos/ssl/www.crt
 TLS Key = /etc/bareos/ssl/www.key
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 TLS Enable = yes
 TLS Require = yes
}
...

In diesem Fall passt der CN (CommonName) nicht zum Zertifikat und Bareos lehnt eine Verbindung zu diesem Client, oder auch jeglichem anderen Daemon, ab.

Richtig muss es lauten:

Ascii.png
Client {
  Name = www.example.com
 # !!! RICHTIG !!!!
  Address = www.example.com
  FDPort = 9102
...
}

Genau das Gleiche gilt auch auf allen anderen Servern. Die Adresse muss überall dem CN entsprechen. Will / kann / möchte man keinen eigenen DNS Server betreiben um auf allen Rechnern private IP Adressen korrekt aufzulösen, reicht es vollkommen die IP Adressen und den Namen, die im CN angegeben worden sind, in der /etc/hosts auf allen Server zu hinterlegen.

Auf www.example.com

Auf jedem Rechner der in einer Beziehung zum Bareos steht, müssen ebenfalls die entsprechenden Dateien verteilt werden. Als Beispiel hier www.example.com

  • /etc/bareos/ssl
    • /etc/bareos/ssl/ca.crt -> Das RootCA Zertifikat
    • /etc/bareos/ssl/www.crt -> Das Zertifikat für www.example.com
    • /etc/bareos/ssl/www.key -> Der private Schlüssel für www.example.com
TLS Bareos Parameter

In der /etc/bareos/bareos-fd.conf sind dann folgende Parameter einzustellen:

Ascii.png
# der Director der zugreift
  Name = backup.example.com 
  Password = "fd-secret"

# Das Zertifikat von www.example.com
 TLS Certificate = /etc/bareos/ssl/www.crt

# Der private Schlüssel für www.example.com
 TLS Key = /etc/bareos/ssl/www.key

# Das RootCA Zertifikat
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt

# Wir wollen TLS
 TLS Enable = yes

# Wir wollen es explizit !
 TLS Require = yes

# Prüfe die Gegenseite !
 TLS Verify Peer = yes

...

# der eigentliche Filedaemon
FileDaemon {
  Name = www.example.com
 
....
# selbes Spiel wie oben:
 TLS Certificate = /etc/bareos/ssl/www.crt
 TLS Key = /etc/bareos/ssl/www.key
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 TLS Enable = yes
 TLS Require = yes
 TLS Verify Peer = yes

...
}
...

Ein abschließendes service restart bareos-fd schaltet das TLS scharf. Über die Bareos Console (bconsole) kann dann ein Check mittels "status client" die Verbindung geprüft werden.

Zweiter Storage Daemon SD-SD

Wie bereits angemerkt, beherrscht Bareos die "Storage zu Storage" Kommunikation. Damit lassen sich Copy/Migration Konstrukte bauen.

Als Beispiel nehme ich "backup2.example.com". Auf diesem Server muss natürlich ebenfalls das Paket "bareos-storage" installiert werden. Die Konfiguration hat dann folgenden Aufbau:

  • /etc/bareos/bareos-sd.conf
Ascii.png
Storage {
  Name = backup2.example.com
  Maximum Concurrent Jobs = 20
 TLS Certificate = /etc/bareos/ssl/backup2.crt
 TLS Key = /etc/bareos/ssl/backup2.key
 TLS DH File = /etc/bareos/ssl/dh2048.pem
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 TLS Enable = yes
 TLS Require = yes
 TLS Verify Peer = yes

}

# Der Director der mit uns sprechen darf
Director {
  Name = backup.example.com
  Password = "sd-secret"
 TLS Certificate = /etc/bareos/ssl/backup2.crt
 TLS Key = /etc/bareos/ssl/backup2.key
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 TLS Enable = yes
 TLS Require = yes
 TLS Verify Peer = yes
}

Director {
  Name = backup2.example.com-mon
  Password = "sd-secret-mon"
  Monitor = yes
}

# Geräte definieren

Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /bareos/backup
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
}

Messages {
  Name = Standard
  director = backup = all
}

Nach einem Neustart des Dienstes und den vorhandenen passenden Zertifikaten, ist der Storage Daemon bereit.

Die backup.example.com Seite

Nun können wir den Storage Daemon auf backup.example.com einbinden, wie bereits oben schon erläutert:

  • /etc/bareos/conf.d/storage.conf
Ascii.png
...
Storage {
  Name = backup2.example.com
  Address = backup2.example.com
  Password = "sd-secret"
  Device = FileStorage
  Media Type = File
 TLS Certificate = /etc/bareos/ssl/backup2.crt
 TLS Key = /etc/bareos/ssl/backup2.key
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 TLS Enable = yes
 TLS Require = yes
}
...

Nun können damit zum Beispiel Copy Jobs definiert und auch ausgeführt werden. Die Daten wandern dabei von dem Haupt- Storage backup.example.com zu backup2.example.com, was bei Bacula abbricht.

  • Job Definition:
Ascii.png
...
JobDefs {
  Name = CopyToTape
  Type = Copy
  Messages = Standard
  Client = None
  FileSet = None
  Selection Type = PoolUncopiedJobs
  Maximum Concurrent Jobs = 2
  SpoolData = Yes
  Priority = 13
}
...
  • Und der dazu passende Job:
Ascii.png
...
Job {
   Name = Copy-Full-Tape
   Pool = example-Full
   JobDefs = CopyToTape
}
...

Die restlichen Paramter zieht sich Bareos aus der Pool Definition (NextPool Paramter).

Passive Clients

Eine weitere verdammt coole Option von Bareos "passive = yes" in der Client Definition. Damit können Probleme umgangen werden, bei denen der bareos-fd den Director bzw. den Storage nicht erreichen, weil beide hinter eine Firewall / NAT stecken. In der Regel versucht der bareos-fd Client eine Verbindung zum bareos-sd aufzubauen um dann die Backupdaten dorthin zu kopieren.

Die "passive = yes" Option sagt dem Director das der "bareos-sd" selbst eine Verbindung zum Client aufbauen soll. Damit können Director und Storage Daemon hinter der Firewall bleiben, während der bareos-fd aber auf Port 9102 erreichbar sein muss.

Hier ein Beispiel um diesen Server zu sichern :-) :

  • /etc/bareos/client-available/www.pug.org.cfg


Ascii.png
...
Client {
  Name = www.pug.org
  Address = www.pug.org
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-secret"
  AutoPrune = no

  Passive = yes

 TLS Certificate = /etc/bareos/ssl/www.pug.org.crt
 TLS Key = /etc/bareos/ssl/www.pug.org.key
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 TLS Enable = yes
 TLS Require = yes
}

....

Auf dem zu sichernen, passiven Client muss in dem Fall die Kompatibilität für den bareos-fd abgeschaltet werden:

  • Auf dem www.pug.org Server:


Ascii.png
...
FileDaemon {
  Name = www.pug.org
  Maximum Concurrent Jobs = 20

# Auf no stellen
  compatible = no

 TLS Certificate = /etc/bareos/ssl/www.pug.org.crt
 TLS Key = /etc/bareos/ssl/www.pug.org.key
 TLS CA Certificate File = /etc/bareos/ssl/ca.crt
 TLS Enable = yes
 TLS Require = yes
 TLS Verify Peer = no
}
...


Hier wird auch ersichtlich, warum TLS eine feine Sache ist. Die Daten können dann über das reguläre Internet kopiert werden.


Quellen


--Denny (Diskussion) 22:01, 7. Jan. 2014 (CET)