Défaut de segmentation

Même en 2018, alors que les applications de messagerie instantanée modernes et riches en fonctionnalités telles que Gitter ou le très populaire Slack sont toujours aussi omniprésentes, l’IRC reste la méthode de communication préférée de nombreux développeurs. C’est simple, stable, omniprésent et, surtout, entièrement décentralisé. C’est cependant un ancien protocole, car IRC a commencé à fonctionner depuis le début des années quatre-vingt-dix (le protocole IRC RFC a été publié en 1993). En tant que tel, IRC vient avec ses limites.

L’un des plus notables pour moi est le manque d’archivage des messages. Tous les messages envoyés et reçus par un client IRC ne sont pas stockés dans votre machine, et vous n’obtenez pas de rediffusion des conversations passées sur un canal que vous venez de rejoindre. Chaque fois que vous vous connectez à une salle de chat IRC, vous recevez une table rase. Cela n’est pas pratique, étant donné que l’IRC est très souvent utilisé comme canal de communication hors bande. Vous rejoignez une chaîne, laissez une question, puis attendez quelques heures que quelqu’un réponde, car les gens n’ont pas tendance à surveiller IRC aussi fréquemment qu’avec d’autres applications de messagerie instantanée.

Heureusement et peut-être sans surprise, ce problème est résolu depuis un certain temps maintenant. La méthode la plus rapide et la plus simple consiste à établir une connexion permanente au serveur IRC à partir d’un serveur sous notre contrôle qui est ouvert 24h / 24 et 7j / 7 et à établir une session SSH / tmux avec celui-ci chaque fois que nous voulons revenir sur IRC. Lorsque nous avons terminé, détachez simplement la session avec C-a d sur l’écran GNU ou C-b d sur tmux. Cela résout le problème de manquer tous les messages envoyés dans un canal pendant notre absence, mais c’est à peu près tout ce que vous obtenez. Si vous cherchez une solution qui offre beaucoup plus que cela, il est temps de jeter un coup d’œil aux videurs.

Qu’est-ce qu’un serveur videur ?

Un serveur videur est un serveur que nous utilisons comme proxy pour accéder à IRC. Un videur prendra nos détails IRC et établira une connexion à un serveur IRC en notre nom et rejoindra même une liste de canaux prédéfinis.

Nous nous connectons ensuite à ce serveur videur à partir de notre client IRC au lieu du serveur IRC directement, et à partir de ce moment, nos messages seront « renvoyés » par le videur vers le serveur cible.

Les videurs offrent plusieurs avantages, notamment:

  • Sessions persistantes du serveur et du canal
  • Enregistrement des conversations du canal dans un fichier texte pour l’archivage
  • Authentification de l’utilisateur Bouncer
  • Authentification automatique du serveur IRC via NickServ ou SASL
  • Automatiser les statuts de l’utilisateur IRC (laisser & messages éloignés, etc.)
  • Et bien plus encore!

Configuration du serveur de vidage sur AWS

Nous allons configurer notre propre serveur de vidage à l’aide de ZNC, l’application de serveur de vidage la plus populaire, sur une instance AWS EC2 peu coûteuse.

Lancer une nouvelle instance Ubuntu Server 16.04 t2.nano EC2 avec tous les paramètres par défaut à l’exception des suivants:

  • Données utilisateur: installez le logiciel de vidage (ZNC), créez un utilisateur pour le processus et un répertoire pour qu’il stocke ses fichiers et un fichier d’unité systemd pour le lancer au démarrage.
#!/bin/bashapt-get update && apt-get dist-upgrade -y && \apt-get install -y znc znc-dev znc-perl znc-python znc-tcl && \useradd -M -s /bin/false znc && usermod -L znc && \mkdir /opt/znc && \cat > /etc/systemd/system/znc.service <<- EOFDescription=ZNC IRC BouncerExecStart=/usr/bin/znc -d /opt/zncExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=alwaysType=forkingUser=zncWantedBy=multi-user.targetAlias=znc.serviceEOF

Comme le fichier d’unité systemd a été placé directement dans /etc/systemd/system, il sera automatiquement exécuté au démarrage. Il n’est pas nécessaire de l’activer.

  • Sous-réseau: assurez-vous que l’instance est lancée dans un sous-réseau public avec une passerelle Internet connectée, afin qu’elle soit facilement accessible depuis Internet.
  • Volume EBS: votre mot de passe ZNC (Videur), votre mot de passe du serveur IRC et vos journaux de conversation IRC seront stockés dans des fichiers en texte brut, je vous recommande donc fortement de crypter le volume.
  • Créez un nouveau groupe de sécurité à y attacher afin que les ports suivants soient ouverts :
    • SSH : afin que nous puissions configurer l’instance
    • Port TCP 7078 (tout port non réservé fera l’affaire, en fait): Port d’écoute ZNC
  • Définissez sa balise « Name » sur quelque chose de significatif, si vous le souhaitez

