# IRCD

Un IRCd (abréviation de Internet Relay Chat daemon) est une application implémentant le protocole IRC que l'on lance sur un serveur, faisant de ce serveur un serveur IRC. Il permet à différentes personnes de communiquer entre elles à travers l'Internet en échangeant des messages textuels en temps réel$^,$. Ne pas confondre avec un Robot IRC qui est un programme se connectant à un serveur IRC comme n'importe quel client.
Le serveur écoute les connexions émanant de clients IRC sur un ensemble de ports TCP. Lorsque le serveur est membre d'un réseau IRC, il garde également une ou plusieurs connexions avec les autres serveurs/daemons.
Le terme ircd se rapportait initialement à une seule partie du logiciel, mais il a fini par devenir un terme générique pour une implémentation quelconque d'un daemon IRC$^,$.

## Implémentations notoires

Ces serveurs sont très majoritairement installés sur des machines utilisant Linux. L'installation d'un tel dispositif est simple et rapide. La configuration nécessite en revanche davantage de temps. De nombreux sites web proposent des tutoriels pour l'installation d'un IRCD.
Les IRCD les plus utilisés sont :
* Bahamut développé par le réseau de discussion DALnet
* IRCu développé par le réseau de discussion Undernet
* IRCoderZ développé par les Coderz pour le réseau de discussion IRCube
* SnIRCd, développé et utilisé par QuakeNet.
* UnrealIRCd IRCD fonctionnant sous Windows et Unix
* Hybrid (IRCd), pour héberger son propre serveur de discussions, librement.
* ConferenceRoom qui ne respecte pas totalement les RFC et qui n'est pas gratuit
* InspIRCd - Un IRCD modulaire écrit en C++, qui respecte — sans module — la RFC1459.
Un grand nombre d'IRCD sont des versions modifiées des principaux IRCD (notamment des IRCu et des Bahamut).
Une grande partie de ces serveurs sont gratuits et Open Source (source libre), ce qui explique le grand nombre de versions existantes.
Par ailleurs, les serveurs IRC sont souvent accompagnés de services (Nickserv, Chanserv...) qui rajoutent des fonctionnalités tel que la réservation de pseudonymes et de canaux.

## Configuration
### O-line

