PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Thuban : Comment je suis devenu un CHATONS ?

mercredi 31 mai 2017 à 12:30

Vous avez peut-être entendu parler des CHATONS, le Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires.
Alors que vos données et la plupart des sites webs consultés sont hébergés par les GAFAM (google, amazon, facebook, apple, microsoft), l'initiative CHATONS est à mon avis déterminante. On l'a vu lors de la vague de cyberattaques récente, ou si vous regardez la série M. Robot : les bombes ça fait mal, un reset numérique aussi. Êtes-vous tranquilles sur qui héberge vos données?
Tout ces éléments m'ont motivé pour devenir, à mon niveau, membre des CHATONS.

Cependant, cela demande un peu de temps, sinon de la disponibilité. Heureusement, quelques copains sont partants pour suivre cette aventure :)
Vous l'avez peut-être déjà lu, nous avons lancé notre service d'hébergement sur 3hg.fr.

Dans cet article, je souhaite expliquer comment j'ai mis en place un serveur qui sert de CHATONS pour peut-être inspirer d'autres initiatives de ce genre.

Les contraintes
Les services proposés de doivent pas nécessiter trop de bande passante ni d'espace de stockage car le serveur sera auto-hébergé. Si nécessaire, selon le succès de l'opération, du matériel plus performant sera investit.

Oui, le service sera auto-hébergé. Sinon, comment assurer aux "clients" que leurs données sont bien effacées s'ils en font la demande si elles sont enregistrées sur un serveur loué ?

L'espace de stockage limité est quelque chose que les autres CHATONS n'ont pas, ou en tout cas dans une moindre mesure. Cependant, il y a un service trop rarement proposé qui pourtant s'affranchi très bien des contraintes ci-dessus : le mail.

Ce sera donc le service principalement proposé : une messagerie.

La mise en place
Le serveur doit être efficace, sécurisé et le plus simple possible à administrer. Sans surprises, j'ai fait le choix d'utiliser OpenBSD. Voici les étapes que j'ai suivies :

Les inscriptions
Ce code PHP va proposer un formulaire où l'utilisateur demande un identifiant. Un captcha est fait maison (merci le code de blogotext :)) pour limiter les abus.
Une fois envoyé, ce formulaire envoie un mail aux administrateurs du site indiquant l'identifiant demandé et l'endroit où enregistrer le mot de passe pour le communiquer à l'utilisateur.

Une URL aléatoire est donnée à l'utilisateur pour récupérer ses identifiants lorsqu'ils seront prêt. Cela affiche en réalité le contenu du fichier rempli par l'administrateur lors de l'inscription et le supprime aussitôt.

Il est plus sûr de protéger avec la configuration du démon httpd le dossier contenant les identifiants.

Configuration /etc/httpd.conf :

location "/inscription/data*"   { block }

Formulaire d'inscription PHP
Si vous voulez l'utiliser, pensez à changer l'emplacement du formulaire d'inscription dans la variable "$GLOBALS['subscribe_dir']". Ce fichier est nommé "index.php" dans un dossier prévu pour l'inscription.


 'zéro',
'1' => 'un',
'2' => 'deux',
'3' => 'trois',
'4' => 'quatre',
'5' => 'cinq',
'6' => 'six',
'7' => 'sept',
'8' => 'huit',
'9' => 'neuf',
'10' => 'dix',
'11' => 'onze',
'12' => 'douze',
'13' => 'treize',
'14' => 'quatorze',
'15' => 'quinze',
'16' => 'seize',
);
?>



    
    
    
    
    3hg.fr | Vos mails pour des humains par des humain.
    
    <link rel="icon" href="./media/fe2a0650.favicon.png" data-original-source="https://yeuxdelibad.net/favicon.png" type="image/png">
    <link rel="stylesheet" href="/css/style.css">
    <link rel="stylesheet" href="/css/fontello/css/fontello.css">
    <link rel='stylesheet' href='//cdn.jsdelivr.net/font-hack/2.020/css/hack.min.css'>


    

    

Créer une adresse mail @3hg.fr'; echo '
'; echo '
'; echo '
    '; echo '
  • '; echo ''; echo ' @'.$GLOBALS['mail_domain']; echo 'Adresse mail souhaitée'; echo '
  • '; echo '
  • '; echo ''; echo captcha() ; echo ''; echo 'Êtes-vous humain ?'; echo '
  • '; echo ''; echo '
'; echo '
'; echo '
'; } /* Inscription demandée, on affiche la réponse */ if (!empty($_POST["subscribe"])) { if ( $_SESSION['captcha'] != $_POST['captcha'] ) { echo "Erreur de calcul ?"; } else { $user = ''; $admin_email = $GLOBALS['mail_admin']; // formulaire envoyé, on récupère tous les champs. if (!empty($_POST["user"])) { $user = trim($_POST["user"]); } if ($user != '') { $random_file = random_str(rand(10,75)); $random_page = $GLOBALS['subscribe_page'] . "?patate=" . $random_file; $headers = 'MIME-Version: 1.0' . "\\r\\n"; $headers .= 'From: ' . "\\r\\n" . 'Reply-To: Votre demande est bien envoyée, des humains vont s'en occuper.

"; echo "

Vous pourrez récupérer vos identifiants via: "; echo 'ce lien.'; } else { echo "

Une erreur est survenue lors de l'envoi du message

