Instala tu propio servidor de almacenamiento en la nube con Seafile + HTTPS en una Raspberry Pi y conviértete en el responsable de tu propios datos

Fuente: http://xkcd.com/1117/

Fuente: http://xkcd.com/1117/

Cloud” es una de esas palabras rimbombantes tan de moda en la tecnología, como lo fue en su momento “outsourcing“, “virtualización“, “datamining” y más recientemente cualquier cosa que empiece con el prefijo “ciber“. Todas las empresas quieren implementar los últimos desarrollos tecnológicos, aunque a veces ni siquiera los entiendan ni identifiquen los potenciales riesgos a los que se enfrentan (problemas de privacidad, de cumplimiento, de disponibilidad, de dependencia de proveedores, etc.). Igualmente, como usuarios somos susceptibles a caer ante la tentación de usar nuevas tecnologías ya sea por las campañas de marketing salvaje que nos saturan (para estar en la onda “cool”), la presión de nuestros propios colegas o la necesidad operativa para no quedarse relegado con tecnologías “obsoletas”.

Este es el caso del “Cloud” (computación en la nube): Delegación de servicios y procesos informáticos a un proveedor que te ofrece una serie de servicios adicionales sin la necesidad de que dispongas de plataformas, infraestructuras y/o aplicaciones. Dentro de los beneficios obtenidos de este tipo de modelos se encuentra el precio de los servicios (casi siempre calculado con base en el uso por tiempo), la escalabilidad (ya que el proveedor suela contar con replicación en diferentes datacenters) y rendimiento (ya que el uso de los recursos es monitorizado y gestionado automáticamente). No estoy en contra de esta tecnología, por el contrario, es interesante implementarla pero es recomendable la ejecución previa de un análisis de riesgos que nos permita identificar amenazas, vulnerabilidades y gestionar controles de seguridad con base en los datos “compartidos” y “delegados” al proveedor de Cloud.

Uno de los elementos principales a tener en cuenta es la privacidad. Debido a la “omnipresencia” provista por la computación en la nube, los datos son replicados en múltiples lugares para garantizar su recuperación en caso de problemas y su disponibilidad independientemente de la ubicación. No obstante, ¿sabes en dónde estarán físicamente almacenados tus datos? ¿quién tendrá acceso a los mismos? y ¿se aplican los controles de cumplimiento y legislación local del país de origen de dichos datos en cada lugar en donde son replicados (como la LOPD española – por ejemplo – si el CPD está en USA)?

Dejando de lado el ámbito empresarial y limitándonos al uso del Cloud como usuarios, ¿nos otorgan estas soluciones los niveles de seguridad que queremos implementar para nuestros propios datos? He aquí un par de ejemplos en donde este criterio ha sido vulnerado:

  • Microsoft analizó y bloqueó los datos de un usuario almacenados en su servicio SkyDrive (ahora OneDrive) por contenido ofensivo. Sin embargo, ¿por qué Microsoft estaba espiando los datos personales de un usuario de su servicio sin su permiso? (info)
  • Las fotos y videos privados de múltiples celebridades almacenados en el servicio iCloud de Apple fueron extraidas y publicadas de forma no autorizada en Internet (info)
  • Análisis (no comprobados) de un consultor independiente apuntaban a que el servicio de almacenamiento en la nube Dropbox tenía acceso a todos los archivos almacenados en el equipo del usuario, fuera de la carpeta que explícitamente se había indicado para que fuera sincronizada (info)

La respuesta del usuario promedio podría ser: “Mis datos almacenados en la nube no tienen valor sino únicamente para mi” o “no tengo nada que ocultar”. Pero, ¿son estas las justificaciones para permitir la pérdida de privacidad y potencial espionaje? Yo creo que no.

Es por eso que en términos personales he optado por renunciar a este tipo de servicios e implementar mi propio servidor de almacenamiento en la nube aprovechando el hardware provisto por una Raspberry Pi y usando la solución Seafile, que cuenta con altas prestaciones en términos de encriptación y disponibilidad.

Al igual que Seafile, existen otras muchas soluciones similares, dentro de las que se encuentran (por solo nombrar algunas):

Es importante aclarar que esta aplicación cuenta con una documentación bastante detallada, que se recomienda verificar como complemento a este manual.

No siendo más, procedamos con la instalación de Seafile en una Raspberry Pi.

Instalar el servidor de Seafile

Pre-requisitos

