fritz servidor de almacenamiento con raspberry pi

Raspberry pi como servidor de almacenamiento

Soy una persona que hace copias de seguridad. De todo. Siempre. No me vale lo de que no hacen falta, que soy un exagerado ni ninguna otra excusa. Backup y punto. Y cifrados. Y siguiendo la regla del 3-2-1. Y con un armario de comunicaciones adecuado.

Además, me encantan las Raspberry Pi, la idea y cómo la han llevado a cabo y tengo varias con las que experimento. Como también me gusta tener un montón de servicios alojados entre mi casa y los servidores dedicados, son un estupendo (y barato) medio con los que pasar horas. Así que creo que es justo advertir que esta entrada va sobre cómo des-complicarte la vida usando el software adecuado, una raspi y un par de discos duros.

El laberinto del backup

Hace ya unos años que expliqué cómo tener una NAS usando una raspberry pi y un disco mecánico de un tera y lo llamé ranas (si, el chiste es bastante malo).

En ranas terminaban los backups de todos los ordenadores de casa y estuvo funcionando hasta hace un par de meses, empleando un total de dos raspis porque la original de las fotos se quemó. También hacía backup de los datos de los servidores en otra raspi que tenía muchas tareas, algunas demasiado importantes como para estar pendiente de las copias de seguridad.

Hace unos meses me surgió la necesidad, nacida de la paranoia todo hay que decirlo, de hacer copia de los ficheros que tengo en la nube privada. Porque, por mucho que me repitiese que había copia de los ficheros en más de un sitio, la realidad es que es muy sencillo perderlo todo por un fallo en el servidor que se propague a los clientes. Ya contaba con backup de la base de datos y de la configuración pero, sólo yo tengo casi 30 gigas de datos y de haberlo enviado a ranas habría llenado el disco.

También teníamos otro disco compartido por samba donde dejaba películas y videos para poder verlos tranquilamente en el proyector. Este volumen llegué a conectarlo al router en un intento de darle mayor velocidad porque a veces se desincronizaba todo y no había forma de ver series y hasta hace no mucho no me di cuenta de que el problema era el acceso, estaba usando el protocolo equivocado.

Los backups via NAS se hacían usando samba, lo mismo que el volumen compartido mientras que las copias de los datos de servidores van por rsync sobre ssh. Usaba un total de dos raspberrys, dos discos duros mecánicos, varios scripts propios y un puñado de usuarios desperdigados por los servidores (no me bajaréis de esta burra). Al final, tenía una mezcla heterogenea (por decirlo suavemente) de discos, protocolos y raspis que lo hacía todo complicado de entender y gestionar y, entonces, algo fantástico sucedió…

fritz servidor de almacenamiento con raspberry pi
fritz servidor de almacenamiento con raspberry pi

El plan

Decidí dejar mis scripts y configuraciones a medida, de reinventar la rueda, y me propuse pasar a usar una solución NAS más completa. Buscaba una solución que me permitiera almacenar los backups, tanto de servidores como de la nube privada, servir de NAS para los equipos de casa y algún otro servicio alternativo como resultó ser DNLA.

Tras dar unas cuantas vueltas llegué a Open Media Vault, una solución open source basada en Debian GNU/Linux y que se puede instalar en raspis. Me animé a probarla en una Raspberry 3B que tenía ociosa y me encantó. Me daba un punto centralizado de gestión (adiós varios usuarios distribuidos por las raspis), una interfaz sencilla y todos los protocolos que usaba en un mismo lugar y, además, me recordó que si quieres hacer streaming de video lo mejor no es samba sino DNLA. En apenas un par de días tenía todos los backups y el volumen compartido en una única raspi con un disco SSD de 720 GB funcionando rápido y bien. Y las series ahora ya no se trababan :D.

