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

« Installation de SFTPGo sur eole3 » : différence entre les versions

De AJLSM
Aller à la navigation Aller à la recherche
Page créée avec « == Installation de SFTPGo sur eole3 == category:eole3 === Objectif === Mettre en place un serveur SFTP moderne permettant : * la gestion fine des accès ; * la sépa... »
 
 
(12 versions intermédiaires par le même utilisateur non affichées)
Ligne 163 : Ligne 163 :


---
---
=== Répertoire /srv/sftpgo ===
Par défaut, SFTPGo utilise le répertoire <code>/srv/sftpgo</code> pour :
* le stockage local des utilisateurs ;
* les sauvegardes internes.
Dans l’architecture eole3 :
* les données sont stockées dans <code>/var/data/</code> (ZFS) ;
* les accès se font via des virtual folders ;
* les répertoires techniques sont dans <code>/var/sftpgo-homes/</code>.
==== Vérification ====
<syntaxhighlight lang="bash">
ls -la /srv/sftpgo
grep -R "/srv/sftpgo" /etc/sftpgo
</syntaxhighlight>
==== Conclusion ====
Si le répertoire est vide et non utilisé :
<syntaxhighlight lang="bash">
rm -rf /srv/sftpgo
</syntaxhighlight>
==== Recommandation ====
Adapter la configuration SFTPGo pour utiliser :
* <code>/var/sftpgo-homes</code> pour les homes techniques ;
* <code>/var/lib/sftpgo</code> pour les données internes.
Le répertoire <code>/srv/sftpgo</code> ne doit pas être utilisé dans une architecture basée sur ZFS et virtual folders.
À modifier dans : {{path|/etc/sftpgo/sftpgo.json}}
<syntaxhighlight lang="bash">"users_base_dir": "/var/sftpgo-homes",
...
"backups_path": "/var/lib/sftpgo/backups"</syntaxhighlight>
Puis :
<syntaxhighlight lang="bash">systemctl restart sftpgo</syntaxhighlight>


=== Organisation des données clients ===
=== Organisation des données clients ===
Ligne 192 : Ligne 235 :


---
---
Avant de lancer la modificatiopn des acl, on fait un backup des acl de chaque client stockées dans {{path|/root/acl_backups/}}
'''Audit apbp :''' ensemble globalement cohérent. La racine client et les arborescences preprod/prod/projets sont correctes. On observe en revanche des permissions historiques trop ouvertes sur pleade, files, images et plusieurs sous-répertoires (777 au lieu de droits plus stricts). '''Un écart notable est relevé sur pleade/preprod/iiif-datadir, appartenant à ad53:pleade alors qu’il se trouve dans l’arborescence du client apbp'''. Pas de blocage apparent, mais une normalisation des droits et propriétaires est nécessaire.
'''Problème :''' les acl ont été mal modifiées :
Restauration avec la commandes suivantes :
<syntaxhighlight lang="bash">setfacl --restore=/root/acl-backups/ad64_before_rights_2026-04-10_143446.acl</syntaxhighlight>
apbp validé après correction du script {{path|02_apply_client_rules.sh}}. Les propriétaires sont désormais corrects (apbp:pleade), les permissions sont homogènes et conformes à la politique attendue : BASE en 1775, racine pleade et niveau 1 en 3775, niveau 2 et projets en 2775. L’anomalie précédente sur les ownerships a disparu.


=== Interaction avec rsync eole2 → eole3 ===
=== Interaction avec rsync eole2 → eole3 ===
Ligne 219 : Ligne 273 :


---
---
=== Groupes SFTP ===
Les comptes clients doivent appartenir au groupe :
* <code>eole3-sftp</code>
Ce groupe est utilisé exclusivement pour appliquer les règles SSH suivantes :
<pre>
Match Group eole3-sftp
    ChrootDirectory %h
    ForceCommand internal-sftp
