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 ngIRCd sont installés dans le répertoire : /opt/ngircd
  • les fichiers de configuration ngircd.conf et celui de bienvenue ngircd.motd dans 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, autoconf sont 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.h
  • src/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é notice sont envoyés dans le fichier /var/log/messages. Il faut donc désactiver la facilité local5.notice pour 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 ngIRCd dans 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

Liens

 
doc/openbsd/ngircd.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page