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

Authentification

Deux sources, trois portes

PorteCredentialSource
SFTPmot de passecompte local, ou jeton JWT sous le nom sentinel
SFTPcle publiquecompte local
API de fichiersAuthorization: Basiccompte local, mot de passe
API de fichiersAuthorization: Bearerjeton JWT
Console et API d’administrationAuthorization: Bearerjeton 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 argon2idMemoire par verification
owasp-min (defaut)m=19456,t=2,p=119 Mio
rfc9106-low-memm=65536,t=3,p=464 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
PorteOu mettre le jeton
SFTPnom de login jwt (auth.jwt_sentinel_username), le jeton en mot de passe
API de fichiers, API d’administrationAuthorization: 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/"
MomentCe que fait le serveur
demarragevalide le fichier, ouvre le journal, puis charge le jeu de cles, avant d’ouvrir les portes
chaque requeteverifie le jeton contre la cle que son en-tete kid designe
toutes les jwks_refresh_interval_secsrecharge le jeu ; une cle ajoutee par le fournisseur est apprise a ce moment
rafraichissement sans reponsegarde 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

QuandLigne
chaque chargement des comptesINFO password hashes in use, un champ par format
jeu JWKS chargeINFO JWKS cache refreshed, champ keys ; puis JWKS background refresh started
connexion accepteeaudit connection_accepted, auth_method = password, pubkey, jwt, basic ou bearer ; par cle, signature_algorithm