</pre>
Important :
* ne jamais utiliser le groupe <code>pleade</code> dans un bloc <code>Match</code> ;
* le groupe <code>pleade</code> sert uniquement à la gestion des droits sur les fichiers ;
* cette séparation permet de conserver des comptes administrateurs (ex : <code>ajlsm</code>) avec accès SSH complet.
---
=== Quotas SFTPGo ===
Par défaut, SFTPGo applique :
* <code>Quota size = -1</code>
* <code>Quota files = -1</code>
Signification :
* <code>-1</code> = illimité
Recommandation :
* ne pas définir de quotas dans le template par défaut ;
* définir les quotas uniquement au cas par cas selon les besoins client ;
* éviter les conflits avec les quotas ZFS.
=== Règle sur le répertoire projets ===
Le répertoire <code>/data/projets</code> constitue un point d’entrée fixe.
Règle :
* le répertoire <code>projets</code> ne doit pas pouvoir être supprimé ;
* le répertoire <code>projets</code> ne doit pas pouvoir être déplacé ou renommé ;
* en revanche, son contenu interne est librement modifiable par le client.
Le client peut donc :
* créer des sous-répertoires ;
* déposer des fichiers ;
* remplacer des fichiers ;
* supprimer ou déplacer des éléments à l’intérieur de <code>projets</code>.
Cette règle est obtenue par :
* protection du répertoire parent ;
* propriété administrative du répertoire <code>projets</code> ;
* droits d’écriture accordés via le groupe <code>pleade</code>.
=== Gestion des quotas avec SFTPGo ===
SFTPGo permet de définir des quotas à deux niveaux :
==== 1. Quota utilisateur ====
Défini dans "Disk quota and bandwidth limits".
* 0 = illimité
* valeur (ex : 250GB) = quota global utilisateur
==== 2. Quota par virtual folder ====
* -1 = inclus dans le quota utilisateur
* 0 = illimité
* valeur = quota spécifique au dossier
==== Bonnes pratiques ====
* utiliser le quota utilisateur comme limite principale ;
* laisser les virtual folders à -1 pour mutualiser l’espace ;
* éviter de cumuler plusieurs quotas de virtual folders ;
* aligner les quotas SFTPGo avec les quotas ZFS.
Exemple :
* Quota utilisateur : 250GB
* /pleade : -1
* /projets : -1
→ le client dispose de 250GB au total, répartis librement.
=== Répertoire /srv/sftpgo ===
Par défaut, SFTPGo utilise le répertoire <code>/srv/sftpgo</code> pour :
* le stockage local des utilisateurs ;
* les sauvegardes internes.
Dans l’architecture eole3 :
* les données sont stockées dans <code>/var/data/</code> (ZFS) ;
* les accès se font via des virtual folders ;
* les répertoires techniques sont dans <code>/var/sftpgo-homes/</code>.
==== Vérification ====
<syntaxhighlight lang="bash">
ls -la /srv/sftpgo
grep -R "/srv/sftpgo" /etc/sftpgo
</syntaxhighlight>
==== Conclusion ====
Si le répertoire est vide et non utilisé :
<syntaxhighlight lang="bash">
rm -rf /srv/sftpgo
</syntaxhighlight>
==== Recommandation ====
Adapter la configuration SFTPGo pour utiliser :
* <code>/var/sftpgo-homes</code> pour les homes techniques ;
* <code>/var/lib/sftpgo</code> pour les données internes.
Le répertoire <code>/srv/sftpgo</code> ne doit pas être utilisé dans une architecture basée sur ZFS et virtual folders.
== Harmonisation des droits clients pour SFTPGo sur eole3 ==
[[category:eole3]]
=== Objectif ===
Cette procédure a pour but d’harmoniser les droits Unix des répertoires clients afin de rendre le fonctionnement de SFTPGo :
* prévisible ;
* homogène ;
* réversible en cas de problème.
L’objectif n’est pas de remplacer les droits Unix par SFTPGo, mais de faire en sorte que :
* les droits Unix restent la base de vérité ;
* SFTPGo applique ensuite une couche logique cohérente par client.
---
=== Pourquoi cette harmonisation est nécessaire ===
Lors des tests avec SFTPGo, il est apparu que les arborescences clientes historiques étaient hétérogènes :
* certains répertoires étaient en 755 ;
* d’autres en 775 ;
* d’autres encore en 777 ;
* les propriétaires n’étaient pas homogènes ;
* certaines branches permettaient l’écriture, d’autres non.
Cela produisait des comportements incohérents pour les utilisateurs :
* dépôt possible dans certains sous-répertoires ;
* création de dossier refusée dans d’autres ;
* suppression possible ici, impossible là.
Exemple constaté :
* /projets fonctionnait correctement ;
* dans /pleade, certaines branches autorisaient l’écriture et d’autres non uniquement à cause des droits Unix.
La mise en place de SFTPGo a donc conduit à formaliser une doctrine Unix homogène.
---
=== Doctrine retenue ===
==== Répertoire pleade ====
Règles générales :
* Tous les fichiers : 664
* Tous les répertoires : 775
* Groupe : pleade
Restrictions structurelles :
* Niveau 1 (ex : internet, preprod, slecture) :
** non supprimables ;
** non déplaçables.
* Niveau 2 (ex : images, pdf, csv, etc.) :
** non supprimables ;
** non déplaçables.
Comportement attendu :
* les utilisateurs peuvent modifier le contenu ;
* ils ne peuvent pas casser la structure.
---
==== Répertoire projets ====
Règles générales :
* Répertoire racine :
** non supprimable ;
** non déplaçable.
* Contenu :
** liberté totale pour les utilisateurs.
Droits :
* répertoires : 775
* fichiers : 664
---
==== Protection structurelle ====
La protection repose sur les bits Unix :
* sticky bit (t) → empêche suppression/déplacement
* setgid (g+s) → conserve le groupe pleade
---
=== Principe de mise en œuvre ===
La mise en conformité se fait client par client avec trois scripts :
* audit ;
* application des règles ;
* vérification.
---
=== 1. Script d’audit ===
Fichier :
<syntaxhighlight lang="bash">
/opt/scripts_clients_sftpgo/01_audit_client.sh
</syntaxhighlight>
Utilisation :
<syntaxhighlight lang="bash">
./01_audit_client.sh ad53
</syntaxhighlight>
Ce script permet de :
* visualiser les droits existants ;
* identifier les incohérences ;
* vérifier la présence des répertoires pleade et projets ;
* détecter les ACL éventuelles.
Aucune modification n’est effectuée.
---
=== 2. Script d’application des règles ===
Fichier :
<syntaxhighlight lang="bash">
/opt/scripts_clients_sftpgo/02_apply_client_rules.sh
</syntaxhighlight>
Utilisation :
<syntaxhighlight lang="bash">
./02_apply_client_rules.sh ad53
</syntaxhighlight>
Ce script applique :
* homogénéisation des droits :
** dossiers en 775 ;
** fichiers en 664 ;
* sécurisation de la structure :
** sticky bit sur pleade et niveaux 1 ;
** setgid pour conserver le groupe ;
* création de /projets si absent ;
* protection de la structure via :
** chmod 3775 sur pleade ;
** chmod 3775 sur niveau 1 ;
** chmod 2775 sur niveau 2 ;
** chmod 2775 sur projets ;
** chmod 1775 sur le parent.
---
=== 3. Script de vérification ===
Fichier :
<syntaxhighlight lang="bash">
/opt/scripts_clients_sftpgo/03_verify_client.sh
</syntaxhighlight>
Utilisation :
<syntaxhighlight lang="bash">
./03_verify_client.sh ad53
</syntaxhighlight>
Permet de vérifier :
* les droits appliqués ;
* la présence des bits t et g+s ;
* la cohérence globale.
---
=== Sauvegarde des ACL ===
Avant toute modification, une sauvegarde complète des ACL a été réalisée.
Emplacement :
<syntaxhighlight lang="bash">
/root/acl-backups/
</syntaxhighlight>
Contenu :
* un backup global :
<syntaxhighlight lang="bash">
acl-backup-2026-04-09_1230.acl
</syntaxhighlight>
* un backup compressé :
<syntaxhighlight lang="bash">
acl-backup-2026-04-09_1230_acl.tar.gz
</syntaxhighlight>
* un backup par client :
<syntaxhighlight lang="bash">
ad53_before_rights_YYYY-MM-DD_HHMMSS.acl
</syntaxhighlight>
---
=== Réversibilité ===
La restauration peut être faite :
==== Cas global ====
<syntaxhighlight lang="bash">
setfacl --restore=/root/acl-backups/acl-backup-2026-04-09_1230.acl
</syntaxhighlight>
==== Cas par client ====
<syntaxhighlight lang="bash">
setfacl --restore=/root/acl-backups/ad53_before_rights_YYYY-MM-DD_HHMMSS.acl
</syntaxhighlight>
---
=== Bonnes pratiques ===
* Toujours auditer avant modification ;
* Appliquer client par client ;
* Vérifier après chaque application ;
* Ne jamais modifier en masse sans backup ;
* Conserver les ACL de référence.
---
<pre>
Audit apbp : ensemble globalement cohérent. La racine client et les arborescences preprod/prod/projets sont correctes. On observe en revanche des permissions historiques trop ouvertes sur pleade, files, images et plusieurs sous-répertoires (777 au lieu de droits plus stricts). Un écart notable est relevé sur pleade/preprod/iiif-datadir, appartenant à ad53:pleade alors qu’il se trouve dans l’arborescence du client apbp. Pas de blocage apparent, mais une normalisation des droits et propriétaires est nécessaire.
</pre>
=== Conclusion ===
Cette approche permet :
* un comportement SFTP cohérent ;
* une base Unix propre ;
* une maintenance simplifiée ;
* une réversibilité totale en cas de problème.
La combinaison :
* droits Unix maîtrisés ;
* + SFTPGo
garantit un système robuste et prévisible.
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
CLIENT="${1:?Usage: $0 <client>}"
BASE="/var/data/${CLIENT}-data/data"
PLEADE="${BASE}/pleade"
# Cas standard
PROJETS="${BASE}/projets"
# Cas particulier ad64
if [ "$CLIENT" = "ad64" ] && [ -d "${BASE}/projet" ] && [ ! -d "${BASE}/projets" ]; then
  PROJETS="${BASE}/projet"
