Esta semana tocó configurar Bacula. La configuración básica del servicio es bastante sencilla y ponerlo a funcionar suele no llevar mucho. Sin embargo, si estás pensando en realizar backup remoto o entre diferentes redes, la opción de que los datos viajen cifrados, no es discutible. Incluso dentro de la propia red local no debería de serlo.
Por suerte, Bacula ya trae soporte para cifrar los datos mediante certificados TLS. Y es importante que tanto la parte cliente como la parte servidor traigan dicho soporte. Para comprobarlo, podemos emplear el comando ldd contra el binario de Bacula.
shell> ldd /usr/sbin/bacula-dir
libcrypt.so.1 => /lib/libcrypt.so.1
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8
...
shell> ldd /usr/sbin/bacula-fd
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8
...
Si vuestros servicios tienen soporte SSL, entonces podemos seguir leyendo la entrada. Si por el contrario el paquete del que dispones no viene con soporte SSL, intenta actualizarlo o compilarlo para que sí lo soporte.
Crear los certificados
Lo primero que debemos hacer es crear los certificados para los equipos. La parte más importante aquí es aclarar que cada equipo tendrá unos certificados diferentes y por lo tanto, los siguientes 4 pasos habrá que repetirlos en cada uno de los equipos en los que vaya algún componente de Bacula.
- Clave privada del equipo
Esta va a ser la llave maestra para el equipo.
shell> openssl genrsa -des3 -out a.local.net.key 4096
- Solicitud de certificado
Con la clave anteriormente creada generamos una solicitud de certificado. Es importante que estos datos se rellenen correctamente y en especial la parte del Common Name, que debe ser el FQDN del equipo.
shell> openssl req -new \
-key a.local.net.key \
-out a.local.net.csr
Enter pass phrase for a.local.net.key:
...
Organizational Unit Name (eg, section) []:Elmundoenbits
Common Name (e.g. server FQDN) []:a.local.net
...
- Firmamos la solicitud con una CA conocida
En este caso, recomiendo recurrir a
cacert.org como CA. La creación de la cuenta es gratuita y puedes firmar todas las solicitudes que desees, siempre que tengas permiso para el dominio.
En caso de que tu sistema no tenga el certificado raíz del CACert, lo puedes descargar desde
aquí y le vamos a llamar
cacert.pem.
- Generamos la clave sin contraseña
Finalmente y puesto que Bacula no permite trabajar con certificados con contraseña, necesitamos exportar la clave privada (paso 1) a la versión sin contraseña.
shell> openssl rsa \
-in a.local.net.key \
-out a.local.net-nopass.key
shell> mv a.local.net-nopass.key a.local.net.key
Como dije, estos pasos los repetiremos para cada uno de los equipos. Para el ejemplo que aquí manejamos, tendremos dos equipos. El equipo servidor de Bacula (bacula.local.net), para el que tenemos los siguientes ficheros disponibles:
- cacert.pem
- bacula.local.net.cert
- bacula.local.net.key
Y el equipo cliente, a.local.net, con sus tres ficheros correspondientes,
- cacert.pem
- a.local.net.cert
- a.local.net.key
director - bconsole
Lo primero que debemos hacer ahora es indicarle al software de consola (bconsole) que para conectarse al bacula-director debe de emplear certificados TLS. Para ello editamos el fichero bconsole.conf y añadimos las opciones de TLS.
Director {
...
TLS Enable = yes
TLS Require = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/bacula.local.net.cert
TLS Key = /etc/bacula/tls/bacula.local.net.key
}
Y a continuación, debemos de indicarle a la parte contrarios (director) exactamente lo mismo (fichero bacula-dir.conf).
Director {
...
TLS Enable = yes
TLS Require = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/bacula.local.net.cert
TLS Key = /etc/bacula/tls/bacula.local.net.key
}
Con ello, ya es posible conectarse con bconsole a Bacula para realizar comprobaciones.
director - bacula-sd
A continuación, hay que establecer la comunicación cifrada entre el director y el storage. Para ello nos toca editar el fichero bacula-sd.conf y en el apartado Director, añadirle las opciones TLS. Como siempre,
Director {
...
TLS Enable = yes
TLS Require = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/bacula.local.net.cert
TLS Key = /etc/bacula/tls/bacula.local.net.key
}
Y a continuación, en el fichero bacula-dir.conf, editar el apartado Storage y también añadir las opciones TLS.
Storage {
...
TLS Enable = yes
TLS Require = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/bacula.local.net.cert
TLS Key = /etc/bacula/tls/bacula.local.net.key
}
bacula-fd - bacula-sd
La que citamos a continuación es quizás la parte más importante en la que aplicar el cifrado, ya que es la que se encarga de enviar y recibir los datos. Por lo tanto, nos interesa mucho que estos sí estén cifrados. Para hacerlo editamos nuevamente el fichero bacula-sd.conf y en el apartado Storage añadimos los TLS,
Storage {
...
TLS Enable = yes
TLS Require = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/bacula.local.net.cert
TLS Key = /etc/bacula/tls/bacula.local.net.key
}
y en cada uno de los clientes (fichero bacula-fd.conf) hacemos lo correspondiente,
FileDaemon {
...
TLS Enable = yes
TLS Require = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/a.local.net.cert
TLS Key = /etc/bacula/tls/a.local.net.key
}
bacula-fd - director
Para finalizar toda la configuración lo que nos queda es realizar la comunicación entre el director y el cliente también cifrada. Para ello, fichero bacula-dir.conf, apartado del cliente,
Client {
...
TLS Enable = yes
TLS Require = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/bacula.local.net.cert
TLS Key = /etc/bacula/tls/bacula.local.net.key
}
Y en el fichero del cliente (bacula-fd.conf),
Director {
...
TLS Enable = yes
TLS Require = yes
TLS Verify Peer = yes
TLS CA Certificate File = /etc/bacula/tls/cacert.pem
TLS Certificate = /etc/bacula/tls/a.local.net.cert
TLS Key = /etc/bacula/tls/a.local.net.key
}
Para terminar, reiniciamos los servidor
bacula-sd,
bacula-dir y los
bacula-fd que correspondan. Si no hay ningún problema, la comunicación debería de estar cifrada en el servicio funcionando perfectamente.
Referencias