NextCloud como servicio de construcción de enlaces seguro

¡Hola, Habr! Me gustaría compartir un caso un poco no trivial sobre la configuración de NextCloud como un servicio para crear enlaces seguros para descargar datos directamente desde una unidad smb \ cifs de red conectada. Describiré las soluciones a los matices que encontré durante la instalación.



¿Por qué es esto necesario?



Entrega conveniente de contenido al usuario final, evitando la molestia con FTP y la incapacidad (debido a NDA) de usar servicios públicos y nubes para la transferencia de archivos (BTsync, Google- \ Mail- \ Yandex-Disk \ Dropbox \ etc).










Prefacio



Nuestra oficina tiene cierta infraestructura, incluye Active Directory, en el cual tenemos empleados que están en grupos.



Durante una sesión en una PC, después de iniciar sesión, mediante políticas configuradas, se monta una unidad de red para cada empleado. A través de él, de vez en cuando, se intercambian datos. El disco tiene una estructura de carpetas específica, cuyos derechos se configuran a través de estos mismos grupos. Todo el mundo ve lo que le permite la configuración.



Por lo general, para enviar datos al mundo exterior, se genera un FTP separado o los datos se cargan en uno existente. Admito que esto está lejos de ser siempre conveniente, al menos, crear y administrar inicios de sesión y contraseñas temporales (por ejemplo, cuando los socios necesitan proporcionar contenido listo para usar), controlar el espacio en un servidor FTP, cargar manualmente a un servidor FTP antes de "enviar".



En algún momento, necesitábamos poder proporcionar directamente los datos de los usuarios finales al mundo exterior desde nuestra unidad de red y, preferiblemente, debería ser relativamente seguro: puede crear un enlace de descarga (tenía una vida útil, una contraseña, diferenciación de derechos sobre el original datos y así sucesivamente).



Esta idea nos la propuso uno de los socios, ya que tenían un servicio interno, pero ahí estaba escrito por nosotros mismos.



No había opciones listas para usar sobre la marcha en el motor de búsqueda (si las tiene en mente, cancele la suscripción en los comentarios), y nadie tenía el deseo y los recursos para gastar potencialmente muchas horas de trabajo en el desarrollo desde cero, pruebas y soporte. Y por qué reinventar la rueda, si muchas veces ya se ha inventado todo antes. Así me vino a la cabeza el servicio NextCloud, que sabe conectar recursos externos consigo mismo.



Hablaremos sobre la última versión estable, actualmente la versión 19, pero nuestro método de configuración también funcionará para versiones anteriores: inicialmente lo implementamos en la versión 16 y luego lo actualizamos gradualmente. Recientemente lo planteé desde cero en el último (19), y basándome en ello estoy escribiendo un artículo.



Lo que queremos conseguir al final:



  • ActiveDirectoty\LDAP, , Jira, Confluence, Nexus .
  • NextCloud, , , .
  • NextCloud — - , . , .
  • -, , NextCloud .* , — .
  • Un empleado puede crear enlaces temporales protegidos con contraseña a cualquier recurso disponible para él, ya sea una carpeta o un archivo separado. Y también administrarlos (enlaces): revocar, cambiar la vida útil, etc.
  • El usuario final, a quien se le envió el enlace seguro, solo necesita abrirlo e ingresar la contraseña para poder descargar los datos compartidos con él.





Despliegue y configuración de dependencias



Para empezar, necesitamos tener una máquina virtual o servidor separado donde podamos instalar el sistema operativo, y luego - NextCloud.



Hay más de un artículo sobre Habré dedicado al despliegue del sistema y el servicio.



AlejandroSbastante bien y descrito en detalle el proceso desde la instalación del sistema hasta la propia configuración de la nube (incluida la actualización de los artículos por año). No veo ninguna razón para repetir todo esto de nuevo.



1. Dado que estamos conectando una unidad de red a NextCloud, necesitamos paquetes para el sistema: smbclient , libsmbclient , php-ldap y php-smbclient .



Observación, en caso de usar Docker
, — samba , Dockerfile. , , php-smbclientapt install package”.



Dockerfile
FROM nextcloud:latest
RUN apt update -y &&  apt install -y --allow-unauthenticated smbclient libsmbclient libsmbclient-dev
RUN pecl install smbclient
RUN docker-php-ext-enable smbclient






2. Debido a las peculiaridades de la configuración de nuestro servidor samba (el soporte smb1 está deshabilitado), en la máquina con nextcloud, en los archivos /etc/samba/smb.conf y /usr/share/samba/smb.conf, tuvimos que cambiar las líneas responsables del protocolo:



[global] 
client min protocol = SMB2
client max protocol = SMB3


Continuación del ejemplo de Dockerfile
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.conf
ADD smb.conf /etc/samba/
ADD smb.conf /usr/share/samba/




De lo contrario, nextcloud nunca pudo conectarse a la unidad.






Configuración de Nextcloud



Entonces, Nextcloud ya está instalado, las dependencias están instaladas y el servicio tiene un usuario interno que se creó durante la instalación.



Paso uno. Elaboración de una plantilla para cuentas de empleados.



Dado que tendremos más de un empleado en el sistema, y ​​su número cambiará gradualmente, si no configura previamente la plantilla del usuario que se está creando, todos tendrán varios archivos de ejemplo en su carpeta de inicio. Es bueno que nextcloud tenga una configuración separada para esto: archivos de esqueleto , que se configuran en config.php .



  'skeletondirectory' => '/var/www/html/data/donotdeletme',


Es decir, puede crear una carpeta vacía y especificar la ruta completa en el archivo config.



Segundo paso. Hacer que los usuarios sean de "solo lectura"