fi
if [ ! -d "$BASE" ]; then
  echo "ERREUR: base absente: $BASE"
  exit 1
fi
echo "=== APPLICATION REGLES CLIENT ${CLIENT} ==="
echo
echo "--- TRAITEMENT PLEADE ---"
if [ -d "$PLEADE" ]; then
  # 1. Uniformisation du contenu
  find "$PLEADE" -type d -exec chmod 775 {} \;
  find "$PLEADE" -type f -exec chmod 664 {} \;
  # 2. Racine pleade : non supprimable / non deplacable
  chown "${CLIENT}:pleade" "$PLEADE"
  chmod 3775 "$PLEADE"
  # 3. Niveau 1 : non supprimable / non deplacable
  find "$PLEADE" -mindepth 1 -maxdepth 1 -type d -exec chown "${CLIENT}:pleade" {} \;
  find "$PLEADE" -mindepth 1 -maxdepth 1 -type d -exec chmod 3775 {} \;
  # 4. Niveau 2 : groupe herite, sans sticky bit
  find "$PLEADE" -mindepth 2 -maxdepth 2 -type d -exec chown "${CLIENT}:pleade" {} \;
  find "$PLEADE" -mindepth 2 -maxdepth 2 -type d -exec chmod 2775 {} \;
  echo "OK: regles appliquees sur $PLEADE"
else
  echo "INFO: pas de repertoire pleade, rien a faire"
fi
echo
echo "--- TRAITEMENT PROJETS ---"
if [ ! -d "$PROJETS" ]; then
  echo "INFO: creation de $PROJETS"
  mkdir -p "$PROJETS"
