NextCloud en tant que service de création de liens sécurisé

Bonjour, Habr! Je voudrais partager un cas légèrement non trivial sur la configuration de NextCloud en tant que service de création de liens sécurisés pour télécharger directement des données à partir d'un lecteur smb \ cifs réseau connecté. Je décrirai les solutions aux nuances que j'ai rencontrées lors de l'installation.



Pourquoi est-ce nécessaire?



Livraison pratique du contenu à l'utilisateur final, évitant les tracas avec FTP et l'incapacité (due à NDA) à utiliser les services publics et les nuages ​​pour le transfert de fichiers (BTsync, Google- \ Mail- \ Yandex-Disk \ Dropbox \ etc.).










Préface



Notre bureau a une certaine infrastructure, il inclut Active Directory, dans lequel nous avons des employés qui sont en groupe.



Pendant une session PC, après la connexion, en utilisant des politiques configurées, un lecteur réseau est monté pour chaque employé. Grâce à lui, de temps en temps, des données sont échangées. Le disque a une structure de dossiers spécifique, dont les droits sont configurés via ces mêmes groupes. Tout le monde voit ce que les paramètres lui permettent.



Habituellement, pour envoyer des données au monde extérieur, soit un FTP séparé est généré, soit les données sont téléchargées sur un FTP existant. J'admets que c'est loin d'être toujours pratique - au moins, créer et gérer des identifiants et des mots de passe temporaires (par exemple, lorsque les partenaires ont besoin de donner du contenu prêt), contrôler l'espace sur le serveur FTP, télécharger manuellement sur un serveur FTP avant «l'envoi».



