Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 ProFTPDDevient
mot de passepassword_hash
uid, gidrien : tout est ecrit par le compte du service, sans setuid
homehome_dir du montage, {username} pour %u
shell, gecosrien : 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

ProFTPDCraftFileGate
AuthUserFileauth.methods.local.users_file
AuthGroupFileauthorities et [[roles]]
DefaultRoot ~home_dir = "/{username}"
CreateHome oncreate_home = true (backend local)
<Directory> et <Limit>[[roles.mounts.acl]], voir plus bas
MaxLoginAttempts[sftp.ban] max_failures : bannit l’adresse
MaxClientsPerUserserver.max_sessions_per_user
MaxClientsrien ; [sftp.rate_limit] borne le debit de connexions
HiddenStores on[server.hidden_stores] enabled = true ; desactive par defaut, comme ProFTPD
mod_quotatabmax_file_mb du montage : un plafond par fichier, pas un volume cumule
TransferLog, ExtendedLogla piste d’audit, voir Audit
TLSEngine (FTPS), PassivePorts, MasqueradeAddressrien : SFTP sur un seul port TCP
SFTPHostKeysftp.host_keys
SFTPAuthorizedUserKeysauthorized_keys de l’utilisateur
mod_sql, mod_ldap[auth.jwt] ou auth.authz_base_url
Umaskl’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 FTPDroit
RETR, READread
STOR, APPE, MKD, WRITEwrite
LIST, NLST, CWD, DIRSlist
DELE, RMDdelete
RNFR, RNTOrename

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

SujetCraftFileGate
reprise d’upload (AllowStoreRestart)servie, sauf avec hidden_stores et sur S3
propriete des fichiersle compte du service ; une autre chaine passe par les droits du repertoire (setgid, ACL POSIX)
FTP et FTPSnon servis : chaque client passe a SFTP ou a l’API REST
  1. Inventorier les clients ; extraire de ftpd.passwd noms, hashes et homes.
  2. Ecrire roles.toml et users.toml ; lancer sur un autre port.
  3. Valider avec un compte temoin (chaque droit, un refus), distribuer les secrets.
  4. Couper ProFTPD, basculer le port, suivre la piste d’audit.