
\chapter{Daten-Verschl\"{u}sselung}
\label{DataEncryption}
\index[general]{Daten-Versch\"{u}sselung}
\index[general]{Versch\"{u}sselung!Daten-}

Bacula erm\"{o}glicht Ihnen die Backup-Daten Clientseitig zu verschl\"{u}sseln
und zu signieren, bevor sie zum Storage-Dienst gesendet werden. W\"{a}hrend
der Wiederherstellung werden die Signaturen \"{u}berpr\"{u}ft und Abweichungen
gemeldet. Director- und Storage-Dienst haben dabei zu keinem Zeitpunkt Zugriff
auf unverschl\"{u}sselte Daten.

Dabei gibt es zwei sehr wichtige Punkte zu beachten:
\begin{itemize}
\item zum einen gilt es bei der Wiederherstellung zu bedenken,
  dass es f\"{u}r den Director-Dienst m\"{o}glich ist neue Schl\"{u}ssel
  oder eine andere Konfigurations-Datei auf dem Client zu erstellen.
  Dadurch kann die Verschl\"{u}sselung abgeschaltet oder mit ungewollten
  Schl\"{u}sseln durchgef\"{u}hrt werden. Damit das nicht unbeabsichtigt
  passieren kann, sollten Sie nie den Speicherortder Schl\"{u}ssel, noch
  die Schl\"{u}ssel selbst \"{a}ndern. Falls solche \"{A}nderungen jemals
  notwendig sind, sollten Sie sicherstellen, dass niemals aus versehen
  die alte Konfiguration wiederhergestellt wird. Im schlimmsten Fall
  sind Sie sp\"{a}ter nicht mehr in der Lage sich mit dem Client-Dienst
  zu verbinden.
\item Die Verschl\"{u}sselung wird nicht bei den Metadaten, wie
  Verzeichnisname, Rechte und Eigent\"{u}mer der Dateien durchgef\"{u}hrt.
  Ebensowenig werden erweiterte Datei-Attribute verschl\"{u}sselt.
  Mac OS X \elink{resource forks}{http://en.wikipedia.org/wiki/Resource_fork}
  werden allerdings verschl\"{u}sselt.
\end{itemize}

Die Verschl\"{u}sselung und Signierung wird mittels RSA privaten Schl\"{u}ssel
in Verbindung mit selbstsignierten X509 \"{o}ffentlichen Zertifikate durchgef\"{u}hrt.
Dieses Verfahren ist auch als \elink{PKI}{http://de.wikipedia.org/wiki/Public-Key-Infrastruktur}
(Public-Key-Infrastruktur) bekannt.

Jeder Client-Dienst sollte sein eigenes einzigartiges privates/\"{o}ffentliches
Schl\"{u}ssel-paar besitzen. Zus\"{a}tzlich, zu diesem Schl\"{u}ssel-Paar,
k\"{o}nnen beliebig viele "`Master Keys"' angegeben werden. Das sind
Schl\"{u}ssel-Paare die zum entschl\"{u}sseln benutzt werden k\"{o}nnen,
falls der Schl\"{u}ssel des Client-Dienstes verloren geht. Nur die \"{o}ffentlichen
Schl\"{u}ssel der Master-Keys sollten auf dem Client zur Verf\"{u}gung stehen
und {\bf niemals} die privaten.

Die Master-Keys sollten zudem an einem sicheren Ort aufbewart werden,
zum Beispiel in einem feuerfesten Stahlschrank oder einem Bankdepot.
Diese Schl\"{u}ssel sollten nie auf den Systemen auf denen der Director-
und der Storage-Dienst l\"{a}uft aufbewart werden. Ansonsten ist es eventuell
unautorisierten Benutzer m\"{o}glich auf die verschl\"{u}sselten Daten zuzugreifen.

Obwohl weniger kritisch, sind es auch die Client-Schl\"{u}ssel Wert,
an einem sicheren Ort gespeichert zu werden.

WARNUNG: Wenn Sie jemals die zur Entschl\"{u}sselung ben\"{o}tigten
Schl\"{u}ssel verlieren, k\"{o}nnen Sie keine Daten mehr aus Ihrem Backups
wiederherstellen! Heben Sie {\bf IMMER} eine Kopie der Schl\"{u}ssel
an einem sicheren Ort au{\ss}erhalb Ihres Standortes auf.

Der wesentliche Ablauf eines jeden Backup-Jobs mit Verschl\"{u}sselung ist:
\begin{enumerate}
\item Der Client-Dienst generiert einen Session-Schl\"{u}ssel.
\item Der Client-Dienst verschl\"{u}sselt diesen Session-Schl\"{u}ssel mittels PKI
  f\"{u}r alle \"{o}ffentlichen Schl\"{u}ssel die konfiguriert sind
  (Client- und Master-Schl\"{u}ssel).
\item Der Client-Dienst benutzt den Session-Schl\"{u}ssel zum symetrischen
  Verschl\"{u}sseln der Daten.
\end{enumerate}


\section{Bacula mit Unterst\"{u}tzung f\"{u}r Verschl\"{u}sselung kompilieren}
\index[general]{Bacula mit Unterst\"{u}tzung f\"{u}r Verschl\"{u}sselung kompilieren}

Um die Unterst\"{u}tzung der Daten-Verschl\"{u}sselung aktivieren zu k\"{o}nnen,
m\"{u}ssen die OpenSSL Header und Bibliotheken installiert sein. Bei der Konfiguration
des Bacula-Quelltextes muss folgende Option angegeben werden:

\begin{verbatim}
   ./configure --with-openssl ...
\end{verbatim}

\section{Technische Einzelheiten der Verschl\"{u}sselung}
\index[general]{Technische Einzelheiten der Verschl\"{u}sselung}

Diese Verschl"`{u}sselung benutzt 128-Bit AES-CBC mit RSA verschl\"{u}sselten
symetrischen Session-Schl\"{u}sseln. Diese RSA-Schl\"{u}sseln werden vom
Benutzer erstellt. Wenn Sie OpenSSL in Version 0.9.8 (oder gr\"{o}{\ss}er)
benutzen, wird f\"{u}r die Signierung der Datei-Hashes SHA-256 verwendet,
ansonsten SHA-1.

Eine Konfigurations-M\"{o}glichkeit des End-Benutzers f\"{u}r den Algorithmus
ist momentan nicht vorgesehen, nur die oben genannten werden verwendet.
Allerdings unterst\"{u}tzen die auf die Volumes geschriebenen Daten auch
frei w\"{a}hlbare symetrische, asymetrische und Digest Algorithmen.
Es sind also noch viele M\"{o}glichkeiten zur Erweiterung
der Verschl\"{u}sselung vorhanden.

Director-seitig wird unterst\"{u}tzt:

\begin{alltt}
Symmetrische Verschl\"{u}sselung:
    - 128, 192 und 256-bit AES-CBC
    - Blowfish-CBC

Asymmetrische Verschl\"{u}sselung (zum verschl\"{u}sseln der symmetrischen Session-Keys):
    - RSA

Digest Algorithmen:
    - MD5
    - SHA1
    - SHA256
    - SHA512
\end{alltt}

Die verschiedenen Algorithmen werden durch eine wiederverwendbare
OpenSSL-Schnittstelle bereitgestellt. Dadurch ist es jederzeit
M\"{o}glich neue Verschl\"{u}sselungs-Methoden zu implementieren.
Das Volume-Format ist DER-verschl\"{u}sseltes ASN.1, entwickelt nach
der "'Cryptographic Message Syntax"` des RFC 3852. Leider war die
direkte Verwendung von CMS nicht m\"{o}glich, da zu dem Zeitpunkt der
Entwicklung kein freier DER-Decoder/Encoder f\"{u}r Datenstr\"{o}me zur
Verf\"{u}gung stand.

\section{Entschl\"{u}sselung mit einem Master Key}
\index[general]{Entschl\"{u}sselung mit einem Master Key}

Bevorzugter Weise sollten Sie immer eine unverschl\"{u }sselte Kopie
der Client-Schl\"{u}ssel an einem sicheren Ort aufbewahren.
Falls sie trotzdem verloren gehen, k\"{o}nnen Sie die gesicherten Daten
noch mittels der Master-Keys entsch\"{u}sseln.

Dazu m\"{u}ssen folgende Voraussetzungen erf\"{u}llt sein:
\begin{itemize}
\item  verketten Sie den privaten und \"{o}ffentlichen Master-Schl\"{u}ssel
  in einer einzelnen Schl\"{u}ssel-Paar-Datei, zum Beispiel mit:
   [user@host]\$ cat master.key master.cert \gt master.keypair

\item Setzen Sie den Eintrag "'PKI Keypair"` in der Client-Konfiguration auf
   die eben erzeugte Datei:

\begin{verbatim}
   PKI Keypair = master.keypair
\end{verbatim}

\item Starten Sie die Wiederherstellung, und das Master-Key-Paar
   wird zum entschl\"{u}sseln der Daten verwendet.
\end{itemize}


\section{Erstellung privater/\"{o}ffentlicher Schl\"{u}ssel}
\index[general]{Erstellung privater/\"{o}ffentlicher Schl\"{u}ssel}

Mit den folgenden Kommandos generieren Sie ein Master-Key-Paar:

\footnotesize
\begin{verbatim}
  openssl genrsa -out master.key 2048
  openssl req -new -key master.key -x509 -out master.cert
\end{verbatim}
\normalsize

Die folgenden Kommandos erstellen das Schl\"{u}ssel-Paar f\"{u}r
den Client-Dienst:

\footnotesize
\begin{verbatim}
  openssl genrsa -out fd-example.key 2048
  openssl req -new -key fd-example.key -x509 -out fd-example.cert
  cat fd-example.key fd-example.cert >fd-example.pem
\end{verbatim}
\normalsize

Bez\"{u}glich der verwendeten Datei-Erweiterung f\"{u}r die Schl\"{u}ssel
gibt es eine Menge Verwirrung. Zum Beispiel kann eine .pem-Datei folgendes
enthalten: private Schl\"{u}ssel (RSA und DSA), \"{o}ffentliche Schl\"{u}ssel
(RSA und DSA) und Zertifikate (x509). Das ist das von OpenSSLstandardm\"{a}{\ss}ig
verwendete Format. Es speichert die Daten im Base64 codiertem DER-Format,
das von ASCII-Header umgeben wird. So kann es als Text-Datei zwischen verschiedenen
Computer \"{u}bertragen werden. Eine .pem-Datei kann eine beliebige Anzahl von
entweder privaten und/oder \"{o}ffentlichen Schl\"{u}sseln enthalten.
In der Bacula-Konfiguration wird diese Datei-Erweiterung nur f\"{u}r
Dateien verwendet die jeweils einen privaten und einen \"{o}ffentlichen
Schl\"{u}ssel enthalten. Zudem wird, wie oben zu sehen, f\"{u}r
Dateien die nur einen einzigen \"{o}ffentlichen Schl\"{u}ssel enthalten
die Erweiterung .cert verwendet (als Verweis auf die x509 Zertifikats-Kodierung).

\section{Beispiel-Konfiguration mit Verschl\"{u}sselung}
\index[general]{Beispiel!Client-Konfiguration mit Verschl\"{u}sselung}

{\bf bacula-fd.conf}
\footnotesize
\begin{alltt}
FileDaemon {
   Name = example-fd
   FDport = 9102
   WorkingDirectory = /var/bacula/working
   Pid Directory = /var/run
   Maximum Concurrent Jobs = 20
 
   PKI Signatures = Yes            # aktiviert die Daten-Signierung
   PKI Encryption = Yes            # aktiviert die Daten-Verschl\"{u}sselung
   PKI Keypair = "/etc/bacula/fd-example.pem"    # private und \"{o}ffentliche Schl\"{u}ssel
   PKI Master Key = "/etc/bacula/master.cert"    # NUR der \"{o}ffentliche Schl\"{u}ssel
}
\end{alltt}
\normalsize
