Authentification
Deux sources, trois portes
| Porte | Credential | Source |
|---|---|---|
| SFTP | mot de passe | compte local, ou jeton JWT sous le nom sentinel |
| SFTP | cle publique | compte local |
| API de fichiers | Authorization: Basic | compte local, mot de passe |
| API de fichiers | Authorization: Bearer | jeton JWT |
| Console et API d’administration | Authorization: Bearer | jeton de session (compte local, mot de passe), jeton JWT, ou jeton statique (voir Console et API) |
Une connexion est authentifiee par une seule source, dont viennent ses
roles. Un compte local alice et le sub alice d’un jeton sont deux
utilisateurs distincts.
Choisir les methodes
[auth.methods]
jwt = { enabled = false }
local = { enabled = true, password = true, pubkey = true }
Un deploiement en cles seules coupe le mot de passe :
local = { enabled = true, password = false, pubkey = true }
Les cles : [auth.methods].
Les comptes locaux
[[users]]
username = "alice"
password_hash = "$argon2id$v=19$m=19456,t=2,p=1$..." # craft-file-gate hash-password
authorized_keys = ["ssh-ed25519 AAAA... alice@poste"]
authorities = ["utilisateurs"] # ses roles
Les cles : [[users]]. Dans users_file,
ils se modifient sans redemarrer.
Les hashes
echo -n "mot-de-passe" | craft-file-gate hash-password # le hash seul
echo -n "mot-de-passe" | craft-file-gate hash-password --user alice # un bloc [[users]]
Le mot de passe se lit sur stdin, jamais en argument. Le hash sort sur stdout, ses parametres sur stderr. L’onglet Hash tools de la console fait de meme dans le navigateur, sans envoyer le mot de passe.
Profil (--profile) | Parametres argon2id | Memoire par verification |
|---|---|---|
owasp-min (defaut) | m=19456,t=2,p=1 | 19 Mio |
rfc9106-low-mem | m=65536,t=3,p=4 | 64 Mio |
Une verification coute ce que dit le hash stocke : le serveur ne re-hache jamais. Gardez un seul profil par fichier : un nom inconnu coute alors exactement le temps d’un mauvais mot de passe, et ne se devine pas au temps de reponse.
Les formats argon2 ($argon2id$, $argon2i$, $argon2d$) sont acceptes.
Pour migrer d’un autre serveur sans connaitre les mots de passe,
allow_sha512_crypt = true ou allow_bcrypt = true sous [auth.methods] local
accepte aussi ces formats : Reference [auth.methods].
A chaque chargement du fichier, la ligne password hashes in use compte les
comptes par format, et la metrique craftfilegate_local_users{hash_format}
aussi : quand un format tombe a zero, retirez son drapeau.
local.max_argon2_memory_kib (19456 : le m du profil owasp-min) nomme
au chargement tout compte dont le hash demande plus, qui se connecte
toujours : le re-hacher au profil par defaut le ramene sous le budget.
La verification se fait sur un pool de fils borne, hors du runtime : voir Verification des mots de passe.
La cle publique
Le client propose une cle, puis signe si elle est dans ses
authorized_keys. Les cles proposees ne comptent pas : un agent SSH qui en
essaie cinq avant la bonne ne se fait pas bannir ; une connexion qui finit
sans s’authentifier, apres une cle declinee, compte un echec.
Les algorithmes de signature d’une cle
[sftp.algorithms] user_key dit les algorithmes permis a tous (voir
Porte SFTP) ; ssh-rsa (SHA-1) n’y est pas par
defaut. Un role peut en permettre d’autres a ses utilisateurs :
[[roles]]
name = "partenaire-ancien"
user_key_algorithms = ["ssh-rsa"] # en plus de user_key
[[roles.mounts]]
backend = "disque"
home_dir = "/partenaire"
L’exception vaut pour tout utilisateur qui porte ce role, jamais pour un utilisateur seul. Seuls les roles des fichiers du serveur la donnent, pas ceux qu’atteint le service d’autorisation.
JWT
La methode jwt est active par defaut.
[auth.jwt]
secret = "remplacez-moi" # ou CRAFT_FILE_GATE_JWT_SECRET_FILE
algorithm = "HS256"
username_path = "/sub" # le nom de l'utilisateur
authorities_path = "/groups" # ses roles
| Porte | Ou mettre le jeton |
|---|---|
| SFTP | nom de login jwt (auth.jwt_sentinel_username), le jeton en mot de passe |
| API de fichiers, API d’administration | Authorization: Bearer <jeton> |
Une source de cle, au choix : secret (HS256, HS384, HS512),
public_key_file (la cle publique PEM de l’emetteur : RS256, RS384,
RS512, ES256, ES384) ou jwks_url (le jeu de cles d’un fournisseur
d’identite, chaque cle disant son algorithme). Les cles :
[auth.jwt].
Un jeton est accepte si sa signature verifie, si exp est present et a
venir, et si nbf, quand il est la, est passe (60 s de tolerance pour les
deux). Avec issuer ou audience, la claim iss ou aud doit etre
presente et egale. Le nom de l’utilisateur est lu a username_path, ses
roles a authorities_path (un tableau de chaines).
Brancher un fournisseur d’identite (jwks_url)
[auth.jwt]
jwks_url = "https://idp.example.com/.well-known/jwks.json"
algorithm = "RS256"
jwks_refresh_interval_secs = 3600
issuer = "https://idp.example.com/"
| Moment | Ce que fait le serveur |
|---|---|
| demarrage | valide le fichier, ouvre le journal, puis charge le jeu de cles, avant d’ouvrir les portes |
| chaque requete | verifie le jeton contre la cle que son en-tete kid designe |
toutes les jwks_refresh_interval_secs | recharge le jeu ; une cle ajoutee par le fournisseur est apprise a ce moment |
| rafraichissement sans reponse | garde les cles en cache, qui continuent de verifier les jetons |
L’age du cache est la jauge craftfilegate_jwks_cache_age_seconds : alertez
dessus (voir Metriques).
Ce que vous verrez
| Quand | Ligne |
|---|---|
| chaque chargement des comptes | INFO password hashes in use, un champ par format |
| jeu JWKS charge | INFO JWKS cache refreshed, champ keys ; puis JWKS background refresh started |
| connexion acceptee | audit connection_accepted, auth_method = password, pubkey, jwt, basic ou bearer ; par cle, signature_algorithm |