Con la llegada de las navidades y las ofertas en informática que les acompañan, me decidí a comprar un kit de iniciación a las raspis con una 4B de 4 GB y un par de discos duros SSD de 1TB, provenientes de China. Entre las raspis 3B y las 4B hay una diferencia crucial si estás pensando en montar un servidor NAS y es que en la primera los puertos USB y la tarjeta de red (de 100Mb) comparten interrupción, esto es, que se pisan cuando se hace un uso intensivo de ambos. Como la idea de las NAS es coger por red lo que guardas en el disco duro externo, la tragedia se masca y el proceso es más lento. Las 4B tienen interrupciones independientes para los puertos USB y la tarjeta de red Gigabit y, dos de los cuatro puertos USB son 3.0. En ranas tenía un cable con doble entrada USB para alimentar al disco mecánico y no comenzase con la musiquita del tic-tic-tic-tic, que indicaba que no tenía suficiente alimentación. Ahora ya no es necesario para ninguno de los dos discos SSD. Es más, si me da el aire puede que le añada un tercer disco con el cable doble en los puertos 2.0.

Mi plan maligno era montar un nuevo servidor de almacenamiento usando la nueva raspi y los dos discos SSD y que diese soporte a los backups, al NAS y al volumen compartido. Es decir, iba a montar OpenMediaVault usando un hardware significativamente mejor y más rápido.

Era la hora de dar vida a fritz.

Securización

Habitualmente suelo configurar las raspis como si fuese un servidor más, porque lo son, y les aplico unas configuraciones estrictas que garanticen un mínimo de seguridad. Cuando monté OpenMediaVault (OMV a partir de ahora) por primera vez me di cuenta que no puedo aplicar mis configuraciones porque espera precisamente que sea una raspi sin modificaciones.

Así que, con esta limitación en mente, me propuse conseguir la configuración más segura posible, con los siguientes puntos:

  1. utilizar sólo usuarios creados en OMV
  2. el acceso por ssh se hará sólo con clave pública y sólo para los usuarios seleccionados. Root ni siquiera debería ser una opción.
  3. dejar al usuario pi vacío, sin ninguna modificación salvo la contraseña. Ni clave pública ni acceso a ningún servicio
  4. usar sólo los servicios que necesito, el resto anularlos o quitarlos
  5. todos los backups deben estar cifrados. El resto del contenido ya tal
  6. los usuarios accederán a su directorio y a nada más. Nada de usuarios para varios servicios y con acceso a todo

La configuración en OMV

  • cambiar contraseña de admin a una muy compleja.
  • crear un certificado y aplicarlo al sitio:
    • usar certificado nuevo y forzar ssl
  • habilitar monitorización
  • discos ssd
    • conectar, detectar y formatear los dos discos de 1TB
    • montarlos y salvar la configuración para hacer el cambio perdurable.
  • smart
    • activar smart para ssd1TBmedia
    • activar smart para ssd1TBbackup
  • nfs: desactivar
  • ftp: desactivar
  • rsync: desactivar
  • usuarios y grupos
    • crear usuarios virtuales
      • añadir clave pública
      • dar acceso por ssh
  • ssh
    • sólo autenticación por clave pública.
    • añadir opción Match Address 192.168.1.*
  • directorios home de usuarios
    • activar
  • carpetas compartidas
    • permisos: 700
    • accesible sólo por usuario
el dashboard de OMV

El script

Aquí dejo el script que he utilizado para la clonación de raspbios, instalación y la configuración de OMV. ¡OJO!! Se trata de un script personal, casero y perfectamente falible. Declino toda responsabilidad si, por ejemplo, lo aplicas a tu raspi y formateas algo que no debas xD.

export HOST='raspi'
export DOMN='example.com'
export FQDN="$HOST.$DOMN"

cd ~/descargas
unalias ls
if [ ! `ls *raspios*lite*img` ] ; then
    unzip *raspios*lite*zip
