Migration depuis ProFTPD
Bascule d’un ProFTPD a utilisateurs virtuels (AuthUserFile, ftpd.passwd)
vers CraftFileGate.
Le modele
ProFTPD met identite, home et droits dans une entree de ftpd.passwd et des
blocs <Directory>. CraftFileGate les separe : users.toml dit qui vous
etes (username, password_hash, authorized_keys, authorities),
roles.toml ce que vous voyez ([[backends]], [[roles]] et leurs
montages). Le home appartient au montage d’un role, pas a l’utilisateur :
Utilisateurs, roles et montages.
Traduire une entree ftpd.passwd
alice:$6$rounds=5000$xyz...:1001:1001:Alice:/srv/ftp/alice:/bin/false
# users.toml
[[users]]
username = "alice"
password_hash = "$6$rounds=5000$xyz..." # repris tel quel, voir plus bas
authorized_keys = ["ssh-ed25519 AAAA... alice@poste"]
authorities = ["clients"]
# roles.toml : un role pour tous les clients
[[backends]]
name = "ftp"
type = "local"
root = "/srv/ftp"
[[roles]]
name = "clients"
[[roles.mounts]]
backend = "ftp"
home_dir = "/{username}" # DefaultRoot ~ : alice voit /srv/ftp/alice comme /
create_home = true # CreateHome on
acl = [{ path = "/", rights = ["read", "write", "list", "delete", "rename"], recursive = true }]
| Champ ProFTPD | Devient |
|---|---|
| mot de passe | password_hash |
| uid, gid | rien : tout est ecrit par le compte du service, sans setuid |
| home | home_dir du montage, {username} pour %u |
| shell, gecos | rien : seul le sous-systeme sftp est servi |
{username} n’accepte que A-Z a-z 0-9 . _ -, 64 caracteres au plus, sans
point en tete ; un autre nom ne peut pas se connecter a ce montage.
Les mots de passe
[auth.methods]
local = { enabled = true, allow_sha512_crypt = true } # ou allow_bcrypt
$6$ et bcrypt sont repris tels quels (Les hashes) ;
DES et MD5 ($1$) demandent un nouveau mot de passe ou une cle publique.
Reprendre les hashes est une etape de migration : sha512-crypt n’a pas de
durete memoire. Regenerez-les en argon2id a la premiere occasion :
echo -n "mot-de-passe" | craft-file-gate hash-password --user alice # un bloc [[users]]
Un compte qui n’entre que par cle garde un password_hash (le champ est
obligatoire) : mettez-y le hash d’un secret aleatoire, ou coupez les mots de
passe pour tous (local.password = false). Un fournisseur d’identite peut
aussi remplacer users.toml : voir Authentification.
Correspondance des directives
| ProFTPD | CraftFileGate |
|---|---|
AuthUserFile | auth.methods.local.users_file |
AuthGroupFile | authorities et [[roles]] |
DefaultRoot ~ | home_dir = "/{username}" |
CreateHome on | create_home = true (backend local) |
<Directory> et <Limit> | [[roles.mounts.acl]], voir plus bas |
MaxLoginAttempts | [sftp.ban] max_failures : bannit l’adresse |
MaxClientsPerUser | server.max_sessions_per_user |
MaxClients | rien ; [sftp.rate_limit] borne le debit de connexions |
HiddenStores on | [server.hidden_stores] enabled = true ; desactive par defaut, comme ProFTPD |
mod_quotatab | max_file_mb du montage : un plafond par fichier, pas un volume cumule |
TransferLog, ExtendedLog | la piste d’audit, voir Audit |
TLSEngine (FTPS), PassivePorts, MasqueradeAddress | rien : SFTP sur un seul port TCP |
SFTPHostKey | sftp.host_keys |
SFTPAuthorizedUserKeys | authorized_keys de l’utilisateur |
mod_sql, mod_ldap | [auth.jwt] ou auth.authz_base_url |
Umask | l’umask herite au lancement, pour les fichiers des clients (Fichiers de confiance) |
<Anonymous> | un compte dedie, avec un role en lecture |
Avec hidden_stores, le fichier en cours s’appelle comme chez ProFTPD, avec
un jeton : .in.rapport.csv.<jeton>. (Ecritures atomiques).
Traduire les blocs <Limit>
| Commandes FTP | Droit |
|---|---|
RETR, READ | read |
STOR, APPE, MKD, WRITE | write |
LIST, NLST, CWD, DIRS | list |
DELE, RMD | delete |
RNFR, RNTO | rename |
Il n’y a pas d’heritage : l’entree la plus specifique decide seule, et une
sous-arborescence en lecture (<Limit WRITE> DenyAll) re-enonce tout ce
qui y reste permis, { path = "/archive", rights = ["read", "list"], recursive = true }.
Un chemin qu’aucune entree ne couvre est refuse. Voir ACL.
La bascule
| Sujet | CraftFileGate |
|---|---|
reprise d’upload (AllowStoreRestart) | servie, sauf avec hidden_stores et sur S3 |
| propriete des fichiers | le compte du service ; une autre chaine passe par les droits du repertoire (setgid, ACL POSIX) |
| FTP et FTPS | non servis : chaque client passe a SFTP ou a l’API REST |
- Inventorier les clients ; extraire de
ftpd.passwdnoms, hashes et homes. - Ecrire
roles.tomletusers.toml; lancer sur un autre port. - Valider avec un compte temoin (chaque droit, un refus), distribuer les secrets.
- Couper ProFTPD, basculer le port, suivre la piste d’audit.