fi
# 1. Projets lui-meme : groupe herite
chown "${CLIENT}:pleade" "$PROJETS"
chmod 2775 "$PROJETS"
# 2. Protection du parent BASE pour figer projets
chown "${CLIENT}:pleade" "$BASE"
chmod 1775 "$BASE"
# 3. Contenu libre dans projets
find "$PROJETS" -mindepth 1 -type d -exec chmod 775 {} \; || true
find "$PROJETS" -type f -exec chmod 664 {} \; || true
echo "OK: regles appliquees sur $PROJETS"
echo
echo "=== FIN APPLICATION ${CLIENT} ==="
<pre>
ad44-pleade        /var/data/ad44-data/data/pleade
ad44-projets      /var/data/ad44-data/data/projets
ad53-pleade        /var/data/ad53-data/data/pleade
ad53-projets      /var/data/ad53-data/data/projets
ad64-pleade        /var/data/ad64-data/data/pleade
ad64-projet        /var/data/ad64-data/data/projet
am-angers-pleade  /var/data/am-angers-data/data/pleade
am-angers-projets  /var/data/am-angers-data/data/projets
apbp-pleade        /var/data/apbp-data/data/pleade
apbp-projets      /var/data/apbp-data/data/projets
bm-rouen-pleade    /var/data/bm-rouen-data/data/pleade
bm-rouen-projets  /var/data/bm-rouen-data/data/projets
canigo-pleade      /var/data/canigo-data/data/pleade
canigo-projets    /var/data/canigo-data/data/projets
cdf-pleade        /var/data/cdf-data/data/pleade
cdf-projets        /var/data/cdf-data/data/projets
cnd-pleade        /var/data/cnd-data/data/pleade
cnd-projets        /var/data/cnd-data/data/projets
demo-v4-pleade    /var/data/demo-v4-data/data/pleade
demo-v4-projets    /var/data/demo-v4-data/data/projets
drac-ge-pleade    /var/data/drac-ge-data/data/pleade
drac-ge-projets    /var/data/drac-ge-data/data/projets
ens-lyon-pleade    /var/data/ens-lyon-data/data/pleade
ens-lyon-projets  /var/data/ens-lyon-data/data/projets
formation0-pleade  /var/data/formation0-data/data/pleade
formation0-projets /var/data/formation0-data/data/projets
formation1-pleade  /var/data/formation1-data/data/pleade
formation1-projets /var/data/formation1-data/data/projets
formation2-pleade  /var/data/formation2-data/data/pleade
formation2-projets /var/data/formation2-data/data/projets
formation3-pleade  /var/data/formation3-data/data/pleade
formation3-projets /var/data/formation3-data/data/projets
formation4-pleade  /var/data/formation4-data/data/pleade
formation4-projets /var/data/formation4-data/data/projets
ftp-ajlsm-pleade  /var/data/ftp-ajlsm-data/data/pleade
ftp-ajlsm-projets  /var/data/ftp-ajlsm-data/data/projets
module-pleade-pleade  /var/data/module-pleade-data/data/pleade
module-pleade-projets  /var/data/module-pleade-data/data/projets
msh-dijon-pleade  /var/data/msh-dijon-data/data/pleade
msh-dijon-projets  /var/data/msh-dijon-data/data/projets
pleade.com-pleade  /var/data/pleade.com-data/data/pleade
pleade.com-projets /var/data/pleade.com-data/data/projets
port-dunkerque-pleade  /var/data/port-dunkerque-data/data/pleade
port-dunkerque-projets  /var/data/port-dunkerque-data/data/projets
siges-pleade      /var/data/siges-data/data/pleade
siges-projets      /var/data/siges-data/data/projets
test-ajlsm-pleade  /var/data/test-ajlsm-data/data/pleade
test-ajlsm-projets /var/data/test-ajlsm-data/data/projets
test-ftp-pleade    /var/data/test-ftp-data/data/pleade
test-ftp-projets  /var/data/test-ftp-data/data/projets
</pre>


=== Conclusion ===
=== Conclusion ===

Dernière version du 10 avril 2026 à 20:20

Installation de SFTPGo sur eole3

[modifier | modifier le wikicode]

Mettre en place un serveur SFTP moderne permettant :

  • la gestion fine des accès ;
  • la séparation logique des données via des virtual folders ;
  • la gestion des quotas indépendamment de ZFS ;
  • une alternative à OpenSSH SFTP utilisé en mode secours.

---

  • serveur Ubuntu 24 (noble) fonctionnel ;
  • accès root ;
  • datasets clients déjà montés sous /var/data/ ;
  • groupe pleade existant ;
  • service SSH déjà configuré.

---

Installation du dépôt SFTPGo

[modifier | modifier le wikicode]

Installation des dépendances :

apt update
apt install -y software-properties-common

Ajout du dépôt officiel via PPA :

add-apt-repository ppa:sftpgo/sftpgo
apt update

---

Installation de SFTPGo

[modifier | modifier le wikicode]
apt install -y sftpgo

---

Vérification du service

[modifier | modifier le wikicode]
systemctl status sftpgo

Résultat attendu :

  • service actif (running) ;
  • écoute par défaut sur le port 2022 pour SFTP.

---

Activation au démarrage

[modifier | modifier le wikicode]
systemctl enable --now sftpgo

---

Fonctionnement du service

[modifier | modifier le wikicode]
  • le service tourne avec l’utilisateur système sftpgo ;
  • UID typique : 995 ;
  • GID typique : 987.

Vérification :

id sftpgo

---

Accès aux données

[modifier | modifier le wikicode]

