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
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]Objectif
[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.
---
Pré-requis
[modifier | modifier le wikicode]- serveur Ubuntu 24 (noble) fonctionnel ;
- accès root ;
- datasets clients déjà montés sous
/var/data/; - groupe
pleadeexistant ; - 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
2022pour 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
Explication
[modifier | modifier le wikicode]- les données clients appartiennent au groupe
pleade; - SFTPGo doit pouvoir lire/écrire dans ces répertoires ;
- l’ajout au groupe
pleadepermet 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
rwxpour 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>
Explication
[modifier | modifier le wikicode]- 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/.
Vérification
[modifier | modifier le wikicode]ls -la /srv/sftpgo
grep -R "/srv/sftpgo" /etc/sftpgo
Conclusion
[modifier | modifier le wikicode]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-homespour les homes techniques ;/var/lib/sftpgopour 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-privatevia 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.
---
Groupes SFTP
[modifier | modifier le wikicode]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
pleadedans un blocMatch; - le groupe
pleadesert uniquement à la gestion des droits sur les fichiers ; - cette séparation permet de conserver des comptes administrateurs (ex :
ajlsm) avec accès SSH complet.
---
Quotas SFTPGo
[modifier | modifier le wikicode]Par défaut, SFTPGo applique :
Quota size = -1Quota 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
projetsne doit pas pouvoir être supprimé ; - le répertoire
projetsne 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/.
Vérification
[modifier | modifier le wikicode]ls -la /srv/sftpgo
grep -R "/srv/sftpgo" /etc/sftpgo
Conclusion
[modifier | modifier le wikicode]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-homespour les homes techniques ;/var/lib/sftpgopour 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]Objectif
[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 :
Cas global
[modifier | modifier le wikicode]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.
Conclusion
[modifier | modifier le wikicode]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} ==="
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
Conclusion
[modifier | modifier le wikicode]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.