Antes de proceder, es necesario que se haya definido previamente lo siguiente:

  • Conexión a Internet y redirección de puertos: La Raspberry Pi debe estar conectada a Internet ya sea directamente o detrás de un router/firewall, con posibilidad de apertura de puertos (NAT/PAT). Se debe permitir tráfico entrante a los siguientes puertos:
    • 8000
    • 8082
  • Si se quiere emplear HTTPS con stunnel (como se explicará más adelante) hay que hacer la siguiente redirección de puertos:
    • 8000 -> 8001
    • 8082 -> 8083

La siguiente es un ejemplo de configuración (router inalámbrico Livebox Fibra Orange):

  • Un nombre de host y de dominio válidos y/o una dirección IP fija: Si deseas que el servicio se pueda acceder desde internet, necesitas alguna de estas dos cosas. En el caso que tengas una dirección IP dinámica (que por lo general es lo que ofrecen las ISP), entonces puedes registrar un nombre de dominio asociado empleando servicios como no-ip.com o cualquiera de los enumerados aquí.
  • Un directorio en el cual almacenar los datos que se van a sincronizar: Este directorio debe tener suficiente espacio. Preferiblemente un disco duro externo.

Actualizar el sistema operativo de la Raspberry Pi

En mi caso tengo instalado Raspbian.

Descargar el paquete de instalación de la página oficial de Seafile

En la página de Seafile se encuentra el paquete específico para Raspberry Pi. Se puede encontrar en la página principal del proyecto o en su repositorio de código en GitHub. Descargar la última versión.

Descomprimir el paquete

Instalar dependencias

Ejecutar el script de instalación

Este script instalará los componentes Seafile (seaf-server) para la gestión de la sincronización de archivos y Ccnet (ccnet-server) para la comunicación interna entre componentes.

Configurar el servicio

En este punto, es importante tener a mano el nombre de host y de dominio y la ruta en donde se almacenarán los datos:

Configurar SeaHub (Interface Web)

Este paso es opcional y depende si quieres una consola web o no. De acuerdo con la arquitectura de la aplicación, éste es un componente independiente, pero lo recomendable es instalarlo ya que desde aquí se permitirá el acceso vía web a los usuarios y se contará con una consola de administración gráfica.

Finalizar la instalación de componentes

En este punto se nos indicarán los scripts para la gestión de los componentes y los puertos de comunicación, que usaremos más adelante.

Iniciar el servidor de Seafile

Iniciar el servidor de SeaHub y parametrizarlo

Ingresar en la consola como administrador

En este paso ya todo el proceso de instalación está finalizado y Seafile estará totalmente operativo.