Par défaut, l’utilisateur sftpgo n’a accès à aucun dataset client.

Pour permettre l’accès aux données :

usermod -aG pleade sftpgo
systemctl restart sftpgo
  • les données clients appartiennent au groupe pleade ;
  • SFTPGo doit pouvoir lire/écrire dans ces répertoires ;
  • l’ajout au groupe pleade permet cet accès.

⚠️ Important :

  • il s’agit d’un accès technique (daemon), pas d’un utilisateur humain ;
  • ne pas ajouter d’utilisateurs humains dans ce groupe pour des raisons de sécurité.

---

Vérification des accès aux datasets

[modifier | modifier le wikicode]

Exemple :

namei -l /var/data/apbp-data/data/pleade

Conditions nécessaires :

  • tous les répertoires traversés doivent être au minimum r-x ;
  • les répertoires d’écriture doivent être rwx pour le groupe.

---

Droits recommandés

[modifier | modifier le wikicode]

Pour les zones d’écriture :

chmod -R 775 /var/data/<client>-data/data/pleade
chmod -R 775 /var/data/<client>-data/data/projets

⚠️ Ne pas modifier :

  • data-private (zone interne applicative) ;
  • les répertoires système.

---

Répertoire technique des homes SFTPGo

[modifier | modifier le wikicode]

Créer un répertoire dédié pour les chroot techniques :

mkdir -p /var/sftpgo-homes
chown sftpgo:sftpgo /var/sftpgo-homes
chmod 755 /var/sftpgo-homes

Puis, pour chaque client :

mkdir -p /var/sftpgo-homes/<client>
chown sftpgo:sftpgo /var/sftpgo-homes/<client>
chmod 755 /var/sftpgo-homes/<client>
  • ces répertoires servent de racine technique pour SFTPGo ;
  • ils restent vides ;
  • les données réelles sont montées via des virtual folders.

---

Répertoire /srv/sftpgo

[modifier | modifier le wikicode]

Par défaut, SFTPGo utilise le répertoire /srv/sftpgo pour :

  • le stockage local des utilisateurs ;
  • les sauvegardes internes.

Dans l’architecture eole3 :

  • les données sont stockées dans /var/data/ (ZFS) ;
  • les accès se font via des virtual folders ;
  • les répertoires techniques sont dans /var/sftpgo-homes/.
ls -la /srv/sftpgo
grep -R "/srv/sftpgo" /etc/sftpgo

Si le répertoire est vide et non utilisé :

rm -rf /srv/sftpgo

Recommandation

[modifier | modifier le wikicode]

Adapter la configuration SFTPGo pour utiliser :

  • /var/sftpgo-homes pour les homes techniques ;
  • /var/lib/sftpgo pour les données internes.

Le répertoire /srv/sftpgo ne doit pas être utilisé dans une architecture basée sur ZFS et virtual folders.

À modifier dans : /etc/sftpgo/sftpgo.json

"users_base_dir": "/var/sftpgo-homes",
...
"backups_path": "/var/lib/sftpgo/backups"

Puis :

systemctl restart sftpgo

Organisation des données clients

[modifier | modifier le wikicode]

Structure cible :

/var/data/<client>-data/
└── data/
    ├── pleade/
    ├── projets/
    └── data-private/

Règles :

  • pleade : dépôt client principal ;
  • projets : espace de travail client ;
  • data-private : données internes (non exposées).

---

Bonnes pratiques

[modifier | modifier le wikicode]
  • ne jamais exposer data-private via SFTPGo ;
  • limiter l’écriture aux seuls répertoires nécessaires ;
  • conserver les droits Unix comme source de vérité ;
  • utiliser SFTPGo comme couche de présentation et de contrôle.

--- Avant de lancer la modificatiopn des acl, on fait un backup des acl de chaque client stockées dans /root/acl_backups/

Audit apbp : ensemble globalement cohérent. La racine client et les arborescences preprod/prod/projets sont correctes. On observe en revanche des permissions historiques trop ouvertes sur pleade, files, images et plusieurs sous-répertoires (777 au lieu de droits plus stricts). Un écart notable est relevé sur pleade/preprod/iiif-datadir, appartenant à ad53:pleade alors qu’il se trouve dans l’arborescence du client apbp. Pas de blocage apparent, mais une normalisation des droits et propriétaires est nécessaire.

Problème : les acl ont été mal modifiées :

Restauration avec la commandes suivantes :

setfacl --restore=/root/acl-backups/ad64_before_rights_2026-04-10_143446.acl


apbp validé après correction du script 02_apply_client_rules.sh. Les propriétaires sont désormais corrects (apbp:pleade), les permissions sont homogènes et conformes à la politique attendue : BASE en 1775, racine pleade et niveau 1 en 3775, niveau 2 et projets en 2775. L’anomalie précédente sur les ownerships a disparu.

Interaction avec rsync eole2 → eole3

[modifier | modifier le wikicode]

Le rsync synchronise :

/var/data/<client>-data/ → /var/data/<client>-data/data/

Options utilisées :

-aHAX --numeric-ids --delete-after

Conséquences :

  • les fichiers sont synchronisés depuis eole2 ;
  • les permissions, ACL et propriétaires peuvent être écrasés ;
  • les fichiers absents côté eole2 peuvent être supprimés.

⚠️ Recommandation :

  • désactiver le cron rsync avant toute modification des droits ;
  • ou travailler hors des répertoires synchronisés.

