You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
405 lines
12 KiB
Markdown
405 lines
12 KiB
Markdown
1 year ago
|
---
|
||
|
title: "Sistema de copias de seguridad"
|
||
|
date: 2023-03-07T02:15:04+01:00
|
||
|
draft: false
|
||
|
image: featured.png
|
||
|
categories:
|
||
|
- documentación
|
||
|
- Administración de Sistemas Operativos
|
||
|
tags:
|
||
|
- bacula
|
||
|
- copia de seguridad
|
||
|
- OpenStack
|
||
|
---
|
||
|
|
||
|
## Enunciado
|
||
|
|
||
|
Implementar un sistema de copias de seguridad para las instancias del cloud, teniendo en cuenta las siguientes características:
|
||
|
|
||
|
* Selecciona una aplicación para realizar el proceso: bacula, amanda, shell script con tar, rsync, dar, afio, etc.
|
||
|
* Utiliza una de las instancias como servidor de copias de seguridad, añadiéndole un volumen y almacenando localmente las copias de seguridad que consideres adecuadas en él.
|
||
|
* El proceso debe realizarse de forma completamente automática
|
||
|
* Selecciona qué información es necesaria guardar (listado de paquetes, ficheros de configuración, documentos, datos, etc.)
|
||
|
* Realiza semanalmente una copia completa
|
||
|
* Realiza diariamente una copia incremental o diferencial (decidir cual es más adecuada)
|
||
|
* Implementa una planificación del almacenamiento de copias de seguridad para una ejecución prevista de varios años, detallando qué copias completas se almacenarán de forma permanente y cuales se irán borrando
|
||
|
* Selecciona un directorio de datos "críticos" que deberá almacenarse cifrado en la copia de seguridad, bien encargándote de hacer la copia manualmente o incluyendo la contraseña de cifrado en el sistema
|
||
|
* Incluye en la copia los datos de las nuevas aplicaciones que se vayan instalando durante el resto del curso
|
||
|
* Utiliza una ubicación secundaria para almacenar las copias de seguridad. Solicita acceso o la instalación de las aplicaciones que sean precisas.
|
||
|
|
||
|
La corrección consistirá tanto en la restauración puntual de un fichero en cualquier fecha como la restauración completa de una de las instancias la última semana de curso.
|
||
|
|
||
|
---
|
||
|
|
||
|
El escenario es el siguiente_
|
||
|
|
||
|
![escenario](https://fp.josedomingo.org/sri2223/4_iaas/img/os.drawio.png)
|
||
|
|
||
|
| Máquina | IPs | tipo |
|
||
|
| :-: | :-: | :-: |
|
||
|
| alfa | 172.22.200.218, 172.16.0.1, 192.168.0.1 | Debian |
|
||
|
| bravo | 172.16.0.200 | Rocky Linux |
|
||
|
| charlie | 192.168.0.2 | Contenedor ubuntu |
|
||
|
| delta | 192.168.0.3 | Contenedor ubuntu |
|
||
|
|
||
|
### Preparaciones previas
|
||
|
|
||
|
Y he decidido hacer las copias de seguridad desde alfa, ya que tiene conexión directa con las otras instancias. Para ello, voy a utilizar **bacula**, junto con su interfaz web **baculum**, tras ver las características de las distintas herramientas.
|
||
|
|
||
|
Antes de la instalación, compruebo que en alfa en total se han usado en disco 4.5 GB y en bravo 1.9 GB. Como charlie y delta son contenedores, el espacio ya se ha contado en alfa. Teniendo en cuenta el espacio usado, con un disco de 30 GB debería ser suficiente para guardar las copias de seguridad, tanto incrementales como completas.
|
||
|
|
||
|
Al disco le he instalado XFS por sus características de tolerancia a fallos, y lo he añadido a `/etc/fstab` para que se monte automáticamente al iniciar el sistema.
|
||
|
|
||
|
Creo la carpeta `/bacula` en la que va a estar montado permanentemente el disco, y le cambio el propietario y los permisos:
|
||
|
|
||
|
```bash
|
||
|
mkdir -p /bacula
|
||
|
chown -R bacula:bacula /bacula/
|
||
|
chmod 755 -R /bacula
|
||
|
```
|
||
|
|
||
|
Ahora, añado la siguiente línea al fichero `/etc/fstab`:
|
||
|
|
||
|
```bash
|
||
|
UUID=5f086e6b-6937-460b-93ab-1a65a9e12544 /bacula xfs defaults 0 1
|
||
|
```
|
||
|
|
||
|
## Instalación de bacula
|
||
|
|
||
|
Primero instalo los paquetes de bacula
|
||
|
|
||
|
```bash
|
||
|
apt install bacula bacula-common-mysql bacula-director-mysql
|
||
|
```
|
||
|
|
||
|
Durante la instalacion de `bacula-director-mysql` pregunta lo siguiente, le doy a yes e introduzco la contraseña de la base de datos.
|
||
|
|
||
|
![bacula-director-mysql](https://i.imgur.com/R9BRtUi.png)
|
||
|
|
||
|
Ahora instalo baculum, primero añado los repositorios:
|
||
|
|
||
|
```bash
|
||
|
wget -qO - http://www.bacula.org/downloads/baculum/baculum.pub | apt-key add -
|
||
|
echo "deb http://www.bacula.org/downloads/baculum/stable/debian buster main
|
||
|
deb-src http://www.bacula.org/downloads/baculum/stable/debian buster main" > /etc/apt/sources.list.d/baculum.list
|
||
|
```
|
||
|
|
||
|
Primero instalo los paquetes de la api
|
||
|
|
||
|
```bash
|
||
|
apt update
|
||
|
apt-get install apache2 baculum-common baculum-api baculum-api-apache2
|
||
|
a2enmod rewrite
|
||
|
a2ensite baculum-api
|
||
|
systemctl restart apache2
|
||
|
|
||
|
```
|
||
|
|
||
|
Y ahora los paquetes de la interfaz web
|
||
|
|
||
|
```bash
|
||
|
apt-get install baculum-common baculum-web baculum-web-apache2
|
||
|
a2enmod rewrite
|
||
|
a2ensite baculum-web
|
||
|
systemctl restart apache2
|
||
|
```
|
||
|
|
||
|
#### Configuración de la api
|
||
|
|
||
|
Primero accedo a http://172.22.200.218:9096/ , introduzco el usuario y contraseña por defecto (admin/admin) y configuro la api:
|
||
|
|
||
|
![configuracion api](https://i.imgur.com/PnRV17i.png)
|
||
|
|
||
|
Ahora, para permitir el acceso a la consola de bacula, edito el fichero `nano /etc/sudoers.d/baculum-api` y añado las siguiente líneas:
|
||
|
|
||
|
```bash
|
||
|
Defaults:www-data !requiretty
|
||
|
www-data ALL = (root) NOPASSWD: /usr/sbin/bconsole
|
||
|
www-data ALL = (root) NOPASSWD: /usr/sbin/bdirjson
|
||
|
www-data ALL = (root) NOPASSWD: /usr/sbin/bsdjson
|
||
|
www-data ALL = (root) NOPASSWD: /usr/sbin/bfdjson
|
||
|
www-data ALL = (root) NOPASSWD: /usr/sbin/bbconsjson
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl start bacula-dir
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl stop bacula-dir
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl restart bacula-dir
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl start bacula-sd
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl stop bacula-sd
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl restart bacula-sd
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl start bacula-fd
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl stop bacula-fd
|
||
|
www-data ALL = (root) NOPASSWD: /usr/bin/systemctl restart bacula-fd
|
||
|
```
|
||
|
|
||
|
![sudoers](https://i.imgur.com/H6QUnsE.png)
|
||
|
|
||
|
![confuracionapi2](https://i.imgur.com/5bNs8rG.png)
|
||
|
|
||
|
![confuracionapi3](https://i.imgur.com/OygLekr.png)
|
||
|
|
||
|
![confuracionapi4](https://i.imgur.com/57Vn21e.png)
|
||
|
|
||
|
Ahora creamos un usuario y una contraseña para la api
|
||
|
|
||
|
![confuracionapi5](https://i.imgur.com/dKYQjql.png)
|
||
|
|
||
|
Configuramos, ahora si, baculum en http://172.22.200.218:9095/
|
||
|
|
||
|
![confbaculum](https://i.imgur.com/mcdrvnm.png)
|
||
|
|
||
|
y utilizamos las credenciales de la api en la configuración:
|
||
|
|
||
|
![confbaculum2](https://i.imgur.com/YnQYUAz.png)
|
||
|
|
||
|
![confbaculum3](https://i.imgur.com/fbTDdCT.png)
|
||
|
|
||
|
## Configuración del servidor en alfa
|
||
|
|
||
|
### Selecciona qué información es necesaria guardar
|
||
|
|
||
|
En todas las instancias voy a guardar el contenido de /home, /etc, /var, /opt, /usr/share (menos los archivos temporales de var). Además de esto, en diferentes instancias voy a guardar lo siguiente:
|
||
|
|
||
|
| Instancia | Servicios | Localización |
|
||
|
| --- | --- | --- |
|
||
|
| alfa | bacula | /var/log |
|
||
|
| bravo | httpd | /var/www, /etc/httpd |
|
||
|
| charlie | dns | /var/chache/bind, /etc/bind |
|
||
|
| delta | correo | /etc/postfix |
|
||
|
|
||
|
Cada día voy a hacer copias incrementales, cada semana se realizará una completa, al igual que cada mes.
|
||
|
|
||
|
Teniendo en cuenta esto, voy a configurar alfa utilizando los ficheros de configuración (por facilidad respecto a la interfaz web). Primero edito el fichero `/etc/bacula/bacula-dir.conf`, cambiando su contenido por el siguiente (es un fichero en mi github debido a la longitud del mismo):
|
||
|
|
||
|
[bacula-dir.conf](https://github.com/robertorodriguez98/bacula/blob/main/alfa/bacula-dir.conf)
|
||
|
|
||
|
compruebo que no hay errores en el fichero de configuración:
|
||
|
|
||
|
```bash
|
||
|
bacula-dir -t -c /etc/bacula/bacula-dir.conf
|
||
|
```
|
||
|
|
||
|
Y tras eso, modifico el fichero `/etc/bacula/bacula-sd.conf`,que contiene la configuración referente a los dispositivos de almacenamiento, cambiando su contenido por el siguiente (es un fichero en mi github debido a la longitud del mismo):
|
||
|
|
||
|
[bacula-sd.conf](https://github.com/robertorodriguez98/bacula/blob/main/alfa/bacula-sd.conf)
|
||
|
|
||
|
Al igual que antes, compruebo que no hay errores en el fichero de configuración:
|
||
|
|
||
|
```bash
|
||
|
bacula-sd -t -c /etc/bacula/bacula-sd.conf
|
||
|
```
|
||
|
|
||
|
y reinicio los servicios:
|
||
|
|
||
|
```bash
|
||
|
systemctl restart bacula-sd.service
|
||
|
systemctl enable bacula-sd.service
|
||
|
systemctl restart bacula-director.service
|
||
|
systemctl enable bacula-director.service
|
||
|
```
|
||
|
|
||
|
## Preparación de los clientes
|
||
|
|
||
|
### Alfa
|
||
|
|
||
|
Alfa va a ser a la vez cliente y servidor, por lo que voy a instalar el cliente también en alfa:
|
||
|
|
||
|
```bash
|
||
|
apt install bacula-client
|
||
|
systemctl enable bacula-fd.service
|
||
|
```
|
||
|
|
||
|
Ahora modifico el fichero `/etc/bacula/bacula-fd.conf`:
|
||
|
|
||
|
```bash
|
||
|
Director {
|
||
|
Name = alfa-dir
|
||
|
Password = "bacula"
|
||
|
}
|
||
|
|
||
|
Director {
|
||
|
Name = alfa-mon
|
||
|
Password = "bacula"
|
||
|
Monitor = yes
|
||
|
}
|
||
|
|
||
|
FileDaemon { # this is me
|
||
|
Name = alfa-fd
|
||
|
FDport = 9102 # where we listen for the director
|
||
|
WorkingDirectory = /var/lib/bacula
|
||
|
Pid Directory = /run/bacula
|
||
|
Maximum Concurrent Jobs = 20
|
||
|
Plugin Directory = /usr/lib/bacula
|
||
|
FDAddress = 10.0.0.247
|
||
|
}
|
||
|
|
||
|
# Send all messages except skipped files back to Director
|
||
|
Messages {
|
||
|
Name = Standard
|
||
|
director = alfa-dir = all, !skipped, !restored
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Y reinicio el servicio:
|
||
|
|
||
|
```bash
|
||
|
systemctl restart bacula-fd.service
|
||
|
```
|
||
|
|
||
|
|
||
|
### Bravo
|
||
|
|
||
|
Instalo el cliente
|
||
|
|
||
|
```bash
|
||
|
sudo dnf install bacula-client
|
||
|
```
|
||
|
|
||
|
Y edito el fichero `/etc/bacula/bacula-fd.conf` y añado las siguientes líneas:
|
||
|
|
||
|
```bash
|
||
|
Director {
|
||
|
Name = alfa-dir
|
||
|
Password = "bacula"
|
||
|
}
|
||
|
|
||
|
Director {
|
||
|
Name = alfa-mon
|
||
|
Password = "bacula"
|
||
|
Monitor = yes
|
||
|
}
|
||
|
|
||
|
FileDaemon {
|
||
|
Name = bravo-fd
|
||
|
FDport = 9102
|
||
|
WorkingDirectory = /var/lib/bacula
|
||
|
Pid Directory = /run/bacula
|
||
|
Maximum Concurrent Jobs = 20
|
||
|
Plugin Directory = /usr/lib/bacula
|
||
|
FDAddress = 172.16.0.200
|
||
|
}
|
||
|
|
||
|
Messages {
|
||
|
Name = Standard
|
||
|
director = alfa-dir = all, !skipped, !restored
|
||
|
}
|
||
|
```
|
||
|
|
||
|
```bash
|
||
|
firewall-cmd --permanent --add-port=22/tcp
|
||
|
firewall-cmd --permanent --add-port=80/tcp
|
||
|
|
||
|
firewall-cmd --permanent --add-port=9101/tcp
|
||
|
firewall-cmd --permanent --add-port=9102/tcp
|
||
|
firewall-cmd --permanent --add-port=9103/tcp
|
||
|
firewall-cmd --reload
|
||
|
```
|
||
|
|
||
|
|
||
|
### Charlie y delta
|
||
|
|
||
|
La configuración en charlie y delta es similar, por eso la pongo junta:
|
||
|
|
||
|
```bash
|
||
|
sudo apt install bacula-client
|
||
|
```
|
||
|
|
||
|
Y edito el fichero `/etc/bacula/bacula-fd.conf`:
|
||
|
|
||
|
```bash
|
||
|
Director {
|
||
|
Name = alfa-dir
|
||
|
Password = "bacula"
|
||
|
}
|
||
|
|
||
|
Director {
|
||
|
Name = alfa-mon
|
||
|
Password = "bacula"
|
||
|
Monitor = yes
|
||
|
}
|
||
|
|
||
|
FileDaemon { # this is me
|
||
|
Name = delta-fd
|
||
|
FDport = 9102 # where we listen for the director
|
||
|
WorkingDirectory = /var/lib/bacula
|
||
|
Pid Directory = /run/bacula
|
||
|
Maximum Concurrent Jobs = 20
|
||
|
Plugin Directory = /usr/lib/bacula
|
||
|
FDAddress = 192.168.0.3
|
||
|
}
|
||
|
|
||
|
# Send all messages except skipped files back to Director
|
||
|
Messages {
|
||
|
Name = Standard
|
||
|
director = alfa-dir = all, !skipped, !restored
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Y reinicio el servicio:
|
||
|
|
||
|
```bash
|
||
|
systemctl restart bacula-fd.service
|
||
|
```
|
||
|
|
||
|
Ahora, con todos los cliente configurados, reinicio los servicios de bacula en alfa:
|
||
|
|
||
|
```bash
|
||
|
systemctl restart bacula-fd.service
|
||
|
systemctl restart bacula-sd.service
|
||
|
systemctl restart bacula-director.service
|
||
|
```
|
||
|
|
||
|
y hago una prueba de conexión usando la consola de bácula y la interfaz web:
|
||
|
|
||
|
```bash
|
||
|
bconsole
|
||
|
```
|
||
|
|
||
|
![bconsole](https://i.imgur.com/PCa4pzo.png)
|
||
|
|
||
|
|
||
|
![web](https://i.imgur.com/EWP7PH0.png)
|
||
|
|
||
|
## Nodos de almacenamiento
|
||
|
|
||
|
Ahora voy a crear los nodos de almacenamiento con bconsole
|
||
|
|
||
|
```bash
|
||
|
bconsole
|
||
|
```
|
||
|
|
||
|
![bconsole](https://i.imgur.com/pkpErri.png)
|
||
|
|
||
|
También se puede hacer desde la interfaz web:
|
||
|
|
||
|
![web](https://i.imgur.com/DKz9aUK.png)
|
||
|
|
||
|
Realizo la misma configuración para vol-semanal y vol-mensual.
|
||
|
|
||
|
Podemos ver que se han creado los volúmenes:
|
||
|
|
||
|
![web](https://i.imgur.com/WOVsDgp.png)
|
||
|
|
||
|
## Restauración
|
||
|
|
||
|
Voy a realizar la restauración por medio de la interfaz web. Para ello utilizo la opción de Perform restore y sigo los siguientes pasos:
|
||
|
|
||
|
![web](https://i.imgur.com/WpBBp3u.png)
|
||
|
|
||
|
![web2](https://i.imgur.com/g4kd0Ri.png)
|
||
|
|
||
|
![web3](https://i.imgur.com/SYrgbek.png)
|
||
|
|
||
|
![web4](https://i.imgur.com/0Z7Z7Zg.png)
|
||
|
|
||
|
Selecciono qué quiero copiar y donde:
|
||
|
|
||
|
![web5](https://i.imgur.com/rgz94GM.png)
|
||
|
|
||
|
![web6](https://i.imgur.com/DlrJT2c.png)
|
||
|
|
||
|
y que reemplace los ficheros más antiguos:
|
||
|
|
||
|
![web7](https://i.imgur.com/Y38EHgZ.png)
|
||
|
|
||
|
Cuando acabe puedo ver que se ha ejecutado con éxito:
|
||
|
|
||
|
![web8](https://i.imgur.com/6Gok1iW.png)
|