Para validarlo, simplemente ingresar a la dirección IP o al hostname definido en el puerto 8000 (http://[nombre o dirección]:8000):

Configurar Seafile para que inicie en cada reinicio

Otra opción es agregarlo a /etc/rc.local como lo uso yo (esto solo aplica para Raspbian 7):

Si usas Raspbian 8 (o cualquier otra distribución que soporte systemd), se le deben ejecutar las siguientes instrucciones para que cargue los servicios cuando el sistema operativo inicie:

Más información en este enlace.

Configurar el acceso vía HTTPS (opcional)

Configuración para nginx y Apache

Para configurar el acceso seguro vía HTTPS (no soportado de forma nativa por Seafile) es necesario ejecutar pasos adicionales dependiendo del servidor web que se emplee:

Estas configuraciones implican que adicionalmente a los servicios de Seafile nativos es necesario instalar uno de estos dos servidores web. El problema es que estos servicios consumirán recursos adicionales en la Raspberry Pi, un dispositivo con hardware y rendimiento limitado.

Configuración para gunicorn (servidor web nativo de Seafile) y stunnel

La alternativa que describo en este manual permite agregar la capa de seguridad HTTPS sin penalizar el desempeño, funcionando exclusivamente con el servidor web nativo de seafile: gunicorn. Para ello, se hará uso de stunnel, un servicio de tunelización TLS para aplicaciones que no cuentan con soporte nativo de este protocolo.

Para que todo el servicio funcione, es necesario contar con un certificado digital válido para el nombre y dominio de la Raspberry Pi. Este punto es importante, porque si el certificado digital no cuenta con una lista de revocación válida (certificate revocation list – CRL), entonces el cliente de Seafile generará errores y no permitirá la conexión. Por ello, se hará uso de Let’s Encrypt y CertBot.

Instalación de CertBot y generación de certificados digitales

Para instalar CertBot, simplemente ejecutar el siguiente comando (se asume que la instalación se hace en Raspbian 9:

Después de la instalación, es necesario hacer un paso intermedio, que consiste en habilitar el puerto 80 temporalmente para permitir tráfico entrante. Esto debido a que CertBot (vía Let’s Encrypt) requiere realizar una validación de que el nombre de dominio al cual le generará el certificado es un dominio válido y existente.

Cuando esté habilitado el tráfico entrante al puerto 80, ejecutar el siguiente comando:

Cambiar “server.com” por el nombre de dominio o dirección IP de la Raspberry Pi.

Al finalizar el proceso, se habrán creado 4 archivos en la ruta /etc/letsencrypt/live/[nombre dominio]:

Para este caso, necesitaremos solamente fullchain.pem (el certificado completo incluyendo CRL y toda la jerarquía) y privkey.pem (la clave privada).

Los certificados digitales de Let’s Encrypt son válidos únicamente por 90 días. No obstante, CertBot se encarga de actualizarlos de forma automática.

No olvidar cerrar el puerto 80.

Instalación de stunnel

Finalizada la generación de certificados, se procede con la instalación de stunnel (en este caso, la versión 4):

Luego, editar el fichero /etc/default/stunnel4 y cambiar la variable “ENABLED” a 1.

Para poder gestionar el servicio empleando systemctl, es necesario crear un archivo de parámetros llamado “stunnel.service” en /lib/systemd/system:

Y luego lo habilitamos para funcionar vía systemctl:

Parametrización de stunnel e inicialización

Editamos el archivo /etc/stunnel/stunnel.conf. Cambiar “server.com” por el nombre de dominio asignado a la Raspberry Pi:

En este archivo creamos dos túneles HTTPS:

  • Uno para seafile, que escuchará en el puerto 8001 y redireccionará el tráfico al puerto local 8000, y
  • Otro para seahub, que escuchará en el puerto 8083 y redireccionará el tráfico al puerto local 8082.

Ambos túneles emplearán el mismo certificado digital creado anteriormente.

Hecho esto, iniciamos stunnel:

Con esto, lo que hemos hecho es lo siguiente:

Para ver que todo esté funcionando correctamente, en vez de ir a http://[nombre o dirección]:8000 iremos a https://[nombre o dirección]:8000.

Si hay problemas, se puede revisar el log de stunnel:

A partir de ahora tanto la consola de administración como la sincronización de archivos en los clientes Windows y móviles se hará por protocolo HTTPS.

Actualización del servidor de Seafile

En el caso que se quiera realizar una actualización del software del servidor de Seafile, el proceso está bastante automatizado. En este caso, se realizará una actualización de la versión 6.2.5 a la 6.2.6 como ejemplo.

Descargar la nueva versión del paquete de Seafile

Descomprimir el paquete

Detener los servicios de Seafile y SeaHub

Localizar y ejecutar el script de actualización

En la carpeta /upgrade del directorio del paquete descomprimido se encuentran una serie de scripts de actualización. Simplemente, ejecutar el script relacionado con la versión instalada actualmente:

En este caso, como tengo instalada la versión 6.2.5 y quiero pasar a la 6.2.6, simplemente ejecuto el script “minor-upgrade.sh”. Si es un cambio mayor de versión, ejecuto el script que corresponda:

Reiniciar el nuevo servidor actualizado

Instalación del cliente de Seafile

En la página oficial de descargas de Seafile se encuentran los clientes para Windows, Mac, Android, Linux y en modo terminal (CLI).

Instalar y configurar el cliente de Seafile en Windows

Después de descargar el cliente, simplemente instalarlo. al finalizar la instalación, indicar la ubicación en donde se desea que queden almacenados los archivos sincronizados:

Configurar el acceso para la sincronización con los datos recién creados del servidor Seafile:

En este punto – y dependiendo si se ha usado HTTPS o no- se debe ingresar la URL correspondiente.

Crear el disco virtual de almacenamiento. Las carpetas creadas en Seafile se denominan “Bibliotecas” (Library):

El agente ya estará listo para sincronizar:

Una característica MUY INTERESANTE de Seafile es la capacidad de crear bibliotecas cifradas. Esto lo hace a través de una contraseña y algoritmos de encriptacion robustos (AES 256/CBC). Las bibliotecas cifradas siempre requerirán de la contraseña en el momento de ser compartidas o accedidas ya sea a través de la consola web o del agente local:

Al sincronizar, nos pedirá la contraseña:

Instalar el agente de Seafile en Android

Desde Google Play simplemente descargar la aplicación de Seafile y configurarla con los datos del servidor:

Configurar la cuenta registrada en el servidor de Seafile:

Y sincronizar:

Inclusive, en Android si la carpeta está cifrada se pedirá la contraseña para efectuar la sincronización:

Desinstalar Dropbox y quitarte de encima el problema de que no respeten tu privacidad

¡Adiós Dropbox! (aunque si aún quieres seguirlo utilizando, puedes mejorar tu seguridad encriptando todos tus datos con InstantCryptor, CloudFogger, Cryptomator o Boxcryptor)

¿Interesante? Si te ha gustado, no olvides comentar y/o compartirlo por las redes sociales. Compartir es crecer 😉

Comments

  • Buenas,

    Antes de nada agradecerte las molestias que te has tomado para hacer este magnífico tutorial.

    Me surge un problema a la hora de que el programa se arranque tras el reinicio. He seguido los pasos descritos en el apartado 11 (tanto contrab como rc.local) y no consigo que el programa arranque tras reiniciar. ¿Qué puedo hacer?

    Gracias de antemano.

    Barukh September 18, 2015
    • Hola de nuevo:
      Échale un vistazo a este artículo: “Cómo activar el soporte para rc.local de initscripts (SysVInit) en systemd”. Supongo que en tu caso tendrás Raspbian 8 y por eso es el problema.
      Adicionalmente, creo que a partir de la versión 5 de Seafile ya se incluyen scripts para compatibilidad con systemd y solo tienes que hacer lo siguiente:
      [email protected] ~ # systemctl enable seafile
      Created symlink from /etc/systemd/system/multi-user.target.wants/seafile.service to /etc/systemd/system/seafile.service.
      [email protected] ~ # systemctl enable seahub
      Created symlink from /etc/systemd/system/multi-user.target.wants/seahub.service to /etc/systemd/system/seahub.service.
      Espero que te sirva.

      david December 30, 2015
  • Hola Barukh:

    Valida que bajo /opt exista un link a la última versión de Seafile que tengas en tu Raspberry Pi:

    lrwxrwxrwx 1 root root 20 Sep 4 19:47 seafile-server-latest -> seafile-server-4.3.2

    En el caso que no, puedes crear el link de la siguiente manera:

    [email protected] ~ # ln -s /opt/seafile-server-4.3.2 /opt/seafile-server-latest

    Asumiendo que la última versión que tienes es la 4.3.2.

    Así mismo, valida los permisos en los scripts de inicio:

    [email protected] /opt/seafile-server-latest # ls -ltra sea*.sh
    -rwxr-xr-x 1 pi pi 6541 Aug 21 14:23 seahub.sh
    -rwxr-xr-x 1 pi pi 4279 Aug 21 14:23 seafile.sh
    -rwxr-xr-x 1 pi pi 2755 Aug 21 14:23 seaf-gc.sh
    -rwxr-xr-x 1 pi pi 3236 Aug 21 14:23 seaf-fuse.sh
    -rwxr-xr-x 1 pi pi 1860 Aug 21 14:23 seaf-fsck.sh

    y en /etc/rc.local:

    [email protected] /opt/seafile-server-latest # ls -ltra /etc/rc.local
    -rwxr-xr-x 1 root root 640 Sep 4 19:50 /etc/rc.local

    Espero que te sirva.

    Saludos,

    David

    david September 23, 2015
  • Hola David, he seguido este tutorial, instalé seafile y el mismo me funciona a la perfección, el único inconveniente es que solo me funciona dentro de la mi interna. Me puedo conectar desde fuera a través de un DDNS, puedo ver los archivos pero no me permite ni subir ni bajar archivos. Qué puedo hacer?

    Rubén Hidalgo October 4, 2015
  • Me comí el párrafo “dentro de mi red interna” en el comentario anterior…

    Rubén Hidalgo October 4, 2015
  • Hola Rubén:
    ¿Has seguido los pasos que indican aquí? http://manual.seafile.com/deploy/deploy_seafile_behind_nat.html. A nivel de firewall se requiere que los puertos 8000 y 8082 (que es por donde se establecen las transferencias de archivos) estén abiertos.
    Saludos,
    David

    david October 6, 2015
  • como puedo hacer que la coneccion sea por https?

  • Buenas tardes José Antonio:
    Con un año de retraso pero es mejor tarde que nunca.
    He agregado un apartado para usar stunnel para encriptar la comunicación vía HTTPS.
    Saludos,
    David

    david February 16, 2018

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.