---

Les comptes clients doivent appartenir au groupe :

  • eole3-sftp

Ce groupe est utilisé exclusivement pour appliquer les règles SSH suivantes :

Match Group eole3-sftp
    ChrootDirectory %h
    ForceCommand internal-sftp

Important :

  • ne jamais utiliser le groupe pleade dans un bloc Match ;
  • le groupe pleade sert uniquement à la gestion des droits sur les fichiers ;
  • cette séparation permet de conserver des comptes administrateurs (ex : ajlsm) avec accès SSH complet.

---

Par défaut, SFTPGo applique :

  • Quota size = -1
  • Quota files = -1

Signification :

  • -1 = illimité

Recommandation :

  • ne pas définir de quotas dans le template par défaut ;
  • définir les quotas uniquement au cas par cas selon les besoins client ;
  • éviter les conflits avec les quotas ZFS.

Règle sur le répertoire projets

[modifier | modifier le wikicode]

Le répertoire /data/projets constitue un point d’entrée fixe.

Règle :

  • le répertoire projets ne doit pas pouvoir être supprimé ;
  • le répertoire projets ne doit pas pouvoir être déplacé ou renommé ;
  • en revanche, son contenu interne est librement modifiable par le client.

Le client peut donc :

  • créer des sous-répertoires ;
  • déposer des fichiers ;
  • remplacer des fichiers ;
  • supprimer ou déplacer des éléments à l’intérieur de projets.

Cette règle est obtenue par :

  • protection du répertoire parent ;
  • propriété administrative du répertoire projets ;
  • droits d’écriture accordés via le groupe pleade.

Gestion des quotas avec SFTPGo

[modifier | modifier le wikicode]

SFTPGo permet de définir des quotas à deux niveaux :

1. Quota utilisateur

[modifier | modifier le wikicode]

Défini dans "Disk quota and bandwidth limits".

  • 0 = illimité
  • valeur (ex : 250GB) = quota global utilisateur

2. Quota par virtual folder

[modifier | modifier le wikicode]
  • -1 = inclus dans le quota utilisateur
  • 0 = illimité
  • valeur = quota spécifique au dossier

Bonnes pratiques

[modifier | modifier le wikicode]
  • utiliser le quota utilisateur comme limite principale ;
  • laisser les virtual folders à -1 pour mutualiser l’espace ;
  • éviter de cumuler plusieurs quotas de virtual folders ;
  • aligner les quotas SFTPGo avec les quotas ZFS.

Exemple :

  • Quota utilisateur : 250GB
  • /pleade : -1
  • /projets : -1

→ le client dispose de 250GB au total, répartis librement.


Répertoire /srv/sftpgo

[modifier | modifier le wikicode]

Par défaut, SFTPGo utilise le répertoire /srv/sftpgo pour :

  • le stockage local des utilisateurs ;
  • les sauvegardes internes.

Dans l’architecture eole3 :

  • les données sont stockées dans /var/data/ (ZFS) ;
  • les accès se font via des virtual folders ;
  • les répertoires techniques sont dans /var/sftpgo-homes/.
ls -la /srv/sftpgo
grep -R "/srv/sftpgo" /etc/sftpgo

Si le répertoire est vide et non utilisé :

rm -rf /srv/sftpgo

Recommandation

[modifier | modifier le wikicode]

Adapter la configuration SFTPGo pour utiliser :

  • /var/sftpgo-homes pour les homes techniques ;
  • /var/lib/sftpgo pour les données internes.

Le répertoire /srv/sftpgo ne doit pas être utilisé dans une architecture basée sur ZFS et virtual folders.

Harmonisation des droits clients pour SFTPGo sur eole3

[modifier | modifier le wikicode]

Cette procédure a pour but d’harmoniser les droits Unix des répertoires clients afin de rendre le fonctionnement de SFTPGo :

  • prévisible ;
  • homogène ;
  • réversible en cas de problème.

L’objectif n’est pas de remplacer les droits Unix par SFTPGo, mais de faire en sorte que :

  • les droits Unix restent la base de vérité ;
  • SFTPGo applique ensuite une couche logique cohérente par client.

---

Pourquoi cette harmonisation est nécessaire

[modifier | modifier le wikicode]

Lors des tests avec SFTPGo, il est apparu que les arborescences clientes historiques étaient hétérogènes :

  • certains répertoires étaient en 755 ;
  • d’autres en 775 ;
  • d’autres encore en 777 ;
  • les propriétaires n’étaient pas homogènes ;
  • certaines branches permettaient l’écriture, d’autres non.

Cela produisait des comportements incohérents pour les utilisateurs :

  • dépôt possible dans certains sous-répertoires ;
  • création de dossier refusée dans d’autres ;
  • suppression possible ici, impossible là.

Exemple constaté :

  • /projets fonctionnait correctement ;
  • dans /pleade, certaines branches autorisaient l’écriture et d’autres non uniquement à cause des droits Unix.

La mise en place de SFTPGo a donc conduit à formaliser une doctrine Unix homogène.

---

Doctrine retenue

[modifier | modifier le wikicode]

Répertoire pleade

[modifier | modifier le wikicode]

Règles générales :

  • Tous les fichiers : 664
  • Tous les répertoires : 775
  • Groupe : pleade

