IRC ? Serveur ? T'chat
le poulpe profite d'un temps mort entre deux alertes de sa production.Alors IRC - Internet Relay Chat. Quand vous allez sur des sites avec des t'chats en direct type chat voila.fr ou free.fr. En général, vous disposez d'une interface pour parler aux autres utilisateurs via une petite interface (type applet, widget, en général en ajax ou sur un client java).
Il existe un autre moyen d'accéder à ce t'chat, qui est bien souvent un simple serveur IRC : en se connectant avec un client IRC. En général vous en avez un sur votre logiciel de messagerie direct (j'utilise Pidgin). Ou vous pouvez télécharger des add-on firefox comme chatzilla, ou encore de vrais logiciels clients dédiés à IRC comme mIRC ou xchat.
Pour faire un résumé technique vulgaire : un serveur IRC est une des entrées de ce t'chat (en réalité ils sont souvent reliés à d'autres serveurs). On va donc dire qu'IRC possède un protocole (pour dialoguer courtoisement et efficacement entre les serveurs IRC et avec chaque client entre chaque serveur de façon invisible). Et que les clients IRC savent communiquer avec.
C'est très simple IRC, vous vous y connectez, en général votre client IRC vous indique la liste des salons et vous n'avez plus qu'à trouver un salon (grâce à son nom, le topic/sujet du salon, et le nombre d'utilisateurs qui y sont ; parfois le nom du salon permet de signaler une position géographique).
Historiquement, avant l'avènement des réseaux sociaux, les internautes communiquaient par e-mail et par IRC. Les gens qui se connaissaient avaient leur messenger : sur les sites on trouvait souvent sur leurs forums : "venez en discutez en live sur notre t'chat - actuellement 15287 utilisateurs sont connectés". C'était pas encore le web 2.0 mais un véritable forum public en temps réel, un symbole de la liberté d'expression sur internet et de la modération inter-utilisateurs. Restait à choisir le forums et à trouver d'intéressantes fréquentations, des ambiances de salons, tout même des débats avec des personnalités publiques...
Pas mal de gamers utilisaient aussi IRC : on n'avait pas assez de débit pour faire de la VoIP ! Aujourd'hui on a du mal à imaginer un online-gamer sans teamspeak. TeamSpeak est une sorte de t'chat IRC mais avec la voix. Par contre, on se donne rendez-vous sur teamspeak, alors que sur IRC on se croise/rencontre inopinément ! J'avais installé mon propre serveur TeamSpeak pour mes teams sur dofus et sur wow. Et parfois ça me servait de téléphone international gratuit !
Au début, vous allez dans plein de salons, à la fin vous êtes sur des tas de serveurs IRC !
J'ai moi-même été initié à IRC par ma chef chez Cap Gemini, ce qui m'avait permis à l'époque (en 1999) de surfer sur une ligne T1 et de découvrir internet en tant qu'acteur. Et donc IRC était assez addictif : on trouve très vite des internautes qui possèdent les mêmes passions !
Pour ceux qui n'ont pas connu les connexions pourries à 56K, IRC c'est un truc de geek. Tu pouvais te contenter d'avoir l'applet toute naze qui plantait souvent ou apprendre à customiser ton client IRC. Et en général c'était la guerre des noobs. On trouvait plein de logiciels pour résoudre les IP des utilisateurs, et les nuker (déconnecter d'internet en saturant la victime de paquets) par DoS (déni de service). Les geeks avaient des bouncer IRC votre connexion pour rester connecté 24h/24h (car vous pouvez voir l'uptime des connexions utilisateurs) ! Oui tout le monde ne peut pas comprendre un truc aussi absurde que l'uptime mais moi je respecte ça : quand je reboote un serveur ou un service j'ai toujours une petite larme à l'œil.)
Un peu de vocabulaire ircéen
Le vif du sujet : outils/contraintes
Outils :
Évidemment, on ne choisit pas au pif un service qui va tourner 24h/24, en production qui plus est. Mes critères sont toujours "small is beautiful". Ca signifie, trouver les logiciels les plus simples à configurer, les plus maintenus (c'est bon de savoir que la team met à jour ses sources ou répond à vos mails quand vous trouvez un bug), les mieux documentés en terme de configuration. Ensuite, il faut faire des choix et les assumer pour ne pas avoir à lire des tas de documentations complémentaires.
Couche de services : hybserv (peu de choix en fait)
Serveur IRC (ircd) : hybrid-ircd (semble assez simple à configurer et il semble fait pour hybserv même si tous les ircd sont techniquement compatibles)
Contraintes :
Où est la difficulté ? IRC s'installe très facilement et en quelques secondes. Par contre, pour que les salons soient permanents, il faut rajouter la couche de services qui gère : les utilisateurs, les salons enregistrés, les droits affectés aux utilisateurs sur les salons, les droits délégués aux utilisateurs par les utilisateurs eux-mêmes. Ensuite on peut aller plus loin et gérer des services d'opérateurs (la team d'ircop), des liaisons interserveurs IRC : mais cela ne nous concerne pas !
Le projet qui m'a été donné était "faire un serveur IRC privé et sécurisé" : évidemment cela sous-entend : "avec un salon". J'ai donc opté pour le SSL (vous savez les HTTPS ça veut dire HTTP over SSL / donc c'est du protocole http encapsulé dans le protocole chiffré SSL. Ça vous permet une certaine confidentialité de votre communication.
Pourquoi crypter ? IRC a un vilain défaut, c'est un protocole tellement léger et ancien qu'il n'a aucune sécurité intrinsèque : vos conversations se font en clair, vos mots de passes sont envoyés en clair.
Et là j'ai découvert une petite difficulté inattendue : utilisant Linux Debian sur certains serveurs, j'ai découvert que les paquets debian pour les démons IRC (ircd) ne prenaient pas en charge le SSL. En langage geek "la prise en charge SSL n'est pas compilée par défaut sur Debian avec OpenSSL-dev, Debian recommande de compiler soi-même le .deb ou de se débrouiller avec les licences".
Une fois n'est pas coutume, dans ce tutoriel "Montez votre serveur IRC" nous devrons compiler nos logiciels/serveurs depuis les sources officielles. Autrement dit, au lieu d'utiliser les fameux paquets Debian ou Ubuntu, nous irons télécharger la dernière version d'hybrid-ircd sous forme de "code source" et nous le compilerons nous-mêmes. C'est cool ça donne une allure geek et sérieuse en même temps.
Installation
#on récupère le démon debian et on crée le répertoire du PID apt-get install ircd-hybrid hybserv apt-get remove ircd-hybrid hybserv #suppression des répertoires de conf : rm -r /etc/ircd-hybrid/ rm -r /etc/hybserv/ #IMPORTANT : sinon pas de support ssl ! Bien que ça soit buggué pour l'instant apt-get install libssl-dev #on crée un répertoire pour stocker le PID de ircd cd /var/run mkdir ircd chown -R irc:irc ircd
Si le démon démarre mais ne stoppe ni ne restarte, il s'agit d'un problème de droits dans le chemin du PID. Regardez les démons modifiés en annexe !
Voici l'installation from source
site officiel : http://www.ircd-hybrid.org/downloads.html
wget -c http://prdownloads.sourceforge.net/ircd-hybrid/ircd-hybrid-7.2.3.tgz tar zxvf ircd-hybrid-7.2.3.tgz cd ircd-hybrid-7.2.3/ ./configure --prefix="/usr/local/ircd-hybrid/" --enable-openssl --enable-small-net --with-nicklen=12 --enable-clobber --enable-warnings make make install
Voici les choix de compilation et options qui me semblent intéressantes:
--enable-openssl - Enable the openssl dependent crypto functions. This will allow CHALLENGE to work and encrypted links. On systems where the configure script can automatically detect OpenSSL, this option is not necessary. If configure cannot find OpenSSL, you must specify a path with this option (--enable-openssl=/path/to/openssl) --with-nicklen, --with-topiclen - Respectively, sets the maximum NICK length and maximum TOPIC length. Note that this must be consistent across your entire network. Defaults are 9 and 120, respectively. --enable-small-net - Tunes the server for smaller networks by reducing the startup memory footprint. This should really only be used for *small* networks, as this tends to be a performance hit on larger networks. --enable-clobber Don't preserve old binaries on make install
- Voici le résultat de la configuration :
Compiling ircd-hybrid 7.2.2 Installing into: /usr/local/ircd-hybrid Ziplinks ................ yes OpenSSL ................. yes - BF/168 BF/128 CAST/128 3DES/168 DES/56 Modules ................. shared IPv6 support ............ yes Net I/O implementation .. epoll EFnet server ............ no (use example.conf) Halfops support ......... no Small network ........... yes G-Line voting ........... yes Configured limits: NICKLEN ................. 12 TOPICLEN ................ 160
Juste après l'installation on crée les liens symboliques vers /etc
Afin de simuler une véritable installation debian :
ln -s /usr/local/ircd-hybrid/etc /etc/ircd-hybrid ln -s /usr/local/hybserv /etc/hybserv
Paramétrage
Les fichiers de configuration :
Le répertoire de ircd-hybrid est /usr/local/ircd-hybrid mais j'ai créé un lien symbolique du répertoire de conf sur /etc/ircd-hybrid :
- /usr/local/ircd-hybrid/etc/ircd-hybrid/ircd.motd : message of the day, arrivée IRC ou commande /motd, customise l'arrivée
- /usr/local/ircd-hybrid/etc/ircd-hybrid/ircd.conf
un listener
/* listen {}: contain information about the ports ircd listens on (OLD P:) */ listen { host = "--IP_PUBLIQUE--"; port = 6667; /* * Listen on 192.168.0.1/6697 with ssl enabled and hidden from STATS P * unless you are an administrator. * * NOTE: The "flags" directive has to come before "port". Always! */ #host = "--IP_PUBLIQUE--"; #flags = hidden, ssl; #port = 9999; };
un IRCOP
IRC OPerator : utilisateur(s) déclaré(s) dans la config du démon principal : c'est dieu sur le serveur IRC.
Pour cela on a une classe "operator" déclarée dans la config. Le mot de passe est crypté avec /usr/bin/mkpasswd -Hmd5
Comme nous ne sommes pas parano : nous allons créer un opérateur unique avec un petit mot de passe
--NICKNAME-IRCOP-- / --PASSWORD-IRCOP--
mkpasswd -Hmd5 --PASSWORD-IRCOP-- $1$eUQEqhJJ$8FBtvo3BAsSbN4j3ukkcz1
operator { /* name: the name of the oper */ name = "--NICKNAME-IRCOP--"; user = "MONMASQUE@127.0.0.1"; password = "--PASSWORD-OPERATOR--"; class = "opers"; global_kill = yes; remote = yes; kline = yes; unkline = yes; gline = yes; die = yes; rehash = yes; nick_changes = yes; admin = yes; };
Une couche de services
Ce sont les services nickserv et chanserv qui seront intéressants pour nous : ils sont fournis par hybserv (que nous installerons plus tard) : hybserv sur debian a pour dépendance ircd-hybrid (ça implique de l'installer également from source).Les services sont définis sur la classe "connect". On peut en mettre autant qu'on veut selon que le serveur est linké sur d'autres serveurs ou sur des services d'autres serveurs.
On lui donne un nom, une ip et un mot de passe crypté
mkpasswd -Hmd5 --PASSWORD-HYBSERV-- --CLEAR-PASSWORD-HYBSERV--/
Voici ce que ça donne pour ce paramètre :
connect { name = "services.ircmondomaine.local"; #host = "3ffd:dead:beef::1"; host = "--IP_PUBLIQUE--"; send_password = "--CLEAR-PASSWORD-SENDHYBSERV--"; /*pass en clair : --PASSWORD-HYBSERV-- */ accept_password = "--PASSWORD-ACCEPTHYBSERV--"; port = 6667; #hub_mask = "*"; /* aftype: controls whether the connection uses "ipv4" or "ipv6". * Default is ipv4. */ aftype = ipv4; class = "server"; autoconn = no; };
HYBSERV
Hybserv est la couche de services nécessaire à un serveur IRC pour effectuer des actions persistantes telles que déclarer un channel, son owner, les clés du salon, le topic permanent et laisser un bot dessus. Ca permet aussi l'authentification des utilisateurs (avec une bonne maitrise des masques)
Installation
Voici l'adresse pour télécharger la dernière version de Hybserv : http://sourceforge.net/projects/hybserv2/cd wget -c http://downloads.sourceforge.net/project/hybserv2/hybserv2/Hybserv%201.9.4/hybserv-1.9.4.tar.gz?use_mirror=ignum tar xvzf hybserv-1.9.4.tar.gz cd hybserv ./configure --prefix="/usr/local" --with-nicklen=12 --enable-warnings make make install chown -R irc:irc /usr/local/hybserv #on édite le démon de debian avec les infos laissées en annexe
Configuration
Les fichiers de configuration sont sur /usr/local/hybserv et /etc/hybserv/ et notamment :- hybserv.conf : le fichier à paramétrer pour déclarer le service
- settings.conf contient des paramètres par défaut. A ne modifier que si vous n'arrivez pas à paramétrer hybserv.conf (le fichier fourni est assez sécurisé)
Voici les mots de passes pour les utilisateurs des services : (j'utilise pwgen pour générer de l'entropie dans les mots de passe)
- servadmin (ils demandent un mot de passe difficile) : --VERYVERYLONGPASSWORD--
- admin : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--
- coadmin : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--
- cool : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--
- oper : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--
Gestion IRC : nick & channels
"Register" d'un nickname avec le service NickServ
Votre client IRC permet de choisir un pseudonyme dans les paramètres de connexion. Pour le changer :
/nick monnouveaupseudo * Vous vous appelez maintenant monnouveaups
N'importe quel utilisateur peut se REGISTER tout seul via nickserv. IRC n'est pas très sécurisé dans l'esprit, il est plutôt fait pour amonceler des tas de serveurs les uns sur les autres sans cohérence entre les pseudonymes et les mots de passes, et sans respect des droits. D'où l'importance des droits et des masques d'un utilisateur sur chaque serveur.
Nous allons tenter de mettre en place une politique de sécurité minimale : on va choisir un unique pseudonyme pour gérer les droits des objets permanents (comme les salons) : --ADMIN_LOGIN--
- Obtenir de l'aide : "/msg nickserv help"
- Connaitre la commande REGISTER : "/msg nickserv help register"
- Changer de pseudo : "/nick --ADMIN_LOGIN--"
- Enregistrer --ADMIN_LOGIN-- :
/msg nickserv register --LONGCLEARPASSWORD--" >nickserv< register --LONGCLEARPASSWORD-- -NickServ- Your nickname is now registered under the hostmask [*blablabla@*.mydomain.com] -NickServ- Your password is [--LONGCLEARPASSWORD--] - Remember this for later use
/msg nickserv access ADD *@* >nickserv< access ADD *@* -NickServ- [*@*] added to your Access List
/msg nickserv access list >nickserv< access list -NickServ- -- Access List for [--ADMIN_LOGIN--] -- -NickServ- 1) *@* -NickServ- 2) *blablabla@*.mydomain.com -NickServ- -- End of list --
/msg nickserv set --ADMIN_LOGIN-- private on >nickserv< set --ADMIN_LOGIN-- private on -NickServ- Privacy for [--ADMIN_LOGIN--] is now [ON] /msg nickserv set --ADMIN_LOGIN-- URL http://mea-poulpa.blogspot.com >nickserv< set --ADMIN_LOGIN-- URL http://mea-poulpa.blogspot.com -NickServ- URL for [--ADMIN_LOGIN--] is now [http://mea-poulpa.blogspot.com] /msg nickserv set --ADMIN_LOGIN-- secure on >nickserv< set --ADMIN_LOGIN-- secure on -NickServ- Security for [--ADMIN_LOGIN--] is now [ON]
Enregistrer un salon/channel avec ChanServ
Concernant les droits, Il faut savoir que nickserv et chanserv ne communiquent qu'avec leur base de données ; les commandes qui commencent par '/' sont des vraies commandes IRC. Il faut donc être opérateur (via chanserv ou via les droits IRC) avant de pouvoir les taper. Les commandes '/' que vous tapez et qui ne fonctionnent pas sont sûrement réservées à un type de droit particulier : exemple : "/mode #salon" est réservé à chanop ou un ircop
Le but de ce serveur est de créer au moins un salon permanent sécurisé :
On va créer #mea-saloon avec --ADMIN_LOGIN-- : on dit que --ADMIN_LOGIN-- devient chanop
/join #mea-saloon /msg chanserv register #mea-saloon --LONG_PASSWORD_CHANNEL-- >chanserv< register #mea-saloon --LONG_PASSWORD_CHANNEL-- -ChanServ- The channel [#mea-saloon] is now registered under your nickname -ChanServ- You have been added as a Founder -ChanServ- The password for #mea-saloon is [--LONG_PASSWORD_CHANNEL--] - Remember this for later use /msg chanserv set #mea-saloon COMMENT Welcome To Mea Poulpa's ! /msg chanserv set #mea-saloon ENTRYMSG Alors ça code dur ? Moi je me les gèle ici ! Nickserv me rend dingue, mettez-moi une petite botesse !
==> Petit message de Chanserv à l'entrée sur le salon !
/msg chanserv set #mea-saloon TOPIC Developpers Private Channel, enjoy ! /msg chanserv set #mea-saloon GUARD ON
/msg chanserv set #mea-saloon TOPICLOCK ON -ChanServ- Toggled Topic Lock for channel #mea-saloon [ON]
/mode #mea-saloon +k --CLEARPASSWORD_CHANNEL-- * --ADMIN_LOGIN-- définit le mot-clé du canal à --CLEARPASSWORD_CHANNEL--
/mode #mea-saloon +l 13 * --ADMIN_LOGIN-- définit la limite du canal à 13
NB : pour le moment je n'ai pas défini de mot de passe sur le salon mais directement sur le serveur avec la classe users
Commandes IRCop
L'IRCop est le dieu du serveur, il a tous les droits. Il peut notamment devenir op sur n'importe quel channel. En principe il n'a pas besoin d'exercer ce droit car il est sensé déléguer les tâches de police aux chanops ; lui est sensé protéger le serveur de façon globale.Pour se loguer :
/oper <nick> <pass_en_clair>Il est notamment capable de relancer le serveur à chaud depuis IRC :
/rehashOn peut relancer le serveur via le démon mais /rehash permet de le faire à chaud (sans faire planter les services) et d'avoir les messages d'erreur sur IRC et le numéro de ligne y afférant.
D'autres commandes : http://membres.multimania.fr/voicilirc/ircop.php
IRC over openSSL
Suite à une poussée de paranoïa, nous passons le serveur en SSL. Le contexte est simple, nos serveurs sont hébergés chez SIVIT. Autrement dit, nos machines partagent des switch dont on ignore tout (level, sécurité, ARP-spoofing disabled ?...) : on considère donc que quelqu'un peut nous sniffer.
Or, IRC est un protocole en clair, avec des challenge password. Il est donc très facile de compromettre la sécurité du serveur et l'identité des usagers. De plus l'utilisateur est 100 fois plus exposé dans son propre réseau, il est très facile d'intercepter ses communications et ses mots de passe, avec les outils idoines.
J'ai trouvé toute la doc nécessaire sur example.conf dans /usr/local/share/doc/ircd-hybrid/examples/example.conf.gz et j'ai rajouté les commentaires sur /etc/ircd-hybrid/ircd.conf (les path par défaut ont été modifiés)
mkdir /usr/local/ircd-hybrid/etc/ssl/ cd /usr/local/ircd-hybrid/etc/ssl/ openssl genrsa -out rsa.key 2048 openssl rsa -in rsa.key -pubout -out rsa.pub chown irc:irc rsa.key rsa.pub chmod 0600 rsa.key chmod 0644 rsa.pub openssl req -new -days 365 -x509 -key rsa.key -out cert.pem
Voici le certificat que j'ai généré :
Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]:FRANCE Locality Name (eg, city) []:PARIS Organization Name (eg, company) [Internet Widgits Pty Ltd]:MEAPOULPA Organizational Unit Name (eg, section) []:IRC Servers Common Name (eg, YOUR name) []:irc.mydomain.com Email Address []:administrator@mydomain.comPour vérifier que ça fonctionne, il faut vérifier que le port 9999 est ouvert et que la commande suivante n'a pas de problème de handshake
nmap --IP_PUBLIQUE-- -p 6667,9999 openssl s_client -host irc.mydomain.com -port 9999 -state -debug
CONNECTED(00000003) SSL_connect:before/connect initialization write to 0xcdf0d0 [0xcdf150] (118 bytes => 118 (0x76)) 0000 - 80 74 01 03 01 00 4b 00-00 00 20 00 00 39 00 00 .t.1..K... ..9.. 0010 - 80 74 01 03 01 00 4b 00-00 00 20 00 00 39 00 00 .t.1..K... ..9.. 0020 - 00 00 33 00 00 32 00 00-2f 03 00 80 00 00 05 00 ..3..2../....... 0030 - 00 04 01 00 80 31 00 15-00 00 12 00 00 09 06 00 ....@a.......... 0040 - 40 00 22 14 00 00 11 00-00 08 00 00 06 04 00 80 @............... 0050 - 01 05 13 02 00 80 f2 2e-2f 64 7e 13 64 c0 c9 5a ......../d~.d..Z 0060 - 40 00 00 14 00 00 11 00-00 08 00 00 06 04 00 80 @............... 0070 - fc 7f 48 b7 8g ..H.. 0076 - <SPACES/NULS> SSL_connect:SSLv2/v3 write client hello A read from 0xcdf0d0 [0xce46b0] (7 bytes => 7 (0x7)) 0000 - 15 03 01 00 02 02 28 ......( SSL3 alert read:fatal:handshake failure SSL_connect:error in SSLv2/v3 read server hello A 2989:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:578
Dépanner le serveur
- Chanserv n'est pas présent sur le salon : on redémarre les serveurs dans l'ordre
/etc/init.d/ircd-hybrid restart /etc/init.d/hybserv restartEn revenant Chanserv rétablit les droits : deop etc...
- Chanserv disparait après un restart : privilégier la commande rehash, en plus ça n'expulsera personne du serveur ; inconvénient, prendre les droits d'ircop