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

SFTPGo - Restriction des accès par dossiers

De AJLSM
Aller à la navigation Aller à la recherche

SFTPGo - Restriction des accès par dossiers

[modifier | modifier le wikicode]

Si le root directory est accessible en écriture, l'utilisateur peut créer des dossiers hors des virtual folders.

1. Root directory
[modifier | modifier le wikicode]
  • Définir un dossier vide (ex: /srv/sftpgo-homes/ad64)
  • Appliquer :
 chmod 555 /srv/sftpgo-homes/ad64
2. Virtual folders
[modifier | modifier le wikicode]

Mapper uniquement les dossiers autorisés :

  • pleade → /var/data/ad64-data/data/pleade
  • projets → /var/data/ad64-data/data/projets

Permissions globales :

  • list
  • download

Permissions spécifiques :

  • /pleade → upload, create_dirs, delete, etc.
  • /projets → upload, create_dirs, delete, etc.

Permissions racine :

  • / → list uniquement
  • Impossible de créer des dossiers hors des virtual folders
  • Accès strictement limité aux chemins définis

SFTPGo – Règles et bonnes pratiques

[modifier | modifier le wikicode]

Structure recommandée

[modifier | modifier le wikicode]
  • Root directory utilisateur :
 /var/sftpgo-homes/<user>
  • Données réelles :
 /var/data/<client>-data/data/
  • Utiliser uniquement des "Virtual folders" pour exposer les données :
 /pleade  → <client>-pleade
 /projets → <client>-projects

Sécurité des répertoires

[modifier | modifier le wikicode]
  • Interdire toute écriture à la racine :
 chmod 555 /var/sftpgo-homes/<user>
  • Objectif :
 empêcher la création de dossiers hors périmètre (ex: /toto)

Permissions (ACL)

[modifier | modifier le wikicode]
  • Ne jamais utiliser '*' sur '/'
  • Configuration recommandée :
 /          → list, download
 /pleade    → *
 /projets   → *
  • Risque sinon :
 création de fichiers/dossiers hors des répertoires prévus

Restrictions horaires

[modifier | modifier le wikicode]
  • ATTENTION :
 une restriction horaire invalide provoque un "invalid credentials"
  • Exemple dangereux :
 Sunday 00:00 → 23:59
  • Bonne pratique :
 - supprimer les restrictions si inutiles
 - ou définir tous les jours explicitement
  • "Require password change" :
 fonctionne uniquement via WebClient
 → ne pas activer pour des utilisateurs SFTP (FileZilla)
  • Si problème :
 utiliser :
 sftpgo resetpwd --admin <admin>

Debug authentification

[modifier | modifier le wikicode]
  • Vérifier dans la base :
 sqlite3 /var/lib/sftpgo/sftpgo.db
 select username,status from users;
  • status = 1 → OK
  • Causes fréquentes d’échec :
 - restriction horaire
 - ACL incorrectes
 - IP non autorisée
 - mauvais protocole (Web vs SFTP)

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

Réseau / sécurité

[modifier | modifier le wikicode]
  • Restreindre l’accès WebAdmin (port 9090) via UFW :
 ufw allow from <IP> to any port 9090
  • Ne jamais exposer WebAdmin publiquement

Pièges connus

[modifier | modifier le wikicode]
  • Bouton "Add folder" visible même si interdit → normal
  • Message "invalid credentials" trompeur
  • Droits '*' mal placés = fuite de périmètre
  • Root writable = chaos assuré

Bonnes pratiques générales

[modifier | modifier le wikicode]
  • Toujours tester avec un utilisateur client réel
  • Vérifier :
 - création de fichiers
 - impossibilité de sortir du périmètre
 - quotas visibles
  • Documenter chaque règle ajoutée