Générez maintenant une nouvelle adresse IP Elastic et associez-la à l’instance.

Installation de ZNC

SSH dans votre instance EC2 nouvellement créée et exécutez le processus de configuration de ZNC pour la première fois, qui nous demandera de définir un port d’écoute pour le videur et de créer un compte administrateur. Sélectionnez les options ci-dessous.

$ znc --makeconf Checking for list of available modules... -- Global settings -- Listen on port (1025 to 65534): 7078 Listen using SSL (yes/no) : yes Verifying the listener... Unable to locate pem file: , creating it Writing Pem file ... Enabled global modules -- Admin user settings -- Username (alphanumeric): admin Enter password: Confirm password: Nick : Alternate nick : Ident : Real name (optional): Bind host (optional): Enabled user modules Set up a network? (yes/no) : no Writing config ... To connect to this ZNC you need to connect to it as your IRC server using the port that you supplied. You have to supply your login info as the IRC server password like this: user/network:pass. Try something like this in your IRC client... /server <znc_server_ip> +7078 admin:<pass> To manage settings, users and networks, point your web browser to https://<znc_server_ip>:7078/ Launch ZNC now? (yes/no) : no

Cela générera un fichier de configuration qui sera stocké dans le répertoire personnel de l’utilisateur dans lequel nous nous connecterons (ubuntu si vous utilisez l’AMI de serveur Ubuntu fournie par Amazon par défaut). Déplaçons les fichiers de configuration nouvellement créés de ce répertoire vers /opt/znc et donnons les droits de propriétaire de l’utilisateur znc.

