Différences entre versions de « Proxmox fail2ban »
(Page créée avec « = Introduction = Proxmox utilise une interface web d'administration qui utilise le port TCP 8006 et c'est un vecteur possible d'attaque par force brut. Nous allons donc ''… ») |
|||
| Ligne 89 : | Ligne 89 : | ||
</pre> | </pre> | ||
Vous pouvez maintenant démarrer fail2ban | Vous pouvez maintenant démarrer fail2ban | ||
| + | |||
| + | = Proxification= | ||
| + | Lorsque votre serveur Proxmox se trouve derrière un reverse-proxy (Apache, Nginx, Traefik, ...), au niveau 3 OSI, l'adresse IP du client est remplacée par celle du proxy et le serveur utilse l'entêtes ''X-Forwarded-For'' ou ''X-Real-IP'' pour transporter l'adresse du client | ||
| + | [[Fichier:Reverse proxy proxmox.png|700px|centré]] | ||
| + | Le problème est que la seule adresse que fail2ban va voir apparaître dans les logs est celle du reverse-proxy (''192.168.4.100'') : | ||
| + | [[Fichier:Reverse proxy ip logs.png|600px|centré]] | ||
| + | == Configuration de pveproxy == | ||
| + | Si on veut voir l'adresse du client, il faut dire au [https://fr.wikipedia.org/wiki/Daemon_(informatique)| démon] ''pveproxy'' d'utiliser l'une des deux entêtes précédentes ainsi que préciser l'adresse du proxy. | ||
| + | |||
| + | Préciser l'adresse du proxy est essentiel pour que ''pveproxy'' n'accepte de lire l'adresse du client présente dans l'entête ''uniquement'' si cela provient du proxy, qui est une machine de confiance. Le cas contraire, tout le monde pourrais ajouter une adresse IP dans l'entête pour la faire bannir... | ||
| + | |||
| + | Nous allons créer le fichier ''/etc/default/pveproxy'' avec les lignes suivantes: | ||
| + | <pre> | ||
| + | PROXY_REAL_IP_HEADER="X-Forwarded-For" | ||
| + | PROXY_REAL_IP_HEADER="X-Real-IP" | ||
| + | PROXY_REAL_IP_ALLOW_FROM="192.168.4.100" | ||
| + | </pre> | ||
| + | Il faut maintenant redémarrer ''pveproxy'' pour que les changements s'appliquent. Si vous êtes connecté via l'interface web, cela va vous déconnecter, le temps que le démon redémarre, il faudra ensuite certainement rafraîchir la page web. | ||
| + | <pre> | ||
| + | # systemctl restart pveproxy | ||
| + | </pre> | ||
| + | Il ne reste plus qu'a vérifier dans les logs si les bonnes adresses s'affichent: | ||
| + | <pre> | ||
| + | # tail -f /var/log/pveproxy/access.log | ||
| + | </pre> | ||
| + | Si jamais ce n'est pas le cas, poursuivez avec la modification du fichier ''AnyEvent.pm'' | ||
| + | == Modification de AnyEvent.pm == | ||
| + | Au jours d'aujourd'hui (13/12/25) la proxification ne fonctionne plus et il faut apporter une modification dans le fichier ''/usr/share/perl5/PVE/APIServer/AnyEvent.pm'' pour que les bonnes adresses apparaissent ! | ||
| + | En fonction des versions cette modifications peut avoir lieu soit ligne '''1504''', soit ligne '''1554'''. | ||
| + | |||
| + | Il faut repérer la fonction suivante: | ||
| + | <source lang=perl> | ||
| + | sub authenticate_and_handle_request { | ||
| + | my ($self, $reqstate) = @_; | ||
| + | |||
| + | my $request = $reqstate->{request}; | ||
| + | my $method = $request->method(); | ||
| + | |||
| + | ... | ||
| + | </source> | ||
| + | C'est un peu plus loin qu'il faut insérer le code : | ||
| + | <source lang=perl> | ||
| + | } | ||
| + | } | ||
| + | |||
| + | ### INSERTION ICI ### | ||
| + | |||
| + | if ($request->header('X-Forwarded-For')) { | ||
| + | $reqstate->{peer_host} = $request->header('X-Forwarded-For'); | ||
| + | } | ||
| + | |||
| + | if ($self->{spiceproxy}) { | ||
| + | my $connect_str = $request->header('Host'); | ||
| + | |||
| + | </source> | ||
Version du 13 décembre 2025 à 18:43
Introduction
Proxmox utilise une interface web d'administration qui utilise le port TCP 8006 et c'est un vecteur possible d'attaque par force brut. Nous allons donc dresser fail2ban pour agir en cas d'attaque !
Proxmox utilise Debian, nous allons principalement reproduire les étapes décrites dans le tutoriel de Fail2ban pour Rocky et adapter à Debian.
Avant d'aller plus loin, assurez-vous d'avoir correctement installé et configuré iptables sur Proxmox
Installation
# apt -y install fail2ban
Configuration
Tout d'abord il faut copier le fichier /etc/fail2ban/jail.conf en /etc/fail2ban/jail.local
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Dans ce fichier, on va s'intéresser aux variables suivantes:
- ignoreip : correspond à la suite d'adresses IP qui ne se feront jamais bannir;
- maxretry : correspond au nombre d'essais;
- findtime : correspond à la période pendant laquelle les essais vont incrémenter maxretry;
- bantime : correspond au temps ou l'adresse IP ne peut pas se connecter.
Configuration de base
Choix de la punition
Il faut choisir quelque chose de cohérent (une punition suffisante) pour ne pas permettre de se faire cracker son mot de passe:
- maxretry = 3
- findtime = 86400 (correspond à 1 journée)
- bantime = 604800 (correspond à 1 semaine)
Cela signifie que si une adresse IP se trompe 3 fois en 1 journée (86400s) elle se fait bannir pendant 1 semaine (604800s).
Un rapide calcule permet de trouver le nombre maximal de tentative durant une année:
365 jours / 7 jours par semaine * 3 tentatives = 156 essais, ce qui reste raisonnable.
Si le pirate possède un botnet, il faut bien sûr multiplier ce nombre par le nombre de machines dans le botnet...
Attention : fail2ban parcours les logs de connexion pour connaître le numéro de la tentative, ce qui a pour conséquence, si le findtime est grand, de prendre un certain temps...
Jail pour SSH
Il suffit d'ajouter la ligne enabled=true dans la section à activer !
[sshd] # To use more aggressive sshd modes set filter parameter "mode" in jail.local: # normal (default), ddos, extra or aggressive (combines all). # See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details. #mode = normal enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s
Configuration spécifique
Jail pour PVEPROXY
Pveproxy écoute sur le port 8006 et ne fonctionne pas exactement comme un serveur Apache httpd qui mettrait ces logs dans le fichier error_log.
Nous allons mettre cette configuration spécifique dans le fichier /etc/fail2ban/jail.d/proxmox.conf :
[proxmox] enabled = true port = https,http,8006 filter = proxmox backend = systemd maxretry = 3 findtime = 2d bantime = 1h
Le backend utilisé est systemd, exactement comme si vous utilisiez la commande :
# journalctl -fu pvedaemon
Filtre pour PVEPROXY
Il ne nous reste plus qu'a spécifier le filtre proxmox dans le fichier /etc/fail2ban/filter.d/proxmox.conf :
[Definition] failregex = pvedaemon\[.*authentication failure; rhost=<HOST> user=.* msg=.* ignoreregex = journalmatch = _SYSTEMD_UNIT=pvedaemon.service
Démarrage et enregistrement dans le chargeur de démarrage
# systemctl start fail2ban.service # systemctl enable fail2ban.service
Vous pouvez maintenant démarrer fail2ban
Proxification
Lorsque votre serveur Proxmox se trouve derrière un reverse-proxy (Apache, Nginx, Traefik, ...), au niveau 3 OSI, l'adresse IP du client est remplacée par celle du proxy et le serveur utilse l'entêtes X-Forwarded-For ou X-Real-IP pour transporter l'adresse du client
Le problème est que la seule adresse que fail2ban va voir apparaître dans les logs est celle du reverse-proxy (192.168.4.100) :
Configuration de pveproxy
Si on veut voir l'adresse du client, il faut dire au démon pveproxy d'utiliser l'une des deux entêtes précédentes ainsi que préciser l'adresse du proxy.
Préciser l'adresse du proxy est essentiel pour que pveproxy n'accepte de lire l'adresse du client présente dans l'entête uniquement si cela provient du proxy, qui est une machine de confiance. Le cas contraire, tout le monde pourrais ajouter une adresse IP dans l'entête pour la faire bannir...
Nous allons créer le fichier /etc/default/pveproxy avec les lignes suivantes:
PROXY_REAL_IP_HEADER="X-Forwarded-For" PROXY_REAL_IP_HEADER="X-Real-IP" PROXY_REAL_IP_ALLOW_FROM="192.168.4.100"
Il faut maintenant redémarrer pveproxy pour que les changements s'appliquent. Si vous êtes connecté via l'interface web, cela va vous déconnecter, le temps que le démon redémarre, il faudra ensuite certainement rafraîchir la page web.
# systemctl restart pveproxy
Il ne reste plus qu'a vérifier dans les logs si les bonnes adresses s'affichent:
# tail -f /var/log/pveproxy/access.log
Si jamais ce n'est pas le cas, poursuivez avec la modification du fichier AnyEvent.pm
Modification de AnyEvent.pm
Au jours d'aujourd'hui (13/12/25) la proxification ne fonctionne plus et il faut apporter une modification dans le fichier /usr/share/perl5/PVE/APIServer/AnyEvent.pm pour que les bonnes adresses apparaissent ! En fonction des versions cette modifications peut avoir lieu soit ligne 1504, soit ligne 1554.
Il faut repérer la fonction suivante:
sub authenticate_and_handle_request {
my ($self, $reqstate) = @_;
my $request = $reqstate->{request};
my $method = $request->method();
...
C'est un peu plus loin qu'il faut insérer le code :
}
}
### INSERTION ICI ###
if ($request->header('X-Forwarded-For')) {
$reqstate->{peer_host} = $request->header('X-Forwarded-For');
}
if ($self->{spiceproxy}) {
my $connect_str = $request->header('Host');