InfraGuard

Connexion et authentification

Comment fonctionne la connexion par session à la console, comment la session se resynchronise à chaque requête et comment l’API d’ingestion externe s’authentifie.

Vue d’ensemble — à quoi cela sert

InfraGuard possède deux plans d’authentification :

  1. Console web = connexion par session. Un exploitant se connecte avec login_id + password et AuthController crée une session maison. Chaque page de la console traverse ensuite le middleware infr.auth (InfrAuth), qui vérifie la session et relit dans la base de données le niveau, le nom et la langue de l’utilisateur à chaque requête afin de garder la copie stockée en session à jour.
  2. API d’ingestion externe = clé d’API sans état (bearer). Lorsqu’une application externe publie des incidents, des comptes rendus de sauvegarde ou des analyses de sécurité, elle s’authentifie avec un jeton de clé d’API (Authorization: Bearer … ou X-Infr-Api-Key) via le middleware infr.apikey, et non par une session. Pas de session, pas de CSRF.

Caractéristiques principales :

Quand l’utiliser

Disposition

L’écran de connexion (/login) est une simple carte unique.

Élément Description
Marque · signature Logo Infra**Guard** + « Console d’exploitation, de défense et de résilience de l’infrastructure convergée »
Identifiant Champ login_id. autocomplete=username, focus automatique
Mot de passe Champ password + icône en forme d’œil pour afficher/masquer
Bandeau d’erreur En cas d’échec : « Ces identifiants ne correspondent pas à nos enregistrements. »
Champ caché next Chemin de retour après connexion (doit commencer par /)
Bouton d’envoi « Se connecter → »

Le formulaire de connexion porte un jeton @csrf Blade standard. La console est protégée par session + CSRF et ne demande aucun jeton bearer distinct dans l’interface.

Comment l’utiliser

Se connecter

  1. Rendez-vous sur /login (si vous êtes déjà connecté, vous êtes redirigé vers /).
  2. Saisissez votre Login ID et votre Password.
    • Validation : login_id 60 caractères au maximum, password de 4 à 120 caractères.
  3. Cliquez sur Se connecter. Le serveur recherche le compte dans infr_user par login_id + is_close=0 et vérifie le mot de passe.
  4. En cas de succès, la session est régénérée (session()->regenerate()) et vous êtes envoyé vers next (ou /).

Une connexion réussie renseigne ces clés de session :

Clé de session Valeur
infr_user_id infr_user.id (la référence pour « est authentifié »)
infr_login_id Identifiant de connexion
infr_user_level user_level (entier) — Niveau RBAC
infr_name Nom affiché
infr_lang Langue d'affichage (ko par défaut)

La colonne last_log est également horodatée à l'heure actuelle.

Se déconnecter

Durée de vie de la session et resynchronisation à chaque requête

Chaque page de la console traverse infr.auth (InfrAuth), qui, à chaque requête :

  1. Recharge l’utilisateur à partir du infr_user_id de la session (chemin critique, colonnes minimales : id · login_id · name · email · user_level · role_id · team_id · lang · avatar · is_close).
  2. Si le compte est absent ou en is_close=1 (désactivé), détruit la session et redirige vers /login (ou renvoie un 401 JSON).
  3. Écrase infr_user_level · infr_name · infr_lang avec les valeurs de la base, si bien qu’un changement de niveau, de nom ou de langue par un administrateur se reflète dès la requête suivante sans reconnexion.
  4. Range le modèle utilisateur dans l’attribut de requête infr_user et fixe la langue d’affichage via app()->setLocale().
  5. Appelle OpsPolicy::markPresence() pour enregistrer la présence (le mode économie de la politique d’exploitation s’en sert pour décider qu’« un utilisateur de la console est actif en ce moment » et conditionner la collecte de la base — voir Politique d’exploitation).

La durée de vie de la session suit SESSION_LIFETIME (120 minutes par défaut).

La connexion à la console ne comporte pas de case « se souvenir de moi » distincte. La session dure le temps indiqué ci-dessus ; une fois expirée, vous devez vous reconnecter.

Authentification de l’API d’ingestion externe (clé bearer)