"; }; } } } else { if ( isset($_GET["patate"])) { $fichier = $_GET["patate"]; if ( ! ctype_alnum($fichier)){ echo "You are a bad guy!"; die(); } $path = './data/'.$fichier.'.txt'; if (file_exists($path)) { // On récupère le contenu et supprime le fichier $content = file_get_contents($path); unlink($path); echo "

Bienvenue sur 3hg.fr ☺.

"; echo "

Vos identifiants sont :

"; echo "
";

            echo $content;

            echo "
"; echo "

Ces informations sont déjà détruites, prenez-en note!

"; } else{ echo "

Il semble que votre compte ne soit pas encore prêt, ou bien le lien suivi est erroné ou périmé.

"; echo "

Dans le premier cas, réessayez plus tard, des humains traitent votre demande.

"; } } else { show_form(); } } ?>

Pour soutenir ce projet, n'hésitez pas à faire un petit don 😉

Les mots de passe
En l'état, c'est l'administrateur qui attribue le mot de passe pour l'utilisateur. Ça ne va pas.
On peut alors se tourner vers les solutions classiques d'outils PHP qui vont communiquer vers un dictionnaire ldap. Ça fonctionne sûrement très bien mais je n'ai pas trouvé de solution en laquelle j'avais vraiment confiance. Je choisis alors de me tourner vers une solution fiable d'un point de vue sécurité pour l'admin et l'utilisateur : SSH.

Lorsque l'utilisateur est créé, on le met dans un groupe particulier, par exemple "mailers".
On modifie la configuration de ssh pour que tous les utilisateurs de ce groupe n'aient accès qu'à une seule commande : "passwd", ceci afin de changer leur mot de passe :

/etc/ssh/sshd_config :

Match Group mailers
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand /usr/bin/passwd

Lorsque l'utilisateur tente de se connecter en SSH, il lui est alors proposé de modifier son mot de passe directement, sans la possibilité de faire autre chose.

$ ssh -p222 notreal@3hg.fr
notreal@3hg.fr's password:
Changing password for notreal.
Old password:
...
...

Quelques quotas
Je ne peux pas proposer un espace de stockage illimité pour les utilisateurs. Heureusement, OpenBSD a tout de prévu par défaut : je vais mettre des quotas pour les utilisateurs appartenant au groupe "mailers" :

# cat /etc/fstab : 
	782f1ddb783cdd13.b /mnt/bigstorage ffs rw,noexec,nodev,nosuid,softdep,noatime,groupquota 1 2
# edquota -g mailusers
	Quotas for group mailusers:
	/mnt/bigstorage: KBytes in use: 0, limits (soft = 750000, hard = 1000000)
			inodes in use: 0, limits (soft = 0, hard = 0)
quotaon -a

Simplifier la vie des admins
C'est bien connu, il faut prendre soin de ses admins :)
Ah, et en plus, je suis fainéant, donc dès qu'il y a plus de 3 commandes à taper, j'en fais un script :D .
Vous avez peut-être vu dans le code PHP un message qui indique aux admins les commandes à lancer pour ajouter un utilisateur. Il s'agit de deux scripts qui permettent de créer un utilisateur et le placer dans le bon groupe d'utilisateurs avec un dossier personnel situé sur un espace de stockage dédié. L'autre script permet d'enregistrer les identifiants de l'utilisateur pour qu'il puisse les consulter et que le serveur http puisse supprimer ces identifiants lorsqu'ils sont affichés (permissions).


#!/bin/sh

if [ "$(whoami)" != "root" ]; then
	echo "You have to be root"
	exit 1
fi
if [ $# -ne 2 ]; then
	echo "usage:"
	echo "addmailuser domain.net user"
	exit 1
fi

/usr/sbin/useradd -m -d /dossier/contenant/les/mails/"$1"/"$2" -s /bin/sh -G mailers "$2"
if [ $? -eq 0 ]; then
	echo "Entrez le mot de passe pour ce nouvel utilisateur"
	/usr/bin/passwd "$2"

	echo "$2@$1    $2" >> /etc/mail/virtuals
	rcctl restart smtpd
else
	echo "Pseudo déjà pris"
fi

exit 0
#!/bin/sh
if [ "$(whoami)" != "root" ]; then
	echo "You have to be root"
	exit 1
fi

if [ $# -ne 1 ]; then
	echo "usage:"
	echo "inscriremailuser fichier.txt"
	exit 1
fi

FPATH="/dossier/contenant/le/site/mail/inscription/data/$1"
echo "Création de $FPATH"

/usr/bin/touch $FPATH

/usr/local/bin/vim $FPATH

if [ $? -eq 0 ]; then
	echo "Merci, l'utilisateur peut maintenant consulter ses identifiants"
fi

/usr/sbin/chown www:daemon $FPATH

exit 0

Conclusion
Je crois avoir réussi à mettre en place un truc assez simple à utiliser sans tomber dans l'utilisation d'un tas d'éléments qui seraient difficiles à sécuriser. L'avenir nous dira si c'est aussi gérable que je l'imagine. Il y a déjà 27 utilisateurs inscrits et nous cherchons à améliorer la communication avec ces derniers (forum créé) qui ne lisent pas toutes les instructions. La récupération de compte est un élément à envisager aussi.
J'encourage quiconque à se lancer dans l'aventure d'un CHATONS. Si vous avez encore des doutes, vous savez où me trouver ;)

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.