Installer un serveur IRC dans un chroot
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
OpenBSD, IRC, ircd, ngIRCd, chat, chroot, cage
Introduction
Ce document décrit comment installer un serveur IRC dans un environnement à racine déplacé (ou cage ou chroot) sur un système OpenBSD.
Le serveur IRC choisi est ngIRCd, en version 0.12, disponible à l'adresse http://ngircd.barton.de
ngIRCd est un serveur IRC libre, développé sous license GPL. ngIRCd signifie “next generation IRC daemon”. Il a été développé “from scratch”, sans s'inspirer du “grand-père des serveurs IRC”, le daemon de l'IRCNet.
ngIRCd supporte les serveurs ayant une adresse IP dynamique, son fichier de configuration est simple, facilement compréhensible, et son code fonctionne sur une grande variété de plate-forme : AIX, A/UX, FreeBSD, HP-UX, IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, et Windows avec Cygwin.
Présentation de la maquette
Les éléments suivants sont mis en oeuvre :
- un système serveur sous OpenBSD 4.x
- un serveur IRC compilé statiquement
Présentation de l'environnement d'installation du serveur IRC :
- le binaire, la documentation de
ngIRCdsont installés dans le répertoire :/opt/ngircd - les fichiers de configuration
ngircd.confet celui de bienvenuengircd.motddans le répertoire :/etc/ngircd - la cage (ou chroot en Anglais) est située dans le répertoire
/var/ircd
Note
Toutes les commandes présentées ici, sont à executer, sauf mention contraire, en tant qu'administrateur de la machine.
Pré-requis
Ce document considère que :
- le système OpenBSD 4.x est installé et opérationnel
- les packages
automake,autoconfsont installés
Installation du produit
Télécharger les sources
Procédez comme suit :
# cd /tmp # ftp ftp://ftp.berlios.de/pub/ngircd/ngircd-0.12.0.tar.gz
Installer le produit
Pour faciliter l'installation du serveur IRC dans la cage, nous allons le compiler en mode static. Ainsi, il n'est pas nécessaire d'installer les bibliothèques et l'éditeur de liens dynamique dans l'environnement à racine déplacé. On gagne en facilité d'installation et d'administration.
Par défaut, le produit s'installe dans le répertoire /usr/local. Or, ce répertoire est utilisé par les ports d'OpenBSD pour les produits packagés. Pour ne pas mélanger les binaires des ports et ceux compilés “à la main”, le serveur IRC est installé dans le répertoire /opt/ngircd.
Exécutez les commandes suivantes :
# mkdir -p /opt/ngircd # # tar xzf ngircd-0.12.tar.gz # cd ngircd-0.12 # CFLAGS=-static ./configure --prefix=/opt/ngircd --sysconfdir=/etc/ngircd [...] # make [...] # make install [...] # strip /opt/ngircd/sbin/ngircd
Les éléments suivants ont été installés :
/opt/ngircd/sbin/ngircd: le binaire du serveur, compilé statiquement/opt/ngircd/share/doc/ngircd/*: la documentation/etc/ngircd/ngircd.conf: un fichier d'exemple de configuration (s'il n'en existe pas déjà un).
Masquer le serveur
Si vous voulez masquer certaines informations affichées par le serveur ngIRCd à la connexion d'un utilisateur, modifiez les fichiers suivants :
src/config.hsrc/ngircd/messages.h
Ces modifications sont à faire APRES le configure et AVANT le make.
Créer un utilisateur dédié
Par mesure de sécurité, il est préférable d'attribuer un utilisateur non privilégié et dédié pour exécuter le serveur IRC. Ainsi, en cas de problème de sécurité sur le serveur IRC, l'attaquant aura des permissions très restreintes sur le système de fichiers.
Pour créer un nouvel utilisateur, procédez comme suit :
# groupadd -g 603 _ircd # useradd -u 603 -g 603 -c "IRCD Daemon" -d /nonexistent -s /sbin/nologin _ircd
Modifier le fichier de configuration
La configuration de ngIRCd est simple, le fichier d configuration est bien commenté. La configuration qui va être réalisée utilise une racine déplacée dans le répertoire /var/ircd et indique que le serveur s'exécute sous l'identité d'un utilisateur dédié.
Sauvegarder le fichier d'exemple
# cd /etc/ngircd # cp ngircd.conf ngircd.conf.orig
Modifier le fichier
Remplir comme suit le fichier de configuration :
[GLOBAL] Name = Leaves.orG Info = Leaves Network Password = AdminInfo1 = Network IRC server AdminInfo2 = Leaves AdminEMail = MotdFile = /etc/ngircd/ngircd.motd MotdPhrase = Welcome on Leaves IRC Network ChrootDir = /var/ircd PidFile = Ports = 6667 Listen = ServerUID = _ircd ServerGID = _ircd PingTimeout = 120 PongTimeout = 240 ConnectRetry = 60 OperCanUseMode = no OperServerMode = no MaxConnections = 30 MaxConnectionsIP = 10 MaxJoins = 10 [CHANNEL] Name = #leaves Modes = Topic = a great topic
Explication des paramètres
Le paramètre ChrootDir est fondamental. En effet, c'est lui qui détermine que le serveur sera exécuté dans une cage, et l'emplacement de cette cage (ici /var/ircd).
Les paramètres ServerUID et ServerGID indiquent sous quelle identité le serveur s'exécute sur le système.
La section CHANNEL liste les cannaux de discussion créés à l'initialisation du serveur. Ces cannaux restent actifs même s'il n'y a plus de membres présents.
Tester la configuration
Pour tester le fichier de configuration, exécutez la commande suivante :
# /opt/ngircd/sbin/ngircd --configtest
Créer la cage
Le paragraphe précédent a montré comment compiler, installer le serveur ngIRCd. Il a aussi présenté la configuration du produit pour qu'il s'exécute dans un environnement à racine séparé : /var/ircd. Il faut maintenant “remplir” cette nouvelle racine pour que le serveur s'exécute convenablement.
Créer le répertoire d'accueil
# mkdir /var/ircd # chown root:wheel /var/ircd # chmod 751 /var/ircd
Créer les répertoires dans la cage
# cd /var/ircd
# mkdir -p {etc/ngircd,dev}
# chown -R root:wheel /var/ircd/*
# chmod -R 751 /var/ircd/*
Copier les fichiers dans la cage
/dev/null
# cd /var/ircd/dev # mknod -m 666 null c 2 2
/etc/resolv.conf
# cp /etc/resolv.conf /var/ircd/etc
/etc/localtime
# cp /etc/localtime /var/ircd/etc/
/etc/passwd
Le serveur ngIRCd a besoin de connaître certains utilisateurs : root et _ircd.
# egrep 'root|_ircd' /etc/master.passwd > /var/ircd/etc/master.passwd # chown root:wheel /var/ircd/etc/master.passwd # chmod 600 /var/ircd/etc/master.passwd
ATTENTION :
Il est TRES IMPORTANT de :
- supprimer les mots de passe des utilisateurs et de les remplacer par la chaîne '*LK*'
- remplacer les shell des utilisateurs par la chaîne : /sbin/nologin.
Créez la base des mots de passe à partir de ce nouveau fichier :
# /usr/sbin/pwd_mkdb -p -d /var/ircd/etc /var/ircd/etc/master.passwd
/etc/group
Créez une copie du fichier /etc/group :
# egrep 'wheel|_shadow|_ircd' /etc/group > /var/ircd/etc/group
/etc/ngircd/ngircd.motd
Quand le serveur ngIRCd démarre, il lit son fichier de configuration /etc/ngircd/ngircd.conf, puis change sa racine vers /var/ircd. Quand il reçoit une requête de connexion, il lit le fichier /etc/ngircd/ngircd.motd pour afficher le message de bienvenue. Ce fichier doit donc être situé dans la cage, car en exécution, la racine du serveur n'est pas / mais /var/ircd.
Créez le fichier de bienvenue :
# echo "Welcome on Leaves IRC Network" > /var/ircd/etc/ngircd/ngircd.motd
Pour une plus grande facilité d'utilisation, nous allons créer un lien symbolique du fichier de bievenue vers le répertoire où est stocké la configuration du serveur ngIRCd : /etc/ngircd.
# cd /etc/ngircd # ln -s ../../var/ircd/etc/ngircd/ngircd.motd ngircd.motd
Gestion des enregistrements
Déterminer la facilité utilisée
La page de manuel de ngIRCd n'indique pas la facilité utilisée pour communiquer avec syslogd. Il faut donc s'en remettre au code source. Le fichier ngircd/src/ngircd/log.c montre c'est la facilité LOG_LOCAL5 qui est utilisée.
Modifier le fichier /etc/syslog.conf
Pour isoler les traces de l'activité de ngIRCd dans un fichier séparé, il faut modifier en deux points le fichier /etc/syslog.conf :
- Par défaut, tous les messages de la sévérité
noticesont envoyés dans le fichier/var/log/messages. Il faut donc désactiver la facilitélocal5.noticepour que ces messages n'aillent pas dans le fichier d'enregistrement. Procédez comme suit :
*.notice;auth,authpriv,cron,ftp,kern,lpr,mail,user.none,local5.none
/var/log/messages
- Pour enregistrer l'activité de
ngIRCddans un fichier séparé, ajoutez la ligne suivante au fichier/etc/syslog.conf:
# ngIRCd logs local5.* /var/log/ngircd.log
Créer le fichier d'enregistrement
Créez le fichier d'enregistrement comme suit :
# touch /var/log/ngircd.log # chown root:wheel /var/log/ngircd.log # chmod 640 /var/log/ngircd.log
Modifier le fichier /etc/rc.conf.local
# add more flags, ie. "-u -a /chroot/dev/log" syslogd_flags="-a /var/ircd/dev/log"
Ces modifications seront prises en compte au prochain redémarrage du système.
Pour prendre en compte les modifications maintenant, relancez le daemon syslogd(8) comme suit :
# pkill syslogd # syslogd -a /var/ircd/dev/log
La socket Unix d'enregistrement des logs est maintenant créée.
Rotation des enregistrements
Le programme newsyslog(8) archive les fichiers d'enregistrement de syslogd(8). Il permet de garder une taille raisonnable aux fichiers d'enregistrements et de compresser les anciens.
Dans notre configuration nous allons :
- fixer les permissions des fichiers archivés tel que : user=root, group=wheel, mode=640
- changer de fichier d'neregistrement tous les 7j
- garder 7 archives compressées (
Z)
Modifiez comme suit le fichier /etc/newsyslog.conf :
/var/log/ngircd.log root:wheel 640 7 * 168 Z
Démarrer automatiquement le serveur
Ajoutez les lignes suivantes au fichier /etc/rc.local :
if [ -x /opt/ngircd/sbin/ngircd ]; then
echo -n ' ircd'; /opt/ngircd/sbin/ngircd -f /etc/ngircd/ngircd.conf
fi
Sécuriser le fonctionnement de ngircd
/etc/malloc.conf
Créez un lien symbolique dans la cage /etc/malloc.conf qui pointe vers les options d’allocation de la mémoire. Voir la page de manuel malloc(3) pour plus de détails.
Procédez comme suit :
# cd /var/ircd/etc # ln -s AFGJ malloc.conf
Autoriser l'accès au daemon depuis l'extérieur
Modifiez comme suit le fichier /etc/pf.conf :
Pour permettre la connexion de serveurs ou de clients extérieurs à votre serveur IRC, ajoutez la règle suivante pour le filtre de paquets d’OpenBSD pf(4). Consultez la page de manuel pf.conf(5) pour plus de détails.
# { wan } -> irc -> [ firewall ]
pass in log on egress proto tcp to (egress) port 6667 \
user _ircd flags S/SA modulate state
Sauvez et relancez pf.
# pfctl -Fr -f /etc/pf.conf
Tracer les modifications des fichiers de configuration
OpenBSD offre la fonctionnalité de sauvegarde et de suivi des fichiers de configuration. Pour cela, le système s'appuie sur le fichier /etc/changelist, voir changelist(5), qui est lu par le script /etc/daily(8).
Pour suivre les fichiers créés dans ce document, ajoutez les lignes suivantes au fichier /etc/changelist :
# ngIRCd (irc) daemon /etc/ngircd/ngircd.conf /var/ircd/etc/master.passwd /var/ircd/etc/resolv.conf