Mon mot de passe, c'est secret
J'ai récemment mis en place un site d'infos pour les pompiers. Un truc tout simple genre la tribune de LinuxFr .
Comme l'accès est restreint, il faut attribuer des identifiants (login/password) à chaque utilisateur. Voici mes contraintes;
- je ne connais pas le mail de tout le monde,
- je ne veux pas valider chaque demande de création de compte car je sais à priori qui sont les utilisateurs (ils sont déjà créés)
... comment faire pour donner à chacun son mot de passe ?
Première solution Choisir le même mot de passe pour tout le monde et l'afficher en grand sur la page d'acceuil du site ! Cette approche ne se distingue plus beaucoup d'un site public ;-)
Pour la petite histoire, un organisation (je reste volontairement vague) possèdant un intranet a choisi comme mot de passe, chut, secret car c'est secret ;-) Son intranet permet à chaque employé de; remplir ses feuilles de présences, obtenir sa fiche de paie, ... et changer son mot de passe s'il le désire (ce que ne font qu'une infime partie des employés).
J'espère ne pas être le seul à trouver cette approche cavalière même si je suis conscient qu'énormément de gens ne s'en inquiètent pas. Bref, je ne veux pas que le mot de passe initial soit le même pour tout le monde. Next !
Deuxième solution J'affiche les logins de chacun (genre prénomNom) et lors de la première connection, je demande de cliquer sur "J'ai oublié mon mot de passe", ensuite de fournir un email et j'envoie le mot de passe.
Pour moi c'est le plus simple. Il me suffit de loguer les envois de mot de passe et ça roule. Sauf que je n'évite pas le vol d'un compte [1]. Next !
Solution retenue La solution que je retiens et qui est sans doute un peu plus complexe me permet d'éviter (je crois) ce vol de compte.
Je demande à chaque utilisateur de m'envoyer un mail avec son login et je lui retourne son mot de passe.
La différence avec la solution deux c'est que je reçois un mail de l'utilisateur et je peux (un peu) contrôler ce mail [2]. Je suis bien conscient que je ne résoud pas le problème de vol d'un compte car il est toujours possible de me leurer lors de la demande de compte ... mais cela devient un peu plus difficile.
On peut, par exemple, créer une adresse mail de la forme prenomNom@example.org
chez n'importe qui (Gmail ou autre) et je croirai que c'est effectivement l'adresse du gars. Mais dans ce cas, je lui enverrai parfois des mails qui resteront sans réponse et dans le cadre qui nous occupe, ce sera détecté un jour.
On peut aussi modifier ses entêtes de mails et bidouiller à ce niveau mais ça se voit donc ... je ne m'en inquiète pas trop.
Un peu de technique maintenant (Marie-No, passe ton chemin)
Je n'ai évidement pas envie de répondre à la main à chacun, il faut que ce soit automatique. J'écris dont une petite règle procmail qui prendra en charge le mail et générera la réponse adéquate. La règle procmail se résume à ça;
:0 c: * ^Subject:.*\[WAZUP\].* | /home/pit/.procmail/sendmailscript
... et je demande aux utilisateurs de m'envoyer un mail ayant comme sujet [WAZUP] login.
Pour ceux qui sont intéressé, voici le script;
#!/usr/bin/perl use strict; use warnings; my $line; my $login; my $from; my @passwords; my $data_file = "/home/pit/.procmail/listing-login-password.txt"; my $log_file = "/home/pit/.procmail/log-mail"; # Je cherche les champs From et Subject dans le mail # et je récupère le login et le mail. while ( <> ) { my @junk; $line = $_; if ( $line =~ /^From:.*/ ) { @junk = split(/:/,$line); $from = $junk[1]; chomp($from); } if ( $line =~ /^Subject:.*/ ) { @junk = split(/]/,$line); $login = $junk[1]; $login =~ s/ //g; chomp($login); } } if ( !defined($login) ) { die "Can't find login"; } # Je récupère (peut-être) le password correspondant au login open(DAT, $data_file) or die "Can't open file $data_file: $! "; my @raw_data = <DAT>; @passwords = grep { /.*($login).*/i } @raw_data; my $password = $passwords[0]; # J'ouvre le fichier de log pour plus tard open(LOG,">>$log_file") || die("Cannot Open File"); # Je teste le résultat if ( !defined($password) ) { # NOT FOUND # Il reste à envoyer un mail d'ERREUR au gars ... open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq") or die "Can't fork for sendmail: $! "; print SENDMAIL <<"EOF"; // Un p'tit mail d'erreur EOF close(SENDMAIL) or warn "sendmail didn't close nicely"; print LOG localtime() . " - ERREUR - $from - $login "; } else { # FOUND # Il reste à envoyer un mail au gars ... open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq") or die "Can't fork for sendmail: $! "; print SENDMAIL <<"EOF"; // Un p'tit mail avec le password EOF close(SENDMAIL) or warn "sendmail didn't close nicely"; chomp($password); print LOG localtime() . " - $from - $password "; } close DAT; close LOG;
J'ai deux soucis.
Le premier problème qui se pose et auquel je m'attendais c'est que je demande aux utilisateurs de m'envoyer un mail avec comme sujet quelque chose qui matche "[WAZUP] login" et je reçois
- (wazup) login
- (WA ZUPP)
- Bonjour
- [wazup] login1 login2
- ...
No comment, je m'y attend et j'envoie "à la main" si j'ai le temps. Je me demande quand même si la contrainte est trop grande ou bien la méthode mauvaise mais pour rappel, Google groups et moult autres mailing list font pareils. Il suffit de lire cette FAQ Google ou celle-ci .
Le second problème est inattendu et m'incombe. Les accents dans les logins sont transformés.
Lorsque le login contient des accents, par exemple Cédric
, procmail reçoit =?iso-8859-1?Q?C=E9ric?=
et mon script aussi et donc ça bugge. L'utilisateur reçoit un mail d'erreur ce qui est dommage.
Si quelqu'un a une idée, je suis preneur.
Voilà voilà, tout ça pour dire que mon mot de passe c'est; secret, mais chut, ne le dites pas.
Notes
[1] Si tu connais un login, tu fournis un email genre mailinator et tu obtiens un mot de passe. Si tu choisis le login du vieux pellot qui ne viendra sans doute jamais sur le site, c'est bon !
[2] Mailinator par exemple ne permet pas l'envoi de mail juste la réception
Commentaires
Ça aurait été plus simple de leur donner un mot de passe genre NomPrenom et à la première connexion ils arrivent sur la page de changement de mot de passe ...
@chronos_dino Oui mais dans ce cas, le vol de compte est quand même très très (trop) simple ...
Il doit bien avoir une bibliothèque Perl qui décode les entêtes MIME... car un logiciel e-mail un peu spécial (ou même en cas de nom longuissime) pourrait distribuer le sujet sur deux+ lignes (avec accent longuissime n'est plus bien long le tout étant coupé en blocs de ~70 caractères après codage)
@Bruno, j'ai pas tout bien compris ton commentaire ...