$ sudo mv ~/.znc/* /opt/znc$ rmdir ~/.znc$ sudo chown -R znc:znc /opt/znc

Vous pouvez maintenant démarrer ZNC

$ sudo systemctl start znc

Assurez-vous que ZNC a démarré avec succès

$ systemctl status znc● znc.service - ZNC IRC Bouncer Loaded: loaded (/etc/systemd/system/znc.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-07-29 13:02:07 UTC; 21min ago Process: 1181 ExecStart=/usr/bin/znc -d /opt/znc (code=exited, status=0/SUCCESS) Main PID: 1245 (znc) Tasks: 1 Memory: 10.8M CPU: 54ms CGroup: /system.slice/znc.service └─1245 /usr/bin/znc -d /opt/znc

Configuration de ZNC

La première étape de configuration est terminée. Nous devons maintenant ajouter l’utilisateur auquel nous allons nous connecter et un réseau IRC à associer à cet utilisateur.

Pour appliquer les paramètres restants au videur, nous allons nous connecter à son frontend de configuration web, disponible sur le port sur lequel nous l’avons configuré pour écouter (dans mon cas, le port 7078). Donc, dans votre navigateur, entrez l’URL suivante: https://<bouncer_ip_address>:7078. Si vous obtenez une erreur « certificat HTTPS manquant » ou similaire, vous pouvez l’ignorer en toute sécurité et demander à votre navigateur de continuer. Connectez-vous maintenant en tant qu’utilisateur administrateur que vous avez créé auparavant, en utilisant le mot de passe que vous avez entré.

 ZNC web frontend

Une fois connecté, vous pouvez cliquer sur l’entrée de menu « Paramètres globaux » sur le côté droit pour voir la configuration globale du videur.

ZNC installe une collection de modules (objets partagés) dans /usr/lib/znc que vous pouvez charger ou décharger pendant l’exécution du démon. Si vous faites défiler vers le bas, vous verrez une liste des modules globaux qui affectent le fonctionnement du videur, que vous pouvez activer / désactiver en cochant les cases dans la colonne « Nom ». Dans mon cas, j’ai activé « journal » car je veux que mon videur stocke dans un fichier texte tous les messages envoyés dans les chaînes dont je suis membre.

 Modules globaux ZNC

Cliquez sur « Gérer les utilisateurs » dans le menu de droite pour afficher le panneau de configuration utilisateur. Maintenant, cliquez sur « Ajouter » pour ajouter un nouvel utilisateur et remplissez les détails: nom d’utilisateur, mot de passe (notez que ce mot de passe ne sera utilisé que pour vous authentifier avec ZNC, il ne sera pas utilisé avec le serveur IRC), détails IRC et une liste de modules que vous voudrez peut-être charger spécifiquement pour cet utilisateur.

 ZNC Détails de l'utilisateur

Cliquez ensuite sur « Enregistrer et continuer » en bas afin que nous puissions ajouter un réseau IRC pour cet utilisateur.

 Ajout d'un réseau à un utilisateur

Remplissez les détails du réseau IRC auquel cet utilisateur sera associé et activez éventuellement tous les modules que vous souhaitez charger automatiquement lors de la connexion à ce réseau. Un tel module pourrait être sasl si vous souhaitez vous authentifier en utilisant cette méthode avec le serveur IRC. Je vais activer ce module sur ce réseau.

Dans la zone de texte « Serveurs de ce réseau IRC », vous entrez les informations du serveur IRC auquel vous souhaitez vous connecter au format

<server> <port> <irc_password>

Ajoutez un signe plus au port pour indiquer une connexion SSL. <irc_password> est le mot de passe que vous avez utilisé pour vous enregistrer sur le serveur IRC via la commande /NickServ, qui est complètement séparé du mot de passe que vous avez défini pour vous authentifier auprès du videur lui-même ci-dessus.

Par exemple, pour se connecter au réseau IRC Freenode via SSL avec un compte précédemment enregistré, le contenu de cette zone de texte serait

irc.freenode.net +6697 myNickServPassword123

Sinon, cela pourrait simplement être

irc.freenode.net 6667

 Configuration du réseau IRC

Vous remarquerez que votre mot de passe IRC est stocké en texte brut sur le serveur. C’est pourquoi j’ai recommandé lors des étapes de configuration du VPS de crypter votre volume EBS et, naturellement, de contrôler très étroitement qui peut accéder à votre serveur de vidage. Il est recommandé de verrouiller le groupe de sécurité VPS pour autoriser uniquement les connexions entrantes à partir d’un très petit sous-ensemble d’adresses IP.

Cliquez à nouveau sur « Enregistrer et continuer ». Vous pouvez maintenant éventuellement ajouter une liste de chaînes auxquelles vous souhaitez que le videur vous connecte, mais il se souviendra également de celles que vous vous joignez lorsque vous vous y connectez.

Nous avons maintenant un serveur AWS VPS (Virtual Private Server) hébergeant une installation entièrement fonctionnelle de ZNC. La dernière chose à faire est de pointer notre client IRC vers le videur.

Connexion au videur

Je vais utiliser irssi pour me connecter au videur. Voici les étapes que j’ai suivies pour que cela fonctionne. Votre kilométrage peut varier sur un client différent comme HexChat ou mIRC, mais les détails eux-mêmes doivent rester la plupart du temps les mêmes.

Lancer irssi en spécifiant le surnom à utiliser pour se connecter au videur

$ irssi -n <username>

Créez un nouveau réseau appelé freenodebnc et ajoutez-y les détails du videur. Puisque je me connecte au serveur IRC Freenode via SSL, j’utilise le port qu’il expose pour les connexions sécurisées, 6697 et en passant l’indicateur -ssl. username/freenode est la combinaison nom d’utilisateur et réseau que nous avons créée dans le panneau de configuration utilisateur ZNC. password est le mot de passe que nous utilisons pour nous authentifier auprès de ZNC, pas auprès du serveur IRC.

/network add freenodebnc/server add -net freenodebnc -auto -ssl <bouncer_ip> 6697 username/freenode:password

Exécutez les commandes suivantes pour enregistrer ces modifications dans le fichier de configuration irssi et connectez-vous au videur.

/save/connect freenodebnc

Si vous avez chargé le module SASL (vous pouvez vérifier s’il est chargé en exécutant /msg *status ListModules), vous devez le configurer à ce stade. Ainsi, une fois connecté au videur, exécutez les commandes suivantes sur votre client IRC.

/query *saslmechanism external plainset <NickServName> <password>

NickServName est votre nom d’utilisateur enregistré auprès du serveur IRC et password le mot de passe que vous utilisez pour vous authentifier auprès du serveur susmentionné.

Reconnectez-vous maintenant au réseau IRC avec le module SASL reconfiguré.

/msg *status jump

Cela peut prendre quelques instants pour que le videur établisse la connexion (surtout si vous vous connectez via SSL et utilisez des mécanismes d’authentification tels que SASL), mais après cela, vous obtiendrez une session permanente et sécurisée avec le serveur IRC que vous êtes libre de suspendre et de reprendre quand vous le souhaitez. Bonne discussion!