Une O-line (Operators Line) est un bloc de données du fichier de configuration du Serveur IRC (ircd.conf, unrealircd.conf ... dépendant de l'IRCd). Elle sert à indiquer au système qui sont les opérateurs du réseau, c'est-à-dire ceux qui peuvent en prendre le contrôle à un niveau global sur le(s) serveur(s). Les O-lines sont généralement créées par l'administrateur du serveur/réseau ou par un administrateur ayant directement accès aux fichiers de configuration du serveur IRC. L'attribution d'une O-line à un utilisateur signifiant le fait de lui accorder un certain nombre de pouvoirs sur le système, il est nécessaire de s'assurer que la personne est absolument digne de confiance, et aussi, apte à gérer des actions à un niveau au-delà de la gestion individuelle des canaux.

#### Exemple d'O-line

Le type de configuration varie d'un type d'IRCd à l'autre.
L'exemple suivant montre un bloc de configuration d'une O-line sous UnrealIRCd. Il rassemble toutes les informations et autorisations d'accès d'un IrcOp donné, et peut contenir autant le bloc opérateurs que nécessaire. Le bloc commence toujours par la ligne "Oper <nomdel'opérateur>" suivi d'une accolade ouverte, et se termine toujours par une accolade fermée et un point virgule. De manière générale, le point virgule indique la fin d'un bloc ou d'une ligne de configuration. Il se présente ainsi :
Si l'on détaille le contenu du bloc, on remarque différents éléments :
* UserName : Le pseudonyme de l'utilisateur opérateur. Il est sensible à la casse : UserName est différent de Username. Il suffit donc de remplacer ce nom par celui de l'utilisateur à déclarer comme opérateur.
* class clients : Indique simplement que le bloc fait référence à un utilisateur connecté au réseau.
* Le sous-bloc from est indispensable. Il permet de renforcer la sécurité en limitant l'oper-up d'un utilisateur à partir d'un hostmask donné. Si le paramètre userhost est défini sur *@*, l'utilisateur pourra effectuer un Oper-up avec la commande /OPER depuis n'importe quel ordinateur sur n'importe quelle connexion. En revanche, si l'on spécifie un hostmask, par exemple : *@internet-dialup100.com, l'utilisateur ne pourra devenir IrcOp que depuis la connexion internet qui renvoie cet hostmask au serveur. Cette mesure vise à empêcher des détournements de privilèges opérateur par des utilisateurs malveillants.
* password : C'est simplement le mot de passe Opérateur (qui peut être différent de celui enregistré pour protéger le pseudonyme dans NickServ. Il est sensible à la casse. Dans le fichier de configuration, il doit être spécifié entre guillemets.
* Le sous-bloc flags : Il contient les Oper Flags, c'est-à-dire les autorisations d'accès de l'opérateur. Ces derniers sont détaillés dans la documentation d'UnrealIRCd. Ils varient en fonction des autorisations que l'administrateur principal a donné à l'opérateur.
* maxlogins : Il s'agit d'un paramètre optionnel visant à limiter le nombre d'oper-ups pour un opérateur donné. Cela permet d'éviter que quelqu'un prenne les privilèges opérateur alors que l'IrcOp est déjà connecté.
Il existe d'autres paramètres optionnels pour le Bloc opérateur, comme l'attribution de modes utilisateurs après un oper-up...

#### O-line temporaire

Les IrcOps ayant des accès de niveau Administrateur des Services (Services Admins ou SA) peuvent définir des O-lines par le biais d'OperServ. Comparé à celles définies dans le fichier de configuration du serveur, ces O-lines peuvent être considérées comme temporaires car il est très facile de les mettre en place et de les retirer. De plus, elle ne nécessite aucune relecture de la configuration pour être actives, et l'utilisateur qui en bénéficie peut effectuer un Oper-up en utilisant son pseudo (enregistré avec NickServ) et son mot de passe d'identification NickServ. Mais contrairement à la configuration centrale, il n'est pas possible d'utiliser les Oper-flags du type "can_kline" ou "global", mais il fait utiliser les flags dit "à l'ancienne", tels que +oaAWst ... (ces modes sont indiqués avec leurs correspondances en nouveaux Oper-flags dans la documentation d'UnrealIRCd). Par exemple, pour définir une O-line temporaire sur un utilisateur, l'administrateur entrera la commande suivante et y mettra les flags appropriés :
/MSG OperServ OLINE <pseudonyme> <flags>
Exemple : /MSG OperServ OLINE Nickoperateur +owghasW
Dans cet exemple, on a ajouté (+) les flags suivants : un opérateur (o), qui peut voir les messages de service envoyés aux IrcOps (w) et ceux envoyés à toute personne sur le réseau (g). Il a aussi accès à l'aide spéciale des Opérateurs par le biais de la commande /helpop (h), c'est aussi un administrateur des services (a) qui voit les notices serveur (s) et qui reçoit une notice quand un autre utilisateur fait un /WHOIS sur lui (W). Les flags sont sensibles à la casse. Ils donnent différents privilèges : a est différent de A (qui signifie Administrateur du Serveur).
Il est très facile de supprimer la O-line temporaire. Pour cela, il suffit d'entrer la même commande que précédemment, mais en faisant simplement suivre le pseudonyme du symbole moins (-).
Exemple : /MSG OperServ OLINE Nickoperateur -
L'utilisateur perd sa O-line et ses droits temporaires d'opérateur.

### D-line

Un D-line (ou D:line), de deny line, est un terme du jargon de l'IRC. À l'instar du K-line, un D-line va empêcher un utilisateur d'utiliser un certain serveur d'un réseau IRC. La particularité du D-line est que l'utilisateur affecté ne pourra même pas se connecter au serveur (celui-ci supprimera aussitôt la connexion avec l'adresse IP bannie), alors que le K-line déconnectera (kill) l'utilisateur une fois sa connexion au serveur terminée (éventuellement après l'affichage du MOTD avec une notice indiquant le motif du bannissement). Un D-line sert généralement à bloquer les connexion d'attaquants persistants.

### K-line