Restrictions structurelles :

  • Niveau 1 (ex : internet, preprod, slecture) :
    • non supprimables ;
    • non déplaçables.
  • Niveau 2 (ex : images, pdf, csv, etc.) :
    • non supprimables ;
    • non déplaçables.

Comportement attendu :

  • les utilisateurs peuvent modifier le contenu ;
  • ils ne peuvent pas casser la structure.

---

Répertoire projets

[modifier | modifier le wikicode]

Règles générales :

  • Répertoire racine :
    • non supprimable ;
    • non déplaçable.
  • Contenu :
    • liberté totale pour les utilisateurs.

Droits :

  • répertoires : 775
  • fichiers : 664

---

Protection structurelle

[modifier | modifier le wikicode]

La protection repose sur les bits Unix :

  • sticky bit (t) → empêche suppression/déplacement
  • setgid (g+s) → conserve le groupe pleade

---

Principe de mise en œuvre

[modifier | modifier le wikicode]

La mise en conformité se fait client par client avec trois scripts :

  • audit ;
  • application des règles ;
  • vérification.

---

1. Script d’audit

[modifier | modifier le wikicode]

Fichier :

/opt/scripts_clients_sftpgo/01_audit_client.sh

Utilisation :

./01_audit_client.sh ad53

Ce script permet de :

  • visualiser les droits existants ;
  • identifier les incohérences ;
  • vérifier la présence des répertoires pleade et projets ;
  • détecter les ACL éventuelles.

Aucune modification n’est effectuée.

---

2. Script d’application des règles

[modifier | modifier le wikicode]

Fichier :

/opt/scripts_clients_sftpgo/02_apply_client_rules.sh

Utilisation :

./02_apply_client_rules.sh ad53

Ce script applique :

  • homogénéisation des droits :
    • dossiers en 775 ;
    • fichiers en 664 ;
  • sécurisation de la structure :
    • sticky bit sur pleade et niveaux 1 ;
    • setgid pour conserver le groupe ;
  • création de /projets si absent ;
  • protection de la structure via :
    • chmod 3775 sur pleade ;
    • chmod 3775 sur niveau 1 ;
    • chmod 2775 sur niveau 2 ;
    • chmod 2775 sur projets ;
    • chmod 1775 sur le parent.

---

3. Script de vérification

[modifier | modifier le wikicode]

Fichier :

/opt/scripts_clients_sftpgo/03_verify_client.sh

Utilisation :

./03_verify_client.sh ad53

Permet de vérifier :

  • les droits appliqués ;
  • la présence des bits t et g+s ;
  • la cohérence globale.

---

Sauvegarde des ACL

[modifier | modifier le wikicode]

Avant toute modification, une sauvegarde complète des ACL a été réalisée.

Emplacement :

/root/acl-backups/

Contenu :

  • un backup global :
acl-backup-2026-04-09_1230.acl
  • un backup compressé :
acl-backup-2026-04-09_1230_acl.tar.gz
  • un backup par client :
ad53_before_rights_YYYY-MM-DD_HHMMSS.acl

---

Réversibilité

[modifier | modifier le wikicode]

La restauration peut être faite :

setfacl --restore=/root/acl-backups/acl-backup-2026-04-09_1230.acl

Cas par client

[modifier | modifier le wikicode]
setfacl --restore=/root/acl-backups/ad53_before_rights_YYYY-MM-DD_HHMMSS.acl

---

Bonnes pratiques

[modifier | modifier le wikicode]
  • Toujours auditer avant modification ;
  • Appliquer client par client ;
  • Vérifier après chaque application ;
  • Ne jamais modifier en masse sans backup ;
  • Conserver les ACL de référence.

---

Audit apbp : ensemble globalement cohérent. La racine client et les arborescences preprod/prod/projets sont correctes. On observe en revanche des permissions historiques trop ouvertes sur pleade, files, images et plusieurs sous-répertoires (777 au lieu de droits plus stricts). Un écart notable est relevé sur pleade/preprod/iiif-datadir, appartenant à ad53:pleade alors qu’il se trouve dans l’arborescence du client apbp. Pas de blocage apparent, mais une normalisation des droits et propriétaires est nécessaire.

Cette approche permet :

  • un comportement SFTP cohérent ;
  • une base Unix propre ;
  • une maintenance simplifiée ;
  • une réversibilité totale en cas de problème.

La combinaison :

  • droits Unix maîtrisés ;
  • + SFTPGo

garantit un système robuste et prévisible.

  1. !/usr/bin/env bash

set -euo pipefail IFS=$'\n\t'

CLIENT="${1:?Usage: $0 <client>}" BASE="/var/data/${CLIENT}-data/data" PLEADE="${BASE}/pleade"

  1. Cas standard

PROJETS="${BASE}/projets"

  1. Cas particulier ad64

if [ "$CLIENT" = "ad64" ] && [ -d "${BASE}/projet" ] && [ ! -d "${BASE}/projets" ]; then

 PROJETS="${BASE}/projet"

fi

if [ ! -d "$BASE" ]; then

 echo "ERREUR: base absente: $BASE"
 exit 1

fi

echo "=== APPLICATION REGLES CLIENT ${CLIENT} ==="

