Il y a 389 articles et 19 utilisateurs inscrits (ce bandeau est défini dans MediaWiki:Sitenotice)
SFTPGo – Configuration, sécurisation et sauvegardes
SFTPGo – Configuration, sécurisation et sauvegardes
[modifier | modifier le wikicode]1. Objectif
[modifier | modifier le wikicode]Mettre en place une configuration homogène et sécurisée des comptes SFTPGo, basée sur un modèle validé (ex : utilisateur ad64), et automatiser les sauvegardes.
2. Architecture retenue
[modifier | modifier le wikicode]- 1 utilisateur SFTPGo par personne (pas de compte partagé)
- Utilisation de Virtual folders
- Répertoire racine non modifiable
- Permissions fines par dossier
- Désactivation des fonctionnalités sensibles non utiles aux clients
3. Configuration utilisateur (modèle ad64)
[modifier | modifier le wikicode]3.1 Répertoire racine
[modifier | modifier le wikicode]Root directory = /var/sftpgo-homes/ad64
Permissions système :
chmod 555 /var/sftpgo-homes/ad64
But :
- empêcher la création de dossiers hors périmètre
3.2 Virtual folders
[modifier | modifier le wikicode]Exemple :
- /pleade → ad64-pleade
- /projets → ad64-projets
3.3 ACL globales
[modifier | modifier le wikicode]Au niveau racine :
permissions = ["/": ["list"]]
But :
- autoriser uniquement la navigation à la racine
- empêcher le download global
3.4 ACL par dossier
[modifier | modifier le wikicode]/pleade
[modifier | modifier le wikicode]Permissions :
- list
- upload
- overwrite
- create_dirs
- rename
- rename_files
- rename_dirs
- delete
- delete_files
- delete_dirs
- copy
But :
- dépôt et gestion possibles
- download interdit par défaut
/projets
[modifier | modifier le wikicode]Permissions :
- list
- download
- upload
- overwrite
- create_dirs
- rename
- rename_files
- rename_dirs
- delete
- delete_files
- delete_dirs
- copy
But :
- répertoire d’échange complet
3.5 ACL fines par sous-répertoire
[modifier | modifier le wikicode]Exemple de logique retenue :
- /pleade/*/alto
- /pleade/*/cdc
- /pleade/*/csv
- /pleade/*/eac
- /pleade/*/ead
- /pleade/*/excell
- /pleade/*/mets
- /pleade/*/nc
- /pleade/*/pdf
- /pleade/*/unimarc
- /pleade/*/xml
But :
- autoriser le download uniquement pour certains types de dossiers
- éviter un download massif non souhaité sur d’autres répertoires comme les images
3.6 Fonctionnalités Web désactivées
[modifier | modifier le wikicode]Dans Web client / REST API :
- password-reset-disabled
- publickey-change-disabled
- tls-cert-change-disabled
- api-key-auth-change-disabled
- info-change-disabled
- shares-disabled
- shares-without-password-disabled
But :
- éviter les partages publics
- éviter les modifications avancées côté client
- garder une interface simple et contrôlée
3.7 2FA
[modifier | modifier le wikicode]Choix retenu :
- 2FA non activé par défaut
- activation au cas par cas selon le client et le mode d’accès
Remarque :
- FileZilla gratuit ne gère pas correctement le 2FA en SFTP
- le 2FA est donc surtout adapté au WebClient, ou à des clients compatibles
4. Vérifications utiles
[modifier | modifier le wikicode]4.1 Vérifier les utilisateurs
[modifier | modifier le wikicode]sqlite3 /var/lib/sftpgo/sftpgo.db select username,status from users;
4.2 Vérifier la structure SQL
[modifier | modifier le wikicode]sqlite3 /var/lib/sftpgo/sftpgo.db .schema users
4.3 Sauvegarde manuelle rapide de la base
[modifier | modifier le wikicode]cp /var/lib/sftpgo/sftpgo.db /var/lib/sftpgo/sftpgo.db.bak_$(date +%F_%H-%M)
4.4 Sauvegarde plus propre avec arrêt du service
[modifier | modifier le wikicode]systemctl stop sftpgo cp /var/lib/sftpgo/sftpgo.db /var/lib/sftpgo/sftpgo.db.bak_$(date +%F_%H-%M) systemctl start sftpgo
4.5 Dump SQL
[modifier | modifier le wikicode]sqlite3 /var/lib/sftpgo/sftpgo.db ".dump" > /root/sftpgo_dump_$(date +%F_%H-%M).sql
5. Uniformisation des utilisateurs
[modifier | modifier le wikicode]5.1 Principe
[modifier | modifier le wikicode]- prendre ad64 comme modèle
- appliquer les mêmes ACL aux autres utilisateurs
- ne pas modifier :
- le quota
- le nom d’utilisateur
- le mot de passe
- les virtual folders
5.2 Méthode retenue
[modifier | modifier le wikicode]- export JSON
- modification du JSON
- import avec mise à jour
5.3 Effet recherché
[modifier | modifier le wikicode]- tous les clients ont la même base de sécurité
- moins d’erreurs
- gestion plus simple
- future création de groupes facilitée
6. Sauvegardes automatiques
[modifier | modifier le wikicode]6.1 Script
[modifier | modifier le wikicode]Fichier :
/usr/local/sbin/backup_sftpgo.sh
Fonctions :
- backup quotidien de la base
- dump SQL quotidien
- rotation sur 7 jours
- copie hebdomadaire le dimanche
- backup manuel possible avant import JSON ou changement massif
6.2 Exécution manuelle
[modifier | modifier le wikicode]/usr/local/sbin/backup_sftpgo.sh daily
Backup manuel :
/usr/local/sbin/backup_sftpgo.sh manual
6.3 Cron
[modifier | modifier le wikicode]crontab -e
Exemple :
15 2 * * * /usr/local/sbin/backup_sftpgo.sh daily >> /var/log/backup_sftpgo.log 2>&1
6.4 Vérification
[modifier | modifier le wikicode]find /var/backups/sftpgo -maxdepth 2 -type f | sort
7. Rotation des logs
[modifier | modifier le wikicode]7.1 Fichier logrotate
[modifier | modifier le wikicode]Fichier :
/etc/logrotate.d/sftpgo-local
Contenu :
/var/log/backup_sftpgo.log
/var/log/sftpgo*.log
/var/log/fail2ban.log {
su root adm
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
systemctl reload rsyslog >/dev/null 2>&1 || true
endscript
}
7.2 Test
[modifier | modifier le wikicode]logrotate -d /etc/logrotate.d/sftpgo-local
Test forcé :
logrotate -f /etc/logrotate.d/sftpgo-local
8. Journal systemd
[modifier | modifier le wikicode]8.1 Vérification
[modifier | modifier le wikicode]journalctl --disk-usage
8.2 Réglage
[modifier | modifier le wikicode]Fichier :
/etc/systemd/journald.conf
Exemple :
SystemMaxUse=500M SystemMaxFileSize=50M MaxRetentionSec=30day
Puis :
systemctl restart systemd-journald
9. Bonnes pratiques
[modifier | modifier le wikicode]- toujours faire un backup avant import JSON
- ne pas modifier SQLite directement sauf nécessité
- tester d’abord sur un utilisateur modèle
- éviter les comptes partagés
- privilégier des utilisateurs nominatifs
- préparer ensuite des groupes pour industrialiser la configuration
10. Évolutions prévues
[modifier | modifier le wikicode]- création de groupes par client
- template de configuration standard
- éventuel script de provisioning
- différenciation entre comptes humains et comptes techniques
Création d’un client (dataset ZFS + SFTPGo + ACL)
[modifier | modifier le wikicode]1. Création du dataset ZFS
[modifier | modifier le wikicode]zfs create data/clients/NOM_CLIENT-data
Exemple :
zfs create data/clients/ad64-data
Le dataset sera monté automatiquement dans :
/var/data/NOM_CLIENT-data
---
2. Vérification
[modifier | modifier le wikicode]zfs list data/clients/NOM_CLIENT-data
---
3. Création de l’arborescence
[modifier | modifier le wikicode]mkdir -p /var/data/NOM_CLIENT-data/data/pleade mkdir -p /var/data/NOM_CLIENT-data/data/projets
---
4. Droits de base
[modifier | modifier le wikicode]chown -R NOM_CLIENT:pleade /var/data/NOM_CLIENT-data chmod 1775 /var/data/NOM_CLIENT-data/data
---
5. Application des règles (script)
[modifier | modifier le wikicode]/opt/scripts_clients_sftpgo/02_apply_client_rules.sh NOM_CLIENT
Ce script :
- homogénéise les droits
- applique les ACL
- structure pleade et projets
---
6. Création du user SFTPGo
[modifier | modifier le wikicode]Via interface Web (recommandé)
[modifier | modifier le wikicode]- créer un utilisateur NOM_CLIENT
- définir le home :
/var/sftpgo-homes/NOM_CLIENT
- associer le virtual folder :
/var/data/NOM_CLIENT-data/data
---
7. Configuration des permissions SFTPGo
[modifier | modifier le wikicode]Exemple :
- / → list, download
- /pleade → *
- /projets → *
Adapter selon le besoin.
---
8. Définition du quota SFTPGo
[modifier | modifier le wikicode]Exemple :
- quota_size = 35000000000000 (≈ 35 To)
Attention :
- quota SFTPGo ≠ quota ZFS
- SFTPGo est une limite logique
---
9. Définition du quota ZFS
[modifier | modifier le wikicode]Recommandé :
zfs set refquota=XXT data/clients/NOM_CLIENT-data
Exemple :
zfs set refquota=10T data/clients/ad64-data
- refquota = limite visible utilisateur
- ne bloque pas à cause des snapshots
---
10. Vérification finale
[modifier | modifier le wikicode]zfs get quota,refquota data/clients/NOM_CLIENT-data
sqlite3 /var/lib/sftpgo/sftpgo.db "select username,home_dir from users where username='NOM_CLIENT';"
---
11. Bonnes pratiques
[modifier | modifier le wikicode]- Toujours utiliser refquota pour les clients
- Ne pas mélanger quota ZFS et quota SFTPGo
- Appliquer le script de droits systématiquement
- Vérifier l’accès SFTP après création
---
12. Résumé
[modifier | modifier le wikicode]- ZFS → stockage physique
- SFTPGo → accès utilisateur
- Script ACL → cohérence des droits
- refquota → limite client réelle
Suppression d’un client (dataset ZFS + SFTPGo)
[modifier | modifier le wikicode]1. Vérification du dataset
[modifier | modifier le wikicode]zfs list data/clients/NOM_CLIENT-data
Exemple :
zfs list data/clients/bm-rouen-data
Vérifier :
- que le dataset existe
- la taille utilisée (colonne USED)
---
2. Vérification des snapshots
[modifier | modifier le wikicode]zfs list -t snapshot | grep NOM_CLIENT
Exemple :
zfs list -t snapshot | grep bm-rouen-data
Si des snapshots existent, ils devront être supprimés avec le dataset.
---
3. Vérification du montage
[modifier | modifier le wikicode]mount | grep NOM_CLIENT
Exemple :
mount | grep bm-rouen
Permet de confirmer le point de montage (ex : /var/data/...).
---
4. Point important : suppression impossible via rm
[modifier | modifier le wikicode]Un dataset ZFS monté ne peut pas être supprimé directement avec rm :
rm -rf /var/data/NOM_CLIENT-data
Retour :
rm: cannot remove 'NOM_CLIENT-data': Device or resource busy
Explication :
- le répertoire est un point de montage ZFS
- il faut supprimer le dataset avant
---
5. Suppression du dataset
[modifier | modifier le wikicode]Cas sans snapshot
[modifier | modifier le wikicode]zfs destroy data/clients/NOM_CLIENT-data
Cas avec snapshot (le plus fréquent)
[modifier | modifier le wikicode]zfs destroy -r data/clients/NOM_CLIENT-data
- -r : supprime le dataset + tous les snapshots associés
- suppression immédiate et irréversible
---
6. Nettoyage du point de montage
[modifier | modifier le wikicode]Après suppression du dataset :
cd /var/data/ rm -rf NOM_CLIENT-data
---
7. Vérification après suppression
[modifier | modifier le wikicode]zfs list | grep NOM_CLIENT
Aucune sortie ne doit être retournée.
---
8. Vérification côté SFTPGo
[modifier | modifier le wikicode]sqlite3 /var/lib/sftpgo/sftpgo.db "select username,home_dir from users where username like '%NOM_CLIENT%';"
Exemple :
sqlite3 /var/lib/sftpgo/sftpgo.db "select username,home_dir from users where username like '%rouen%';"
---
9. Suppression dans SFTPGo (si nécessaire)
[modifier | modifier le wikicode]Via interface Web (recommandé)
[modifier | modifier le wikicode]- supprimer l’utilisateur
- vérifier les virtual folders
- vérifier les groupes
Via SQLite (si besoin)
[modifier | modifier le wikicode]sqlite3 /var/lib/sftpgo/sftpgo.db "delete from users where username='NOM_USER';"
---
10. Bonnes pratiques
[modifier | modifier le wikicode]- Toujours vérifier la présence de snapshots avant suppression
- Ne jamais supprimer un répertoire ZFS avec rm sans supprimer le dataset
- Nettoyer ZFS ET SFTPGo pour garder la cohérence
- Vérifier que le client n’existe plus côté eole2 avant suppression
---
11. Résumé
[modifier | modifier le wikicode]- ZFS = stockage réel
- SFTPGo = accès utilisateur
- rm ne fonctionne pas sur un dataset monté
- Suppression correcte = zfs destroy puis nettoyage du répertoire
Erreurs fréquentes (ZFS + SFTPGo)
[modifier | modifier le wikicode]1. Impossible de supprimer un répertoire
[modifier | modifier le wikicode]Commande :
rm -rf /var/data/NOM_CLIENT-data
Erreur :
rm: cannot remove 'NOM_CLIENT-data': Device or resource busy
Cause :
- le répertoire est un point de montage ZFS
Solution :
zfs destroy -r data/clients/NOM_CLIENT-data cd /var/data/ rm -rf NOM_CLIENT-data
---
2. zfs destroy échoue
[modifier | modifier le wikicode]Erreur typique :
cannot destroy '...': dataset has children cannot destroy '...': snapshots exist
Cause :
- présence de snapshots ou sous-datasets
Solution :
zfs destroy -r data/clients/NOM_CLIENT-data
---
3. Espace disque plein alors que le dossier semble vide
[modifier | modifier le wikicode]Cause possible :
- snapshots ZFS invisibles pour l’utilisateur
Vérification :
zfs list -t snapshot | grep NOM_CLIENT
Solution :
- supprimer les snapshots inutiles
- utiliser refquota plutôt que quota
---
4. Utilisateur bloqué alors qu’il reste de la place
[modifier | modifier le wikicode]Cause :
- utilisation de quota au lieu de refquota
Explication :
- quota inclut snapshots et sous-datasets
- refquota limite uniquement les données visibles
Solution recommandée :
zfs set refquota=XXT data/clients/NOM_CLIENT-data
---
5. Centreon alerte sur l’espace disque
[modifier | modifier le wikicode]Cause :
- Centreon se base sur df
- ZFS agrège l’espace au niveau du pool
Solution :
- ajuster les seuils Centreon
- ou superviser les datasets individuellement
---
6. Dataset supprimé mais utilisateur encore présent
[modifier | modifier le wikicode]Cause :
- suppression ZFS sans nettoyage SFTPGo
Vérification :
sqlite3 /var/lib/sftpgo/sftpgo.db "select username from users where username like '%NOM_CLIENT%';"
Solution :
- supprimer l’utilisateur dans SFTPGo (UI ou SQL)
---
7. Permissions incohérentes dans pleade
[modifier | modifier le wikicode]Cause :
- oubli d’appliquer le script ACL
Solution :
/opt/scripts_clients_sftpgo/02_apply_client_rules.sh NOM_CLIENT
---
8. Upload interrompu (fichier incomplet)
[modifier | modifier le wikicode]Comportement :
- fichier partiel présent côté serveur
Bonnes pratiques :
- vérifier les fichiers en cours de transfert
- nettoyer les fichiers incomplets si nécessaire
- SFTPGo ne valide pas automatiquement l’intégrité métier
---
9. Confusion quota ZFS / quota SFTPGo
[modifier | modifier le wikicode]Rappel :
- quota ZFS = limite physique
- quota SFTPGo = limite logique utilisateur
Conséquence :
- un utilisateur peut être bloqué par ZFS même si SFTPGo autorise encore
---
10. Oubli de nettoyage des anciens clients
[modifier | modifier le wikicode]Symptôme :
- datasets inutilisés qui s’accumulent
Bonnes pratiques :
- vérifier régulièrement les datasets actifs
- supprimer les clients obsolètes (ZFS + SFTPGo)
SFTPGo — Désactivation de la prévisualisation WebClient (tentative)
[modifier | modifier le wikicode]Objectif
[modifier | modifier le wikicode]Masquer la fonction de prévisualisation des fichiers dans le WebClient SFTPGo.
Méthode testée
[modifier | modifier le wikicode]Utilisation de la variable d’environnement :
SFTPGO_HOOK__WEBCLIENT_DISABLE_PREVIEW=1
Mise en place
[modifier | modifier le wikicode]1. Création d’un override systemd :
systemctl edit sftpgo
Contenu :
[Service] Environment=SFTPGO_HOOK__WEBCLIENT_DISABLE_PREVIEW=1
2. Rechargement et redémarrage :
systemctl daemon-reload systemctl restart sftpgo
3. Vérification :
Variable visible côté systemd :
systemctl show sftpgo -p Environment
Variable présente dans le process :
tr '\0' '\n' < /proc/$(pidof sftpgo)/environ | grep SFTPGO_HOOK
Résultat
[modifier | modifier le wikicode]- La variable est bien chargée dans l’environnement du service
- MAIS :
* la prévisualisation reste visible dans l’interface WebClient * aucun effet constaté côté UI
Conclusion
[modifier | modifier le wikicode]- Fonction non effective sur SFTPGo 2.7.1 (à confirmer selon versions)
- Comportement potentiellement :
* bug * ou option non fonctionnelle en version open-source
Nettoyage (recommandé)
[modifier | modifier le wikicode]Suppression de l’override systemd :
rm /etc/systemd/system/sftpgo.service.d/override.conf rm /etc/sftpgo/env.d/webclient.env ## Si la variable a été intégrée dans ce fichier
Puis :
systemctl daemon-reload systemctl restart sftpgo
Remarque
[modifier | modifier le wikicode]Si la fonctionnalité devient active dans une version future :
- rétablir simplement l’override systemd ci-dessus