Il y a 389 articles et 19 utilisateurs inscrits (ce bandeau est défini dans MediaWiki:Sitenotice)

SFTPGo – Configuration, sécurisation et sauvegardes

De AJLSM
Aller à la navigation Aller à la recherche

SFTPGo – Configuration, sécurisation et sauvegardes

[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]

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

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

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
sqlite3 /var/lib/sftpgo/sftpgo.db ".dump" > /root/sftpgo_dump_$(date +%F_%H-%M).sql

5. Uniformisation des utilisateurs

[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]

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
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
}
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

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

---

  • 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

---

  • 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]

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

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
  • 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
  • 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

Si la fonctionnalité devient active dans une version future :

  • rétablir simplement l’override systemd ci-dessus