La Fibre

Télécom => Logiciels et systèmes d'exploitation => Ubuntu Tutoriels pour Ubuntu server => Discussion démarrée par: vivien le 04 juillet 2026 à 15:36:16

Titre: Script pour analyser le top 100 des IP des logs Apache
Posté par: vivien le 04 juillet 2026 à 15:36:16
Script pour analyser le top 100 des IP des logs Apache

Cela fait partie de la base : Analyser les logs.

Le script ci-dessous permet d'identifier les 100 adresses qui font le plus de requêtes et d'afficher le user-agent associé.

C'est un script particulièrement optimisé pour sa vitesse d'exécution : tout est fait en une seule passe. Le corollaire, c'est qu'il faut stocker des informations en RAM.
Toutefois, on ne dépasse pas 500 Mo de RAM utilisé pour l'analyse d'un fichier de 4 Go, soit 20 millions de requêtes.

Éditer le fichier top100-ip.sh :

nano top100-ip.sh

#!/bin/bash
# 1. Vérification qu'un argument a bien été passé
if [ -z "$1" ]; then
    echo "Usage: $0 <fichier de log Apache à analyser>"
    echo "Exemple: $0 /var/log/apache2/access.log""
    exit 1
fi

# 2. Vérification de l'existence du fichier
if [ ! -f "$1" ]; then
    echo "Erreur : Le fichier '$LOG_FILE' est introuvable."
    echo "Usage : $0 [chemin_vers_le_fichier_log]"
    exit 1
fi

LOG_FILE=$1

echo "Analyse des 100 IP les plus actives dans : $LOG_FILE"
echo "---------------------------------------------------------------------------------------------------"
printf "%-10s | %-15s | %s\n" "Requêtes" "Adresse IP" "Premier User-Agent"
echo "---------------------------------------------------------------------------------------------------"

# 3. Analyse en une seule passe avec awk
awk -F'"' '
{
    # Dans awk avec -F"\"" , $1 contient toute la ligne jusqu au premier guillemet
    # On découpe ce $1 avec des espaces pour récupérer le premier mot (l adresse IP)
    split($1, parts, " ")
    ip = parts[1]

    # Si la ligne n est pas vide et qu une IP est trouvée
    if (ip != "") {
        # On incrémente le compteur pour cette IP
        count[ip]++

        # Si cest la première occurrence chronologique de cette IP, on mémorise le 6ème champ (User-Agent)
        if (count[ip] == 1) {
            ua[ip] = $6
        }
    }
}
END {
    # À la fin de la lecture, on affiche les résultats sous la forme : "compte IP user-agent"
    for (i in count) {
        printf "%d %s %s\n", count[i], i, ua[i]
    }
}' "$LOG_FILE" | sort -rn | head -n 100 | while read c ip agent; do
    # Formatage propre en colonnes (read assigne le reste de la ligne à la variable "agent")
    printf "%-10s | %-15s | %s\n" "$c" "$ip" "$agent"
done

Rendre le script exécutable : chmod +x top100-ip.sh

Mon script fonctionne avec les logs par défaut, mais également ceux avec le port source et la version de TLS que je recommande ci-dessous :


4/ Recommandation BCP-162 / RFC6302 : Rajouter le port source dans les log d'Apache2

cf BCP-162: logs, CGNat et cybercriminalité (https://lafibre.info/tcpip/bcp-162-logs-cgnat-et-cybercriminalite/)
nano /etc/apache2/conf-available/log-personnalise.conf : Création d'une configuration de log qui inclue le port source, appelé "combiport"

Copier / coller le texte ci-dessous dans le fichier :
# Customized log with display of TCP source port (%{remote}p) and the SSL protocol version (TLSv1.2, TLSv1.3) for https or "-" for http (%{SSL_PROTOCOL}x)
LogFormat "%h %{remote}p %{SSL_PROTOCOL}x %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combiport

a2enconf log-personnalise : Activation du fichier mis en place (il faut touefois appeler "combiport" lors du log)
sed -i -e "s/CustomLog \${APACHE_LOG_DIR}\/other_vhosts_access.log vhost_combined/CustomLog \${APACHE_LOG_DIR}\/other_vhosts_access.log vhost_combined/g" /etc/apache2/conf-available/other-vhosts-access-log.conf : configuration "combiport" pour ce fichier de log.

Exemple de log générés :

192.168.2.2 51020 - [10/May/2022:10:31:15 +0000] "GET /250Mi.iso HTTP/1.1" 200 262144279 "-" "curl/7.81.0"
192.168.2.2 40994 TLSv1.3 [10/May/2022:10:31:19 +0000] "GET /250Mi.iso HTTP/1.1" 200 262870026 "-" "curl/7.81.0"
192.168.2.2 40996 TLSv1.3 [10/May/2022:10:31:22 +0000] "GET /250Mi.iso HTTP/2.0" 200 262144209 "-" "curl/7.81.0"
192.168.1.3 50514 TLSv1.3 [10/May/2022:10:46:52 +0000] "GET / HTTP/2.0" 200 2078 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0"
Le port destination n'est pas présent dans les logs, mais on le récupère avec la version du protocole SSL. 3 cas sont possibles :
  • - : c'est du http (donc le port 80)
  • TLSv1.2 : c'est du https (donc le port 443)
  • TLSv1.3 : c'est du https (donc le port 443)
La version du protocole SSL peut aider à séparer les requêtes inhabituelles de celles émanent de navigateurs web, tous avec TLS1.3 aujourd'hui.
Titre: Script pour analyser le top 100 des IP des logs Apache
Posté par: vivien le 04 juillet 2026 à 15:45:03
Pour lancer le script, il suffit de mettre en argument le fichier de log à analyser.

Par exemple : ./top100-ip.sh /var/log/apache2/access.log

Voici ce que cela donne sur ce forum, sur les logs du 3 juillet 2026 :


(cliquer sur l'image pour zoomer)
(https://lafibre.info/images/stats/202607_stats_lafibre_top_requetes_par_ip_avec_user-agent.webp) (https://lafibre.info/images/stats/202607_stats_lafibre_top_requetes_par_ip_avec_user-agent.webp)

Uniquement des IPv4, pourtant le site écoute bien en IPv6, mais les IP qui sollicitent le plus Apache sont dans mon cas toutes des IPv4.

La première IP, c'est clairement du déni de service, qui est depuis bloquée.
Les deux IP suivantes sont les robots pour faire fonctionner les IA ChatGPT et Claude.
On a ensuite plusieurs IP d'un prétendu user-agent SleepBot qui va être bloqué.

Attention à bien vérifier que l'IP est cohérent avec le user agent affiché : il est possible qu'une personne mal intentionnée affiche un user-agent qui n'est pas le bon.