Basta con especificar la cuota en "1 B" (1 byte) en la sección de configuración del usuario ( http (s): //nextcloud.domain.tld/settings/users ).



Paso tres: arregle el ZipStreamer por adelantado



ZipStreamer es una biblioteca utilizada en el backend de NextCloud, se utiliza para crear archivos "sobre la marcha", es decir, mientras se descargan un montón de archivos.







Cómo funciona
, "Dowload All Files"/" ", , ( ) , .







, ( .zip, — .tar)



, , .



: Google Drive, ., ..



El problema radica en el hecho de que, por razones desconocidas, la lógica de cambiar zip a zip64 incrustado en NextCloud falla, y si hay más de 65536 archivos en la carpeta y / o su peso total excede los 4GB, lo más probable es que se enfrente a un problema que el descargado el archivo será batido o la descarga se interrumpirá después de los 4GB descargados.



A este problema se le asignó suficiente tiempo, en GitHub hay incluso, y no uno, ticket cerrado (# 1755 , # 15871 , # 8798 ), pero a pesar del hecho de que el problema supuestamente se resolvió , todavía lo tenemos y se reproduce con éxito variable , interfiriendo en gran medida con el trabajo. Tuve que resolverlo de manera más radical.



Decisión
100% 64 , 64- . « ».



<, nextcloud>/lib/private/Streamer.php:

- $this->streamerInstance = new ZipStreamer(['zip64' => false]);
+ $this->streamerInstance = new ZipStreamer(['zip64' => true]);


, Docker
Integrity Check ( /usr/src/nextcloud/* /var/www/html/*).



/var/www — , .



/usr/src/nextcloud/lib/private/ CI . , .



Dockerfile
RUN rm -frv /usr/src/nextcloud/lib/private/Streamer.php
ADD Streamer.php /usr/src/nextcloud/lib/private/
RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php


, -, , .









.



Paso cuatro: ajuste los parámetros del enlace



En los parámetros de publicación, configuramos las reglas según convenga. Por ejemplo, hacemos la protección con contraseña obligatoria y establecemos una vida útil obligatoria.



Paso cinco: conecte la unidad de red



  1. Vayamos a configurar almacenamientos externos . ( http (s): //nextcloud.domain.tld/settings/admin/externalstorages )
  2. Seleccionamos agregar almacenamiento SMB \ CIFS.
  3. Rellenamos los campos de nombre, dominio, carpeta, etc.
  4. Seleccionamos "Credenciales, almacenar en la base de datos" - es este elemento el que permite al usuario conectar el disco a su cuenta en NextCloud cuando el usuario ingresa usando su enlace de inicio de sesión y contraseña. (El elemento que almacena el nombre de usuario y la contraseña durante la sesión no despegó).
  5. No olvide en el menú <...> marcar las casillas de verificación "Solo lectura" y permitir compartir.


Paso seis: lanzar usuarios a través de LDAP



Ahora que tenemos todo listo, instalamos el complemento del mercado e inmediatamente después conectamos LDAP. En nuestro sistema, dimos acceso a los empleados que están en el grupo NextcloudAccess . Usted puede hacer lo mismo.






Conclusión



Eso es todo, después de todas estas manipulaciones simples, pero a veces no las más obvias: el servicio está funcionando, el disco está conectado, los empleados se agregan y los usuarios están descargando y felices.



Ejemplo completo de nuestro Dockerfile
FROM nextcloud:latest
ENV DEBIAN_FRONTEND noninteractive

#installing smbclient
RUN apt update -y &&  apt install -y --allow-unauthenticated smbclient libsmbclient libsmbclient-dev
RUN pecl install smbclient
RUN docker-php-ext-enable smbclient

#fix of ZipStreammer
RUN rm -frv /usr/src/nextcloud/lib/private/Streamer.php
ADD Streamer.php /usr/src/nextcloud/lib/private/
RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php

#fix of smb config
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.conf
ADD smb.conf /etc/samba/
ADD smb.conf /usr/share/samba/







Pruebas de estrés



"¿Cómo te va con la carga?" - preguntas al fin.



Mediciones en hora punta








Nuestra instancia de servicio se ejecuta en ~ 6Gb Ram + 6CPU en una máquina virtual entre otras VM.



En el pico de la carga de la red, se utilizó un poco más de 2,5 Gb de RAM, el procesador no estaba obstruido y el retorno en promedio fue de aproximadamente 5 Gbit / s (el récord alcanzó los 8 Gbit / s).



Lo único que notamos es que cuando transferimos más de 6 Gbit / s al mundo exterior, nuestra interfaz web se cae periódicamente, pero las descargas de los usuarios continúan.




Desventajas identificadas:



  • NextCloud no tiene control global sobre todos los enlaces creados. Se muestran solo dentro de cada cuenta en una sección separada.
  • Si comparte la raíz de una unidad conectada mediante un enlace, esto puede servir como una posible fuga de datos, ya que todas las carpetas disponibles para su cuenta se compartirán en el enlace.
  • Noté que durante un año de uso del servicio elevado, en este momento, la tabla oc_filecache en la base de datos pesa ~ 29Gb y tiene aproximadamente ~ 100k filas (estamos usando Vanilla MySQL 5.7.x). Esto se debe a los errores # 16834 , # 6395 , # 7312 , # 20349 . Mientras hay vigilancia en la segunda instancia.





Gracias por leer. Si tiene alguna pregunta, comentario o sugerencia, no lo dude, siempre me complace recibir críticas constructivas.






 : nextcloud 16, 17, 18, 19
 : 26.07.2020
 : 24.09.2020
 :  .  Areso.
: 1.0.0.9



All Articles