Configurer miniIRCd sur OmniOS

Introduction

miniIRCd est un serveur IRC minimaliste.
Pas de contrôle des utilisateurs entrants, pas d'authentification (autre qu'un mot de passe d'accès), juste du SSL.
ça peut servir dans certains cas...
On peut facilement écrire un filtre fail2ban et configurer le pare-feu pour limiter les risques.

Attention pour nous autres Français, le serveur OmniOSce doit être à l'heure au moment de la génération des certificats SSL !!!! Suivre l'article sur le réglage ntp.

Passez en root pour toute la procédure


1) Installer git

pkg install git

2) Télécharger installer miniIRCd

cd /tmp && git clone https://github.com/jrosdahl/miniircd.git && cd miniircd && cp miniircd /usr/bin/

3) Générer le certificat SSL autosigné et créer le chroot

mkdir -p /var/jail/miniircd ; cd /var/jail/miniircd ; openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout miniircd.key -out miniircd.crt

4) Lancer le serveur en arrière-plan

/usr/bin/miniircd --listen=0.0.0.0 --ssl-cert-file=/var/jail/miniircd/miniircd.crt --ssl-key-file=/var/jail/miniircd/miniircd.key --verbose --chroot=/var/jail/miniircd --setuid=nobody --password 'Mon-Super-Mot-de-PaSse' -d

Sur Android, l'application CoreIRC Go (ou sa version payante) est compatible avec miniIRCd


Rappel des commandes IRC de base (compatibles avec miniIRCd) :

- Rejoindre un canal ou en créer un :

/join #NOM-DU-CANAL-A-CREER-OU-A-JOINDRE

- Quitter le canal '#CANAL' avec un message d'au-revoir

/part #CANAL Au revoir tout le monde

- Changer de pseudonyme

/nick NouveauPseudo

- Envoyer le message 'Bonjour' à l'utilisateur 'Utilisateur'

/msg Utilisateur Bonjour !

- Envoyer un fichier à un utilisateur

/dcc send UTILISATEUR-DESTINATAIRE

Comment sécuriser un peu miniircd sur OmniOSce/OpenIndiana

Il y a plusieurs options dont l'évident fail2ban.
Malheureusement, la version du dépôt d'OmniOSce de fail2ban est trop ancienne et il lui manque l'option indispensable à notre situation : comment gérer des logs non horodatés.
Car hélas, les logs de miniircd ne comportent pas d'horodatage des évènements, et seules les versions 'récentes' de fail2ban embarquent un datepattern = {NONE}. Sans ce dernier, impossible de bannir des IP venant de logs où les évènements ne sont pas horodatés.
Sur OmniOSce/OpenIndiana, il est possible de passer par la version de fail2ban de pkgsrc, qui est beaucoup plus récente.
Je n'ai pas eu le temps de la tester dans ce cas de figure (plutôt rare, il faut bien le reconnaître), mais l'option {NONE} devrait fonctionner dans les filtres.

A la place, nous allons tout simplement écrire un mini script 'démon' qui capturera toutes les lignes issues du log de miniircd et qui, lorsqu'il reconnaîtra le code d'erreur d'un utilisateur qui n'a pas réussi à s'identifier, bannira instantanément et automatiquement son IP avec IPFilter.

Le script est basique, un simple tail -f du fichier de log de miniircd avec un while read -r line...
Il faut néanmons se rappeler que l'ordre des règles dans le fichier /etc/ipf/ipf.conf a une importance.. Aussi, on ne peut pas simplement se contenter d'envoyer l'IP à bannir dans la commande IPF, on est obligé d'envoyer la règle de bannissement au début du fichier et de recharger la configuration d'IPF (ce qui complique légèrement le script...)


LANCEMENT DE miniircd AVEC LOG

Pour pouvoir mettre en place une sécurité par bannissement des IP qui tentent de se connecter (et qui échouent), il faut que miniircd génère un log des activitiés de connexion.
miniircd comporte une option de redirection de log, malheureusement, je n'ai pas réussi à la faire fonctionner sur omniosce.. et je ne sais pas pourquoi.
miniircd me répond qu'il ne trouve pas le fichier de log. J'ai mettre en place toutes les permissions, rien à faire.
Donc je propose de rediriger avec un > vers un fichier de log, tout bêtement ! ça fonctionne très bien.

- Lancer miniircd en arrière-plan (nohup) avec mode debug (sans cela, on ne voit pas le code d'erreur de connexion par mot de passe - 464) et redirection dans un log :

nohup /usr/bin/miniircd --listen=0.0.0.0 --ssl-cert-file=/var/jail/miniircd/miniircd.crt --ssl-key-file=/var/jail/miniircd/miniircd.key --verbose --chroot=/var/jail/miniircd --setuid=nobody --password 'Mon-Super-Mot-de-Passe' --debug > /var/jail/miniircd/miniircd.log &

CONFIGURATION STANDARD d'IPFILTER

Le fichier de règle doit être créé ici : /etc/ipf/ipf.conf

### IPFILTER CONFIGURATION ###

# Block all incoming traffic by default
block in log all

# Block all outgoing traffic by default
block out log all

# Block packets with suspicious IP options
block in log quick from any to any with ipopts

# Block malformed TCP packets
block in log quick proto tcp from any to any with short

# Allow traffic on the loopback interface
pass in quick on lo0 all
pass out quick on lo0 all

# Allow and track stateful outgoing traffic
pass out quick all keep state

# Allow incoming connections that match an already established outgoing connection
pass in quick all keep state

# Explicitly allow certain incoming connections if necessary (optional)
pass in quick proto tcp from any to any port = 22 keep state # SSH
pass in quick proto tcp from any to any port = 6697 keep state # miniircd

On y autorise l'accès SSH et l'accès au port 6697 de miniircd, c'est tout.

- Une fois fait, démarrer ipfilter :

svcadm enable svc:/network/ipfilter:default

- Pour voir les règles chargées par défaut :

ipfstat -io

- Pour recharger les règles du fichier (au cas où) :

ipf -Fa -f /etc/ipf/ipf.conf

CREATION D'UN SCRIPT DE BANNISSEMENT INSTANTANNE

Le placer directement dans le dossier de jail : /var/jail/miniircd/banip.sh

#!/bin/bash

LOG_FILE='/var/jail/miniircd/miniircd.log'
IPF_CONF='/etc/ipf/ipf.conf'
LAST_LINE=''

ban_ip() {
 IP=$1
 if ! grep -q 'block in quick from $IP to any' '$IPF_CONF'; then
 echo 'block in quick from $IP to any' | cat - '$IPF_CONF' > temp.conf && mv temp.conf '$IPF_CONF'
 ipf -Fa -f '$IPF_CONF'
 echo '$(date): Banned IP $IP' >> /var/log/miniircd_bans.log
 fi
}

# Utiliser tail -F pour suivre le fichier de log
tail -F '$LOG_FILE' | while read -r line; do
 # Vérifier si la ligne contient le code d'erreur 464
 if echo '$line' | grep -q '464 :Password incorrect'; then
 # Extraire l'adresse IP
 IP=$(echo '$line' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
 if [ -n '$IP' ]; then
 ban_ip '$IP'
 fi
 fi
done

- On autorise son exécution...

chmod 740 /var/jail/miniircd/banip.sh

... et on le lance en tâche de fond :

nohup ./banip &

Voilà, vous pouvez faire un test à présent, vous verrez que si vous vous trompez d'IP, vous serez instantanément banni.



↑ Haut de page