Lorsqu’une application externe publie sur /api/v1/*, elle s’authentifie avec une clé d’API (sans état — ni session, ni CSRF).

Méthode Exemple d’en-tête
Bearer Authorization: Bearer YOUR_KEY
En-tête dédié X-Infr-Api-Key: YOUR_KEY

Comportement :

Principaux points de terminaison :

# Vérification de la connectivité / de la clé
curl -sS https://infraguard.example.com/api/v1/ping \
  -H "Authorization: Bearer YOUR_KEY"

# Enregistrer automatiquement un incident (dédoublonné · source=pulse)
curl -sS -X POST https://infraguard.example.com/api/v1/incidents \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"NPE in checkout","fingerprint":"abc123","severity":"crit"}'

Émettez, révoquez les clés et copiez le code d’intégration dans Administration ▸ Clés API (la clé en clair n’est affichée qu’une seule fois, à l’émission).

Step-up — protéger les actions destructrices

Les actions à risque telles que bloquer, débloquer, restaurer ou modifier des paramètres sont protégées — non pas par une nouvelle saisie du mot de passe — mais par trois défenses :

  1. Nouvelle vérification du niveau — les actions d’écriture exigent au moins le niveau d’écriture (2 ou plus) et les actions d’administration exigent le niveau administrateur (10), revérifiés côté serveur.
  2. Journal d’audit — les valeurs avant/après, ainsi que l’auteur et l’adresse IP, sont écrites dans le journal d’audit (infr_audit_log).
  3. Confirmation dans l’interface — une boîte de dialogue de confirmation (step-up) garde l’action à l’écran.

Sources de données

Objet Rôle
infr_user Comptes d’exploitant. Colonnes : login_id · password · user_level · name · email · lang · is_close · role_id · team_id · last_log · avatar
Magasin de sessions (Redis) Clés de session telles que infr_user_id (REDIS_PREFIX infr_)
infr_api_key Le hachage (key_hash) des clés de l’API d’ingestion · is_active · use_count · last_used_at/ip
infr_audit_log Piste d’audit des actions destructrices ou sensibles

La colonne infr_user.password n’est jamais exposée dans les journaux, les URL ni les cookies. La clé d’API en clair n’est montrée qu’à l’émission ; la base ne conserve que le hachage.

Accès

Barrières au niveau des URL (évaluées après la connexion) :

Domaine Middleware Niveau minimal
Console générale (Vue d’ensemble · Infrastructure · lecture des Actifs) infr.auth Connexion seule (1)
/security · /backup infr.level:2 2
/admin infr.level:10 10
/horizon · /pulse infr.admin 10
Section Développement infr.dev 9

Paliers de niveau : demo=1 · staff=5 · admin=10. Voir Niveaux d’accès pour la politique complète.

Dépannage et FAQ

Je me connecte mais je suis sans cesse renvoyé vers /login. Le cookie de session n’est pas conservé (domaine ou SESSION_DOMAIN incohérent, ou cookie réservé à HTTPS servi en HTTP), ou le compte a été mis à is_close=1 (désactivé). Demandez à un administrateur de vérifier l’état du compte.

Je vois « Ces identifiants ne correspondent pas à nos enregistrements. » Une faute de frappe dans login_id, un mauvais mot de passe ou un compte désactivé (is_close=1). Par sécurité, le message ne précise pas lequel.

Un compte n’arrive pas à se connecter. Le mot de passe est peut-être incorrect ou le compte désactivé. Un administrateur réinitialise le mot de passe dans Utilisateurs et équipes.

Je peux me connecter mais pas ouvrir /admin. Votre niveau est inférieur à 10. /admin est gardé par infr.level:10 ; seuls les administrateurs y accèdent. De même, /security et /backup exigent le niveau 2 ou plus.

Un appel AJAX renvoie 401. La session de la console a expiré. Rechargez la page et reconnectez-vous. Les requêtes JSON reçoivent {"error":"unauthenticated"} en 401 au lieu d’une redirection.

Un administrateur a relevé mon niveau mais cela ne s’est pas appliqué. InfrAuth resynchronise la session à chaque requête : cela s’applique donc dès la navigation suivante, sans reconnexion. Rechargez pour l’appliquer tout de suite.

Le menu ou l’interface est dans une langue inattendue. La langue d’affichage suit infr_user.lang (clé de session infr_lang) et se resynchronise à chaque requête. Changez-la dans Localisation.

L’API renvoie 401 invalid_api_key / 429 rate_limited. Une clé inactive ou mal saisie donne un 401 ; plus de 120 requêtes par minute donnent un 429 (+ Retry-After). Vérifiez l’état de la clé dans Clés API et ralentissez le rythme.

Voir aussi

로그인 화면
로그인 화면