Bareos Backup
Inhaltsverzeichnis
- 1 Hinweis
- 2 Client / Server Backup mit Bareos
- 3 Hintergrund
- 4 Installation
- 5 Konfiguration
- 6 Quellen
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
wget -q http://download.bareos.org/bareos/release/latest/Debian_7.0/Release.key -O- | apt-key add - |
- /etc/apt/sources.list
deb http://download.bareos.org/bareos/release/latest/Debian_7.0/ ./ |
- Update und Installation
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.
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
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
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
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
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
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
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.
##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
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.
# 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.
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.
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.
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.
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
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
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.
# 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:
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:
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:
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:
# 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
Director { ... TLS DH File = /etc/bareos/ssl/dh2048.pem ... } |
- /etc/bareos/bareos-sd.conf
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:
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:
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:
# 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
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
... 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:
... 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:
... 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
... 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:
... 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
- Bacula Buch
- Bareos Parameter
- Bacula mit CAcert
- TLS/SSL mit Bacula(PDF)
- Nochmehr TLS
- Bareos Vortrag (PDF)
- Neue Funktionen in Bareos 13.2
--Denny (Diskussion) 22:01, 7. Jan. 2014 (CET)