À un moment donné, nous devions être en mesure de donner directement les données des utilisateurs finaux au monde extérieur à partir de notre lecteur réseau et, de préférence, cela devrait être relativement sûr: vous pouvez créer un lien de téléchargement (il avait une durée de vie, un mot de passe, une différenciation des droits à l'original données et ainsi de suite).



Cette idée nous a été poussée par l'un des partenaires, car ils avaient un service interne, mais là, c'était auto-écrit.



Il n'y avait pas d'options prêtes à l'emploi à la volée dans le moteur de recherche (si vous les avez en tête, veuillez vous désabonner dans les commentaires), et personne n'avait le désir et les ressources de consacrer potentiellement de nombreuses heures de travail au développement à partir de zéro, aux tests et au support. Et pourquoi réinventer la roue, si souvent tout a déjà été inventé auparavant. C'est ainsi que le service NextCloud est venu à l'esprit, qui sait se connecter à des ressources externes.



Nous parlerons de la dernière version stable, actuellement la version 19, mais notre méthode d'installation fonctionnera également pour les versions antérieures - nous l'avons initialement implémentée sur la version 16, puis mise à jour progressivement. Récemment, je l'ai soulevé à partir de zéro sur le dernier (19), et sur cette base, j'écris un article.



Ce que nous voulons obtenir Ă  la fin:



  • ActiveDirectoty\LDAP, , Jira, Confluence, Nexus .
  • NextCloud, , , .
  • NextCloud — - , . , .
  • -, , NextCloud .* , — .
  • Un employĂ© peut crĂ©er des liens temporaires protĂ©gĂ©s par mot de passe vers toutes les ressources dont il dispose - que ce soit un dossier ou un fichier sĂ©parĂ©. Et aussi les gĂ©rer (liens) - rĂ©voquer, changer la durĂ©e de vie, etc.
  • L'utilisateur final, Ă  qui le lien sĂ©curisĂ© a Ă©tĂ© envoyĂ©, n'a qu'Ă  l'ouvrir et Ă  saisir le mot de passe pour pouvoir tĂ©lĂ©charger les donnĂ©es partagĂ©es avec lui.





Extension et configuration des dépendances



Pour commencer, nous devons avoir une machine virtuelle ou un serveur séparé sur lequel nous pouvons installer le système d'exploitation, puis NextCloud.



Il y a plus d'un article sur Habré consacré au déploiement du système et du service.



AlexanderSassez bien et décrit en détail le processus de l' installation du système à la configuration même du cloud (y compris la mise à jour des articles par année). Je ne vois aucune raison de répéter tout cela.



1. Puisque nous connectons un lecteur réseau à NextCloud, nous avons besoin de paquets sur le système: smbclient , libsmbclient , php-ldap et php-smbclient .



Remarque, en cas d'utilisation de Docker
, — samba , Dockerfile. , , php-smbclient “apt 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. En raison des particularités des paramètres de notre serveur samba (le support smb1 est désactivé), sur la machine avec nextcloud, dans les fichiers /etc/samba/smb.conf et /usr/share/samba/smb.conf, nous avons dû changer les lignes responsables du protocole:



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


Suite de l'exemple Dockerfile
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.conf
ADD smb.conf /etc/samba/
ADD smb.conf /usr/share/samba/




Sinon, nextcloud n'a jamais pu se connecter au lecteur.






Configuration de Nextcloud



Ainsi, Nextcloud est déjà installé, les dépendances sont installées et le service a un utilisateur interne qui a été créé lors de l'installation.



La première étape. Préparer un modèle pour les comptes des employés.



Étant donné que nous aurons plus d'un employé dans le système et que leur nombre changera progressivement - si vous ne préconfigurez pas le modèle de l'utilisateur en cours de création - tout le monde aura plusieurs fichiers d'exemple dans son dossier personnel. C'est bien que nextcloud ait un paramètre distinct pour cela: les fichiers squelettes , qui sont configurés dans config.php .



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


Autrement dit, vous pouvez créer un dossier vide et spécifier le chemin complet vers celui-ci dans le fichier config.



Deuxième étape. Rendre les utilisateurs "en lecture seule"



Il suffit de spécifier le quota en "1 B" (1 octet) dans la section des paramètres utilisateur ( http (s): //nextcloud.domain.tld/settings/users ).



Troisième étape - réparer le ZipStreamer à l'avance



ZipStreamer est une bibliothèque utilisée dans le backend NextCloud, elle est utilisée pour créer des archives à la volée, c'est-à-dire lors du téléchargement d'un tas de fichiers.







Comment ça fonctionne
, "Dowload All Files"/" ", , ( ) , .







, ( .zip, — .tar)



, , .



: Google Drive, ., ..



Le problème réside dans le fait que, pour des raisons inconnues, la logique du passage de zip à zip64 intégré dans NextCloud échoue, et s'il y a plus de 65536 fichiers dans le dossier et / ou que leur poids total dépasse 4 Go, vous serez très probablement confronté à un problème de téléchargement. le fichier sera soit battu, soit le téléchargement sera interrompu après le téléchargement de 4 Go.



Ce problème a été alloué suffisamment de temps, sur GitHub il y a même, et pas un, un ticket fermé (# 1755 , # 15871 , # 8798 ), mais malgré le fait que le problème soit censé être résolu , nous l'avons toujours et reproduit avec un succès variable , gênant considérablement le travail. J'ai dû le résoudre plus radicalement.



Décision
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


, -, , .









.



Étape 4 - Ajuster les paramètres de liaison



Dans les paramètres de publication, nous configurons les règles à votre convenance. Par exemple, nous rendons obligatoire la protection par mot de passe et définissons une durée de vie obligatoire.



Étape 5 - Connectez le lecteur réseau



  1. Passons Ă  la configuration de stockages externes . ( http (s): //nextcloud.domain.tld/settings/admin/externalstorages )
  2. Nous choisissons d'ajouter du stockage SMB \ CIFS.
  3. Nous remplissons les champs pour le nom, le domaine, le dossier, etc.
  4. Nous sélectionnons "Credentials, store in the database" - c'est cet élément qui permet à l'utilisateur de connecter le disque à son compte dans NextCloud lorsque l'utilisateur entre en utilisant son lien de connexion et de mot de passe. (L'élément stockant le login et le mot de passe pendant la session n'a pas décollé).
  5. N'oubliez pas dans le menu <...> de cocher les cases "Lecture seule" et l'autorisation de partage.


Étape 6 - Lancement des utilisateurs via LDAP



Maintenant que tout est prêt, nous installons le plugin à partir de la place de marché, et immédiatement après avoir connecté LDAP. Dans notre système, nous avons donné accès aux employés du groupe NextcloudAccess . Vous pouvez faire la même chose.






Conclusion



Voilà, après toutes ces manipulations simples, mais parfois pas les plus évidentes: le service fonctionne, le disque est connecté, les employés sont ajoutés et les utilisateurs téléchargent et sont heureux.



Exemple complet de notre 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/







Test de stress



"Comment vas-tu avec la charge?" - demandez-vous enfin.



Mesures aux heures de pointe








Notre instance de service fonctionne sur ~ 6 Go de RAM + 6 processeurs dans une machine virtuelle parmi d'autres VM.



Au pic de la charge du réseau - un peu plus de 2,5 Go de RAM ont été utilisés, le processeur n'était pas obstrué et le retour en moyenne était d'environ 5 Gbit / s (le record atteignait 8 Gbit / s).



La seule chose que nous avons remarquée, c'est que lorsque nous transférons plus de 6 Gbit / s vers le monde extérieur, notre interface Web tombe périodiquement, mais les téléchargements des utilisateurs continuent.




Désavantages identifiés:



  • NextCloud n'a pas la capacitĂ© d'avoir un contrĂ´le global sur tous les liens créés. Ils sont affichĂ©s uniquement dans chaque compte dans une section distincte.
  • Si vous partagez la racine d'un lecteur connectĂ© Ă  l'aide d'un lien, cela peut constituer une fuite de donnĂ©es potentielle, car tous les dossiers disponibles sur votre compte seront partagĂ©s dans le lien.
  • J'ai remarquĂ© que pendant un an d'utilisation du service augmentĂ©, pour le moment, la table oc_filecache dans la base de donnĂ©es pèse ~ 29 Go et compte environ 100 000 lignes (nous utilisons vanilla MySQL 5.7.x). Cela est dĂ» aux bogues # 16834 , # 6395 , # 7312 , # 20349 . Alors qu'il y a surveillance sur la deuxième instance.





Merci d'avoir lu. Si vous avez des questions, des commentaires ou des suggestions, n'hésitez pas, je suis toujours heureux de faire des critiques constructives.






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



All Articles