Un K-line (ou K:line), de kill line, est un terme du jargon des réseaux IRC. Un utilisateur étant affecté par un K-line se voit interdire l'accès à un certain serveur du réseau, et ce de manière temporaire ou permanente.
Généralement, un K-line ne s'applique que sur un serveur à la fois : l'utilisateur banni peut donc se connecter au réseau IRC en passant par un autre serveur. Toutefois, il y a un grand nombre d'autres « lines » (G-line, Z-line, etc.) qui sont proches du K-line. Par exemple, un G-line agit de la même manière que le K-line, mais celui s'applique sur l'ensemble des serveurs d'un réseau IRC.
Les daemons IRC modernes peuvent aussi autoriser les IrcOps à mettre en place des K-lines sans avoir besoin de modifier les fichiers de configuration du daemon (chose normalement réservée aux administrateurs). Certains services IRC peuvent aussi aider à gérer ces lines, comme OperServ par exemple.

## Modes

Les modes sont des moyens de protéger les canaux et les utilisateurs, d'attribuer des privilèges, d'activer des options... Les modes ont plusieurs niveaux allant de la gestion du serveur, en passant par celle des canaux et aussi des utilisateurs.
Seul un utilisateur ayant des privilèges sur un canal ou sur un serveur peut modifier les modes de ce dernier et des autres utilisateurs (en fonction de son niveau d'accès, IrcOp, Services Admin, Opérateur de canal, Half-Op...). L'utilisation de la commande /mode dépend entièrement du client IRC choisi par l'utilisateur, sa syntaxe est la suivante :
La cible peut être un canal irc, par exemple #plop, ou le pseudo d'un utilisateur (son nick). Le mode est sous la forme d'une lettre majuscule ou minuscule précédée d'un + ou d'un - selon qu'on veuille définir ou retirer le mode. Certains modes requièrent des paramètres, notamment ceux qui servent à gérer les droits des utilisateurs.
Par exemple, pour ne permettre qu'aux utilisateurs invités d'entrer sur le canal #plop, un opérateur va procéder comme suit :
Sur ce même canal, pour retirer les droits d'opérateur à un utilisateur dont le nick est "JeanClaude" :
Si JeanClaude ne souhaite pas faire apparaître son adresse IP publiquement, il fera :

### Modes des canaux

* i : canal accessible uniquement sur invitation (commande /invite)
* n : les messages externes ne sont pas autorisés
* p : canal privé; le nom du canal est invisible
* s : canal secret; le canal est totalement invisible
* t : sujet du canal uniquement modifiable par les opérateurs du canal
* m : canal modéré, seuls les utilisateurs en mode verbose et les opérateurs peuvent envoyer un message
* c : permet d'empêcher l'utilisation de couleur d'écriture ou de fond d'écriture sur un salon.
* q : +q nick donne à nick le statut de propriétaire de canal, -q le retire
* a : +a nick donne à nick le statut de chanadmin sur le canal, -a le retire
* o : +o nick donne à nick le statut d'opérateur sur le canal, -o nick lui retire
* v : +v nick met l'utilisateur nick en mode verbose. Ce mode est sans effet sans le mode +m
* l : l nombre fixe la limite du nombre d'utilisateurs sur le canal à nombre
* b : +b user bannit l'utilisateur user
* k : k key - seuls les utilisateurs connaissant la clé key pourront se connecter au canal
* S : +S - Les couleurs du salons sont filtrées
* R : +R - Applique l'obligation d'être inscrit pour joindre le canal. (sur certains serveurs)
Les modes o, v, l, b et k prennent un paramètre.

### Modes des utilisateurs

* w : reçoit tous les messages envoyés par la commande wallop
* o : signifie que l'utilisateur est un opérateur IRC (à ne pas confondre avec le mode de canal o)
* i : invisible - en dehors de la participation commune à un canal, l'utilisateur n'est pas visible par les autres
* s : reçoit toutes les notifications du serveur
* x : masque son adresse IP aux yeux des autres utilisateurs (selon le serveur choisi)
Ce sont les modes les plus courants définis par la RFC, chaque serveur IRC est libre d'ajouter autant de modes qu'il le souhaite.

### Signification des modes

Les modes d'un canal conférant certains privilèges aux utilisateurs sont les suivants :
* o : Mode opérateur du canal. Un opérateur a le contrôle et régule l'activité de son canal. Il peut exclure (ban) quelqu'un, expulser de manière ponctuelle (kick), changer les modes du canal, son sujet (topic) ... Sur de nombreux clients, les pseudos des opérateurs de canal sont précédés d'un @ (arobase)
* q : Mode spécial réservé à ChanServ ou aux IrcOps ayant des droits suffisamment élevés. C'est le mode qui marque l'utilisateur comme opérateur fondateur du canal. Il le protège contre les kicks et lui permet de lever les bans sur lui-même si nécessaire. Il donne plein accès à la gestion du canal. Le mode se combine au mode opérateur (+oq).
* a : Utilisateur protégé contre les kicks (généralement le second opérateur du canal ou le successeur de la personne qui a fondé le canal). Ce mode fonctionne généralement en conjonction avec le mode +o (on parle alors d'opérateur en +oa).
* h : Mode half-op. Il s'agit d'un semi-opérateur qui peut procéder à des kicks, bans, changements de topics, mais il n'a pas accès à tous les modes du canal. Son pseudo est souvent précédé d'un % (pour cent)
* v : Mode voix (voice). Il permet à l'utilisateur de parler sur un canal modéré (+m). À défaut, il ne pourra rien dire et les autres utilisateurs sur le canal ne verront pas les messages qu'il envoie. Ce mode est inutile si le canal n'est pas modéré. Les utilisateurs ayant la parole sont souvent marqués par un + (plus)

## IRC sécurisé
### Principe et raisons

La plupart des connexions aux réseaux IRC sont souvent en clair, non chiffrées. Généralement, les utilisateurs n'y prêtent pas véritablement attention, mais le problème devient évident lorsqu'il est nécessaire d'utiliser un mot de passe pour s'identifier auprès des services IRC. Les mots de passe étant transmis en clair, comme toutes les données de la connexion, ils peuvent être potentiellement interceptés par une tierce personne écoutant le trafic du réseau.
La parade consiste donc à chiffrer des données pour protéger les informations (conversations, mots de passe, logins des IrcOp...). Ainsi, le trafic entrant et sortant du serveur ne sera lisible que par les machines destinataires légitimes. D'une manière générale, pour assurer la sécurité d'un réseau, les opérateurs devraient systématiquement utiliser des connexions sécurisées pour éviter le sniffing et ainsi, le vol de leurs mots de passe

### Technique

Le chiffrement / sécurisation d'une connexion IRC suit un procédé standard utilisé avec d'autres types de protocoles (comme HTTPS par exemple). Le client IRC va d'abord négocier avec le serveur pour créer un tunnel de sécurité (via un port dédié) dans lequel les données circuleront (par vérification et échange de clés publiques et de certificats). Ce n'est qu'une fois que ce tunnel est prêt que la session IRC démarre. L'utilisation d'une connexion IRC sécurisée ne diffère en rien de l'utilisation d'une connexion normale, mis à part que le client peut parfois afficher un message d'alerte si le certificat lui semble incomplet (cas des certificats auto-signés, par exemple).
En général, le serveur signale au client que les données sont chiffrées en affichant avant le MOTD les caractéristiques de la connexion, par exemple :
-irc.serveur.com- *** You are connected to irc.serveur.com with TLSv1-AES256-SHA-256bits
TLSv1 indique la version du système de sécurisation, AES est le protocole de chiffrement avec une clé de longueur 256 bits, SHA256 est le hash. Ces informations varient bien entendu en fonction des protocoles de chiffrement et longueurs de clés utilisés et/ou disponibles sur le serveur ou le client.
Et par la suite, l'Usermode +z est appliqué au client, le marquant comme sécurisé. Ce mode permet aussi à l'utilisateur de rejoindre des canaux nécessitant le chiffrement des données, comme les canaux réservés aux administrateurs/opérateurs, ou autres.
À ce propos, lorsque l'utilisateur se connecte à un serveur et veut savoir si ce dernier supporte les connexions sécurisées, il suffit de passer en revue la liste des modes utilisables sur le serveur. Ces informations s'affichent toujours dès l'établissement de la connexion, avant le MOTD, comme ceci :
Dans les listes des modes (« iowghra... »), si le mode « z » apparaît, cela signifie que le chiffrement est supporté par le serveur. Pour utiliser la connexion sécurisée, il faut donc se renseigner auprès d'un IRCOp ou d'un Administrateur pour connaitre le numéro du port dédié.
Cette technique n'est pas toujours vrai. Certains serveurs, comme sur le réseau freenode utilise un mode différent et d'autres IRCd n'ont tout simplement pas implanté de mode de ce genre.

### Implémentation du côté client

La plupart des clients IRC modernes implémentent des fonctions permettant de se connecter à un serveur IRC disposant d'un ou plusieurs ports dédiés aux sessions sécurisées. Certains clients gèrent ces fonctions en natif (comme KVIrc, XChat, ou encore Irssi si celui-ci est compilé avec le support SSL), là où d'autres clients comme mIRC par exemple nécessitent l'ajout de bibliothèques de chiffrement comme OpenSSL (libeay32.dll et ssleay32.dll par exemple). Il suffit donc ensuite de se connecter au serveur en passant par le port dédié aux connexions sécurisées; par exemple : 7000 (Comme convention, non officielle) au lieu de 6667.
Pour certains clients, il est parfois nécessaire d'ajouter un paramètre à la commande de connexion pour signaler qu'il va falloir utiliser le chiffrement. Sous mIRC, il suffit de placer un « + » juste avant le numéro du port (exemple : /server irc.server.com:+6668), ou bien parfois, le commutateur « -ssl » peut aussi être utilisé. Cela varie d'un client à l'autre.

### Implémentation du côté serveur

L'implémentation du système de chiffrement sur un serveur se fait au moment de la préparation à la compilation (pour un serveur tournant sous un système Linux/UNIX ou FreeBSD). En fonction du serveur (UnrealIRCd, Bahamut, etc.), il faut configurer le script pour qu'il intègre les modules de chiffrement quand la compilation sera effectuée. Cela passe parfois par une question demandant si l'utilisateur désire que le serveur supporte les connexions de type SSL. Si l'on répond par l'affirmative, le système recherchera les modules de type OpenSSL ou autres pour installer le support du chiffrement et générer la clé et le certificat du serveur (certificat auto-signé dans ce cas, si l'on ne dispose pas de certificat délivré par une autorité officielle). Pour créer le certificat, le script pose une série de questions à l'utilisateur telles que : le nom du site, l'emplacement géographique, etc. Une fois cette étape passée, la compilation peut être lancée.
Il s'agit ensuite de configurer correctement le serveur pour déterminer le ou les ports permettant les connexions sécurisées. Cette configuration se fait généralement dans le fichier ircd.conf ou unrealircd.conf dans le Listen Block ou « P:Line ». On y précise les numéros de ports standards non sécurisés (6667 le plus souvent), et ensuite, le ou les ports sécurisés, en ajoutant les paramètres et options nécessaires indiquant au serveur d'utiliser le chiffrement pour ces ports précis. Par ailleurs, les chemins exacts des fichiers contenant la clé publique et le certificat doivent figurer dans la configuration principale du serveur IRC. En général, ces fichiers se trouvent dans le dossier contenant l'exécutable du serveur.

### Perte de connexion/synchronisation

L'IRC étant un protocole nécessitant la vérification de l'exactitude des données transmises, il se base donc sur le modèle de transmission TCP. Cela signifie donc que si la connexion subit une latence trop élevée, une désynchronisation ou une perte de paquet non récupérable, la session est considérée comme nulle et est terminée automatiquement par le client ou le serveur. Il va donc de soi que le tunnel de sécurité fonctionne aussi selon ces mêmes règles. Une absence de réponse d'un côté ou de l'autre, une perte de synchronisation des clés de chiffrement, ou simplement un Ping Timeout (latence excessive) va entrainer la fermeture du tunnel, et avec lui, la fin de la session IRC. De cette façon les données ne sont pas transmises au hasard sans vérification de la part du système. La session sécurisée se remet en place lors de la reconnexion du client.