fi
IMG=`ls *raspios*lite*img`
SD="/dev/XXXXX" # ¡¡ojo!! esto puede ser una tarjeta SD
SD1="${SD}1"
SD2="${SD}2"
sudo umount /mnt/*
sudo umount /media/diego/*
sudo dd if=$IMG of=$SD bs=4M status=progress

sudo mkdir -p /mnt/boot /mnt/rootfs
sudo mount "$SD1" /mnt/boot/
sudo mount "$SD2" /mnt/rootfs/

# activo ssh desde el inicio
sudo touch /mnt/boot/ssh

cd /mnt/rootfs

# uso tmpfs para ciertos directorios
echo "
tmpfs       /tmp        tmpfs   defaults,noatime,mode=1777,size=50m  0   0
tmpfs       /var/tmp    tmpfs   defaults,noatime,mode=1777,size=50m  0   0
tmpfs       /run        tmpfs   defaults,noatime,mode=1777,size=50m  0   0
" | sudo tee --append etc/fstab

echo "127.0.0.1 $FQDN $HOST
127.0.0.1 localhost.localdomain localhost
:1        localhost ip6-localhost ip6-loopback
ff02::1   ip6-allnodes
ff02::2   ip6-allrouters" | sudo tee etc/hosts
echo $HOST | sudo tee etc/hostname
figlet $FQDN | sudo tee etc/motd

# evito que se pida contraseña a los usuarios del grupo sudo
sudo sed -i 's|^%sudo\tALL=(ALL:ALL) ALL|%sudo\tALL=(ALL) NOPASSWD:ALL|g' etc/sudoers

cd
sudo umount /mnt/boot
sudo umount /mnt/rootfs
sudo rmdir /mnt/boot /mnt/rootfs

Hay que conectarse vía SSH una vez más, ssh pi@raspi.

sudo passwd pi # imprescindible poner una contraseña MUY segura

# elimina el mensaje que aparece si la wlan no está configurada
sudo rfkill unblock `rfkill | grep wlan | awk '{print $1}'`

# limpieza de sources.list
sudo sed -i '/^#/d'      /etc/apt/sources.list
sudo sed -i '/^$/d'      /etc/apt/sources.list
sudo sed -i '/deb-src/d' /etc/apt/sources.list
#sudo sed -i 's/$/contrib non-free/' /etc/apt/sources.list
sudo sed -i '/^#/d'      /etc/apt/sources.list.d/raspi.list
sudo sed -i '/^$/d'      /etc/apt/sources.list.d/raspi.list
sudo sed -i '/deb-src/d' /etc/apt/sources.list.d/raspi.list

# quito paquetes que no necesito
sudo apt purge -y alsa-utils triggerhappy wpasupplicant pi-bluetooth bluez bluez-firmware cpp* dmidecode g++* gcc-[4567]* gdb* geoip-database build-essential tcc* dpkg-dev luajit libluajit-5.1-common nano ncdu patch plymouth libplymouth4 tasksel tasksel-data traceroute rpcbind samba-common v4l-utils xdg-user-dirs cifs-utils dbus libdbus-*

# actualizo e instalo imprescindibles
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y bash-completion vim ntp htop
sudo apt purge -y `dpkg -l | grep ^rc | awk '{print $2}'`
sudo apt autoremove -y
sudo apt clean

# núcleo de 64 bits
sudo rpi-update
echo -e "\n# 64 bits\narm_64bit=1" | sudo tee -a /boot/config.txt

# OpenMediaVault prerequisitos
sudo rm -f /etc/systemd/network/99-default.link
sudo reboot && exit

# OpenMediaVault instalación
sudo mkdir -p /var/log/nginx # normalemente no es necesario pero por si acaso
sudo mkdir -p /var/log/samba # normalemente no es necesario pero por si acaso
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

# detengo nfs y portmap
sudo systemctl stop nfs-server.service
sudo systemctl disable nfs-server.service
sudo systemctl stop portmap.service
sudo systemctl disable portmap.service

Conclusiones

Esta nueva raspi es considerablemente más rápida y no sólo a nivel de red sino que los 4 GB de RAM se notan y mucho. El cambiar los discos mecánicos por otros SSD y usar puertos USB 3.0 en vez de los 2.0 también le añaden un buen montón de rendimiento y potencia al conjunto.

En cuanto a OpenMediaVault me parece una verdadera joya que funciona muy bien a pesar de no tener debajo un servidor propiamente dicho. Me encantaría verlo funcionar en un hardware potente, con varios discos y un buen puñado de CPU y RAM, tiene que ser una delicia. En mi caso, primaba el bajo consumo y la ausencia de ruido.

Algo que sí me gustaría poder hacer en OMV es desactivar los servicios que no se usan, al igual que sucede con los plugins. Pero vienen metidos en el core de la aplicación y no he encontrado la forma (aún). Es púramente estético porque los servicios no están funcionando ni escuchando en ningún puerto pero es lo que siempre hago y la cabra tira al monte.

Sentimos molestarte con lo de las Cookies, pero es por imperativo legal. Puedes ver aquí la Política de Cookies, si continúas navegando te informo que la estás aceptando ;)    Ver
Privacidad