echo echo "--- TRAITEMENT PLEADE ---" if [ -d "$PLEADE" ]; then

 # 1. Uniformisation du contenu
 find "$PLEADE" -type d -exec chmod 775 {} \;
 find "$PLEADE" -type f -exec chmod 664 {} \;
 # 2. Racine pleade : non supprimable / non deplacable
 chown "${CLIENT}:pleade" "$PLEADE"
 chmod 3775 "$PLEADE"
 # 3. Niveau 1 : non supprimable / non deplacable
 find "$PLEADE" -mindepth 1 -maxdepth 1 -type d -exec chown "${CLIENT}:pleade" {} \;
 find "$PLEADE" -mindepth 1 -maxdepth 1 -type d -exec chmod 3775 {} \;
 # 4. Niveau 2 : groupe herite, sans sticky bit
 find "$PLEADE" -mindepth 2 -maxdepth 2 -type d -exec chown "${CLIENT}:pleade" {} \;
 find "$PLEADE" -mindepth 2 -maxdepth 2 -type d -exec chmod 2775 {} \;
 echo "OK: regles appliquees sur $PLEADE"

else

 echo "INFO: pas de repertoire pleade, rien a faire"

fi

echo echo "--- TRAITEMENT PROJETS ---" if [ ! -d "$PROJETS" ]; then

 echo "INFO: creation de $PROJETS"
 mkdir -p "$PROJETS"

fi

  1. 1. Projets lui-meme : groupe herite

chown "${CLIENT}:pleade" "$PROJETS" chmod 2775 "$PROJETS"

  1. 2. Protection du parent BASE pour figer projets

chown "${CLIENT}:pleade" "$BASE" chmod 1775 "$BASE"

  1. 3. Contenu libre dans projets

find "$PROJETS" -mindepth 1 -type d -exec chmod 775 {} \; || true find "$PROJETS" -type f -exec chmod 664 {} \; || true

echo "OK: regles appliquees sur $PROJETS"

echo echo "=== FIN APPLICATION ${CLIENT} ==="

ad44-pleade        /var/data/ad44-data/data/pleade
ad44-projets       /var/data/ad44-data/data/projets

ad53-pleade        /var/data/ad53-data/data/pleade
ad53-projets       /var/data/ad53-data/data/projets

ad64-pleade        /var/data/ad64-data/data/pleade
ad64-projet        /var/data/ad64-data/data/projet

am-angers-pleade   /var/data/am-angers-data/data/pleade
am-angers-projets  /var/data/am-angers-data/data/projets

apbp-pleade        /var/data/apbp-data/data/pleade
apbp-projets       /var/data/apbp-data/data/projets

bm-rouen-pleade    /var/data/bm-rouen-data/data/pleade
bm-rouen-projets   /var/data/bm-rouen-data/data/projets

canigo-pleade      /var/data/canigo-data/data/pleade
canigo-projets     /var/data/canigo-data/data/projets

cdf-pleade         /var/data/cdf-data/data/pleade
cdf-projets        /var/data/cdf-data/data/projets

cnd-pleade         /var/data/cnd-data/data/pleade
cnd-projets        /var/data/cnd-data/data/projets

demo-v4-pleade     /var/data/demo-v4-data/data/pleade
demo-v4-projets    /var/data/demo-v4-data/data/projets

drac-ge-pleade     /var/data/drac-ge-data/data/pleade
drac-ge-projets    /var/data/drac-ge-data/data/projets

ens-lyon-pleade    /var/data/ens-lyon-data/data/pleade
ens-lyon-projets   /var/data/ens-lyon-data/data/projets

formation0-pleade  /var/data/formation0-data/data/pleade
formation0-projets /var/data/formation0-data/data/projets

formation1-pleade  /var/data/formation1-data/data/pleade
formation1-projets /var/data/formation1-data/data/projets

formation2-pleade  /var/data/formation2-data/data/pleade
formation2-projets /var/data/formation2-data/data/projets

formation3-pleade  /var/data/formation3-data/data/pleade
formation3-projets /var/data/formation3-data/data/projets

formation4-pleade  /var/data/formation4-data/data/pleade
formation4-projets /var/data/formation4-data/data/projets

ftp-ajlsm-pleade   /var/data/ftp-ajlsm-data/data/pleade
ftp-ajlsm-projets  /var/data/ftp-ajlsm-data/data/projets

module-pleade-pleade   /var/data/module-pleade-data/data/pleade
module-pleade-projets  /var/data/module-pleade-data/data/projets

msh-dijon-pleade   /var/data/msh-dijon-data/data/pleade
msh-dijon-projets  /var/data/msh-dijon-data/data/projets

pleade.com-pleade  /var/data/pleade.com-data/data/pleade
pleade.com-projets /var/data/pleade.com-data/data/projets

port-dunkerque-pleade   /var/data/port-dunkerque-data/data/pleade
port-dunkerque-projets  /var/data/port-dunkerque-data/data/projets

siges-pleade       /var/data/siges-data/data/pleade
siges-projets      /var/data/siges-data/data/projets

test-ajlsm-pleade  /var/data/test-ajlsm-data/data/pleade
test-ajlsm-projets /var/data/test-ajlsm-data/data/projets

test-ftp-pleade    /var/data/test-ftp-data/data/pleade
test-ftp-projets   /var/data/test-ftp-data/data/projets

L’installation de SFTPGo repose sur :

  • un service système dédié (sftpgo) ;
  • un accès contrôlé aux données via le groupe pleade ;
  • une séparation claire entre :
 * stockage réel (ZFS) ;
 * exposition logique (SFTPGo).

La configuration des accès utilisateurs se fait ensuite via l’interface Web de SFTPGo.