Bonjour,
Le contexte:
Je suis en train de mettre en place un nouveau serveur en remplacement de mon vaillant Rapsberry 1 (version B quand même ;) ).
Le but est d’auto-héberger tout un tas de services / fonctionnalités et de se passer au maximum des géants du net.
Sur mon RPI tout était directement mis en place sur la raspbian.
Sur ce nouveau serveur je mets en place un serveur debian avec LXC et des conteneurs ("unprivileged") qui compartimenteront les différents ensembles de fonctions.
La question:
Sur mon RPI j'avais mis en place fail2ban configuré pour aller chercher les logs des différentes parties et bloquer l'accès aux ip des méchants après quelques tentatives incorrectes.
Sur mon nouveau serveur avec conteneurs LXC je me demande où / comment mettre en place fail2ban:
- Sur l'hôte, il piocherait assez facilement directement dans les fichiers des conteneurs pour interdire globalement l'ip du méchant à l'ensemble du serveur et donc des conteneurs
- Sur un conteneur dédié, ainsi isolé, plus facile à sauvegarder, réparer, ou pour faire des essais en dupliquant instantanément le conteneur. Mais comment faire pour accéder aux fichiers nécessaires et bloquer globalement les ip des méchants?
=> Voilà comment faites-vous que conseillez vous?
=> Utilisez vous d'autres outils pour sécuriser votre / vos serveurs?
Si cela peut aider voici l'architecture en cours de réalisation:
# importer un sous répertoire de l'hote dans le container
Posté par cg . Évalué à 2.
Tu peux faire ça par exemple, sur le serveur hôte Debian:
Un répertoire par service :
/var/log/lxc-srv/apt-cacher/
/var/log/lxc-srv/mqtt/
/var/log/lxc-srv/mail/
/var/log/lxc-srv/domotic-webui/
Et importer chaque répertoire de log dans le container correspondant.
Pour fail2ban lui-même, si tu veux le mettre dans un container, il faudra aussi importer les 4 répertoires de logs (ou /var/log/lxc-srv/ directement).
Ainsi les logs survivent à la recréation des containers, et fail2ban peut y accéder.
D'ailleurs tu vas devoir faire la même chose pour toutes les données persistantes de chaque container (genre tu veux pas perdre tes mails quand tu installes une nouvelle version du container mail).
[^] # Re: importer un sous répertoire de l'hote dans le container
Posté par ROUGEXIII . Évalué à 2.
Merci pour ton retour, point de vue intéressant.
Je le voyais dans l'autre sens avec toutes les données gérés par les conteneurs stockées dans les conteneurs :
- Séparation par fonction y compris des données
- Facilité de dupliquer / sauvegarder le conteneur avec les données (par exemple avant de faire une maj). Un seul ensemble fonctionnel à lui tout seul.
- Possibilité de changer le conteneur de serveur avec les données en un rien de temps
- Plus tard je voulais mettre un deuxième serveur de secours qui prendrait le relais en cas de coupure du principal (lieu, alimentation et connexion différente) avec synchronisation des conteneurs avec données
Mais ce n'est effectivement pas forcément le meilleurs des choix.
Tu procèdes comme cela sur ton serveur?
Du coup fail2ban dans son conteneur mais avec accès à tous les répertoires partagés des autres conteneurs?
Et fail2ban viens directement écrire dans les règles IP du de l'hôte pour bannir les IP?
[^] # Re: importer un sous répertoire de l'hote dans le container
Posté par cg . Évalué à 1.
Ah, c'est peut-être un biais que j'ai à cause de Docker : la logique est de ne pas modifier le contenu du container, mais d'utiliser du binding de répertoire externe ou d'utiliser des volumes pour les données qui doivent continuer d'exister quand le container est stoppé ou détruit.
J'avoue que ça m'angoisse terriblement d'avoir des données pérennes dans un objet volatile comme un container.
Je travaille plutôt avec des VMs, mais sur le même principe : les données (genre les repos git pour une instance gitlab) sont sur un second disque, que je peux détacher de la VM et attacher sur une autre.
# [HS]
Posté par gUI (Mastodon) . Évalué à 3.
Il est joli ton schéma, tu l'as fait avec quoi ?
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: [HS]
Posté par ROUGEXIII . Évalué à 2.
Bonjour,
Tout simplement avec LibreOffice - Draw avec quelques png glanées sur le web :)
# Fail2ban
Posté par totof2000 . Évalué à 2. Dernière modification le 06 janvier 2022 à 09:44.
Container (r)syslog + fail2ban + iptable en entrée ?
Il pourrait éventuellement en plus servir de reverse proxy + rebond ssh … + ce que tu veux.
Tu rediriges les logs de tous tes services hébergés sur ce container.
En gros ça donnerait :
Tu pourrais éventuellement faire la même chose sur l'hôte pour traquer les IP non désirées en amont (mais là je ne referai pas le dessin en ASCII … Non pas que ça ne m'amuse pas, mais j'ai plus le temps de le faire ).
[^] # Re: Fail2ban
Posté par ROUGEXIII . Évalué à 1.
Bonjour, merci pour le retour,
Je n'avais pas pensé à rsyslog! Mais oui!
Je vais regarder comment ça se met en place concrètement.
Je comprends pas trop le lien avec reverse proxy ou ssh mais je vais lire la doc :)
[^] # Re: Fail2ban
Posté par totof2000 . Évalué à 2.
L'idée est d'avoir un seul point d'entrée pour pénétrer sur les conteneurs/services hébergés sur les autres containers.
Ca n'a pas vraiment de rapport avec fail2ban … c'est juste pour n'avoir qu'un seul point d'entrée vers les services. Ca t'éviterait par exemple d'ouvrir des connections directes à des bases de données depuis l'extérieur si ce n'est pas nécessaire.
[^] # Re: Fail2ban
Posté par ROUGEXIII . Évalué à 2. Dernière modification le 08 janvier 2022 à 15:34.
Cela devrait te plaire ;)
# ca depend de ton reseau
Posté par NeoX . Évalué à 4.
si tes conteneurs sont accédes via la machine principale avec un systeme de proxy (ce qui semble etre le cas d'après ton schema,
tes clients -> machine avec proxy (192.168.3.21) -> reseau privé (10.0.3.x) -> conteneur
alors oui, ton fail2ban a tout son intérêt sur la machine principale, qui va alors faire les regles de parefeu qui vont bien pour bloquer l'entrée illicite
si par contre tes conteneurs sont en direct sur le reseau, sans proxy, et avec juste du routage/nat entre tes machines, alors c'est sur chacun des conteneurs qu'il te faudra le fail2ban
[^] # Re: ca depend de ton reseau
Posté par ROUGEXIII . Évalué à 1. Dernière modification le 07 janvier 2022 à 18:37.
Bonjour, merci pour le retour
Alors pour l'instant je suis en configuration par défaut sur LXC (donc veth et lxcbr0) mais j'avoue que je ne comprends pas encore les différentes possibilités et avantages/inconvénients.
Sur l'hôte LXC je fais un
iptables -t nat -A PREROUTING -i $NomDeMonInterface -p tcp --dport $MonNumDePort -j DNAT --to-destination 10.0.3.$NumDuContainer
Je ne sais pas trop ce que cela fait exactement mis à part que je peux rediriger le port voulu depuis l'IP hôte vers le conteneur voulu.
J'ai mis à jour le croquis sur le premier post pour faire apparaître les numéros de port.
Pas intéressant de mettre Fail2Ban dans un des conteneurs pour faciliter les sauvegardes / mise à jour / backup / transportabilité ?
[^] # Re: ca depend de ton reseau
Posté par NeoX . Évalué à 3. Dernière modification le 07 janvier 2022 à 18:55.
ton iptables PREROUTING permet aux utilisateurs de voir uniquement l'IP 192.168.x.y de ton serveur physique
ensuite en effet, ca renvoie le port demandé vers le bon conteneur
tu peux donc en effet faire les fail2ban sur les conteneurs, chacun se gere, se sauvegarde et bloque ces autorisations/interdictions
# fail2ban sur le host + rsyslog guests->host
Posté par BiBite . Évalué à 3. Dernière modification le 06 janvier 2022 à 22:23.
Hello,
j'ai un serveur Debian avec une configuration similaire:
- les containers LXC (LXC guests dans mon readme) ont chacun un sous réseau en 10.0.N.0/24, avec N > 1
- le Linux natifs (LXC host dans mon readme) a une IP LAN en 192.X.Y.Z et un sous réseau 10.0.0.0/24 avec l'ip 10.0.0.254 sur une interface "dummy".
- le traffic IP est routé entre les LXC guests/host/LAN et quelques règles iptables permettent de rediriger le traffic de l'IP LAN vers les containers + autoriser certains traffics entre les containers + masquerading éventuel
Chaque container fait tourner son fail2ban, avec ses règles/jails à lui; mais les fail2ban (et les rsyslog) dans les containers sont configurés pour ne rien faire à part générer les logs de détection d'intrusion et renvoyer ces logs vers le Linux natif/host.
Le host fait lui aussi tourner fail2ban (qui, lui, ban vraiment) en parsant les logs du hosts, mais aussi les logs générés par les fail2ban des containers.
De cette façon, les règles fail2ban sont définies dans les containers (i.e. au même endroit que les services qui tournent/à surveiller); mais les actions sont exécutés par le host, qui est le seul à pouvoir vraiment bloquer le traffic des attaquants. Bien sur, pour les containers derrière un reverse proxy web (par exemple), il faut prendre soin de configurer le reverse/front et le backend pour que ce soit l'IP du client/attaquant qui apparaisse dans les logs du container backend, et non pas l'IP du reverse proxy.
readme perso, à adapter pour son besoin :
Je n'ai pas fini de le tester, il y a surement de petites coquilles qui trainent par-ci par-là :)
[^] # Re: fail2ban sur le host + rsyslog guests->host
Posté par ROUGEXIII . Évalué à 1.
Bonjour,
Merci pour ce retour complet!
La séparation en sous-réseaux c'est pour isoler les conteneurs qui n'ont pas à communiquer entres eux?
L'interface dummy cela sert à quoi? (Je n'en suis pas très loin dans mes lectures, j'essaye de comprendre cela pour l'instant : https://madovi.xyz/doku.php?id=services:virtu:tuto:lxc_tuto1)
L'idée d'avoir un fail2ban dans chaque conteneur dédié à celui-ci me plaît parce que c'est quand on conçoit un conteneur qu'on sait le mieux comment le protéger.
Niveau optimisation avec autant des services qui tournent cela ne génère pas trop d'écriture disque et/ou de consommation de ressource?
Il n'y a pas d'intérêt à mettre le fail2ban global qui coupe les accès dans un conteneur séparé?
[^] # Re: fail2ban sur le host + rsyslog guests->host
Posté par BiBite . Évalué à 1.
Hello,
Oui, exactement. Dans la plupart des tutos, les containers sont tous mis dans dans un même bridge (lxcbr0). Le problème, c'est qu'avec cette approche, il devient très difficile de contrôler le trafic entre les containers avec iptables/nftables.
J'ai donc préféré laisser chaque interface de chaque container (l'interface côté host) indépendante (i.e. hors quelconque bridge). Le host doit donc router les paquets, mais par contrôle exactement le trafic à autoriser/forwarder entre containers et l'interface LAN du serveur (192.168.3.21 dans ton schéma).
J'avais envie d'avoir une IP "fixe" sur le host qui ne dépend pas du serveur/contexte d'utilisation. Ca me permet d'avoir un README plus simple (toujours la même IP dans les README de config. des containers) et des règles iptables/nftables qui ne dépendent pas pas de l'IP LAN (en tout cas, en ce qui concernent les règles du trafic interne entre containers/host). Toujours concernant iptables/nftables, ça me permet aussi plus facilement d'exposer des services du host aux containers sans les exposer au LAN (comme le rsyslog du host qui reçoit les logs des fails2ban des containers par exemple).
J'ai donc une interface "dummy" (
ip link add $IFACENAME type dummy
sur le host) grâce à laquelle je peux donner une IP supplémentaire au host, toujours la même: 10.0.0.254. Le rsyslog du host n'écoute que sur cette IP par exemple.Bref, j'ai un autre README pour configurer la partie LXC host+containers que j'applique sur plusieurs serveurs. Cette IP 10.0.0.254 est une petite astuce que j'utilise pour me faciliter un peu les choses, mais ce n'est absolument pas nécessaire en soit :)
Oui, c'est l'idée: chaque container sait ce qu'il fait tourner et sait le mieux comment protéger ses services. Ça rend aussi les containers plus autonomes: pas besoin de modifier les règles fail2ban du host à chaque ajout/suppression/modification de container.
C'est vrai que fail2ban n'est pas un modèle de sobriété. Mais je ne vois pas pourquoi ça consommerait plus de ressources de répartir les règles dans plusieurs fail2ban par rapport à tout concentrer dans une seul; enfin sauf pour la RAM car effectivement fail2ban a forcément un coût fixe qui ne dépend pas du nombre de règles qu'il gère. De plus rsyslog est un très optimisé et très sobre.
Et enfin, les logs générés par les rsyslog des containers et parsé par le fail2ban du host sont vraiment très petits (1 entrée par "attaque") et ne nécessite qu'une expression régulière très simple. Donc le travail fait "en double" par le fail2ban du host n'est pas très méchant.
Si, probablement. Déjà, ça permettrai de protéger le host; surtout que fail2ban a besoin des droits root.
J'avais réfléchi à la question, mais je ne vois pas comment faire ça facilement:
- comment faire pour que ce fail2ban isolé puisse être au courant des "attaques" sur le host (ne serait-ce que pour le SSH qui tourne forcément, au moins, sur le host) ?
Ca n'aurait aucun intérêt à faire tourner un fail2ban comme sur les containers. Il serait forcément root pour avoir accès aux logs.
- comment faire pour que le fail2ban isolé puisse bloquer le trafic au niveau du host/autres containers ?
Le fail2ban isolé a son propre espace "network": les régles iptables/nftables ne s'appliquent qu'au container qui l’exécute et n'ont aucun effet sur le host/autres containers.
Je n'ai pas trouvé grand chose sur le sujet, mais je suis preneur de toutes les bonnes idées qui me permettraient de ne pas avoir de fail2ban sur le host :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.