Purge_IP/purge-ip_v4.bash

67 lines
3.2 KiB
Bash

#!/bin/bash
# Installez le paquet geoip-bin pour gélocaliser les IP
# Variables
PAYS_CIBLES=("FR" "CH") # Utiliser le code pays en deux lettres. Si plusieurs pays, mettre le pays entre " " et séparer les occurences par un espace.
GEOIP_COUNTRYv4="/usr/share/GeoIP/GeoIP.dat" # Necessite de télécharger régulièrement la database GeoIP. Voir https://forum.yunohost.org/t/tuto-bloquer-les-requetes-selon-le-pays/9947
AUTH_IP=($(grep "invalid" /var/log/auth.log* | grep -Po "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq | sort -n)) # Tentatives d'authentification. Supprimez * pour ne scanner que le dernier fichier de log.
CONNECT_IP=($(grep "CONNECT" /var/log/nginx/access.log* | grep -Po "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq | sort -n)) # Connection attempts using mod_proxy. Supprimez * pour ne scanner que le dernier fichier de log.
F2B_SSHD=$(fail2ban-client status sshd | grep -Po "([0-9]{1,3}\.){3}[0-9]{1,3}") # Liste IP dans la jail sshd
F2B_YUNO=$(fail2ban-client status yunohost | grep -Po "([0-9]{1,3}\.){3}[0-9]{1,3}") # Liste IP dans la jail yunohost
LOG="/var/www/dokuwiki/data/pages/purge_ip.txt" # Laisser vide si on ne veut pas alimenter de log
LOG_TOKEN=FALSE # Sert à fermer le fichier LOG si on écrit en mode <file></file>
function fonction_ban { # Fonction pour le bannissement des IP
if [[ $(echo "$F2B_LISTE_IP" | grep "$ip") == "" ]]; then # Si IP non présente dans la jail
fail2ban-client set "$JAIL" banip $ip >/dev/null 2>&1 # On banni l'IP
fonction_log
fi
}
function fonction_log { # Fonction pour le logging
if [[ "$LOG" != "" ]]; then
if [[ "$LOG_TOKEN" == "FALSE" ]]; then
sed -i 's/<\/file>//g' $LOG
LOG_TOKEN=TRUE
DATE=$(date "+%Y/%m/%d") # Date du jour au format YYYY/MM/DD
fi
IP_COUNTRY=$(echo "$GEO_IP" | cut -d ':' -f2) # On récupère uniquement le code pays + le pays
NB_SPACES=$((15-$((`expr length $ip`)))) # Calcul du nombre d'espace à ajouter pour bien aligner les pays dans le log
ALIGNEMENT=$( printf "%${NB_SPACES}s" '' )
echo -e "$DATE - $LOG_TYPE - $ip $ALIGNEMENT- $IP_COUNTRY" >> $LOG # On inscrit l'IP dans le fichier de LOG
fi
}
# Boucle sur les tentatives SSH
for ip in "${AUTH_IP[@]}" # On boucle sur les IP qui ressortent de /var/log/auth.log*
do
GEO_IP=$(geoiplookup -f "$GEOIP_COUNTRYv4" "$ip") # On sort les infos GeoIP
LOG_TYPE="AUTHENT" # Mot à inscrire dans la log
F2B_LISTE_IP="$F2B_SSHD" # Liste IP dans la jail
JAIL="sshd" # Jail à utiliser pour fail2ban
for pays in "${PAYS_CIBLES[@]}"
do
if [[ $(echo "$GEO_IP" | grep "$pays") == "" ]]; then # Test GeoIP pour ne pas se mettre dehors à cause d'une faute de typo :)
fonction_ban
fi
done
done
# Boucle sur les mod-proxy
for ip in "${CONNECT_IP[@]}" # On boucle sur les IP qui ressortent de /var/log/nginx/access.log*
do
GEO_IP=$(geoiplookup -f "$GEOIP_COUNTRYv4" "$ip") # On sort les infos GeoIP
LOG_TYPE="CONNECT" # Mot à inscrire dans la log
F2B_LISTE_IP="$F2B_YUNO" # Liste IP dans la jail
JAIL="yunohost" # Jail à utiliser pour fail2ban
fonction_ban
done
if [[ "$LOG_TOKEN" == "TRUE" ]]; then
DER_LIGNE="$(tail -1 $LOG)" # On récupère la dernière ligne du fichier de log
sed -i '$ d' $LOG # On la supprime
echo -e "$DER_LIGNE</file>" >> $LOG # On la réécrit en ajoutant la balise </file>
fi
exit 0