Fail2ban – Bloquer les requetes phpmyAdmin w00tw00t et dos avec mod_evasive

Fail2Ban bloquer les requêtesFail2ban ou comment bloquer les requêtes phpmyAdmin w00tw00t et dos avec mod_evasive

Élément essentiel pour sécuriser son serveur, Fail2ban permet d’éviter des intrusions via force-brute. Il se charge d’analyser les logs des services installés et bannit automatiquement et pour une durée déterminée un hôte via iptables en cas d’échecs de connexion après X tentatives.

Installer Fail2ban:

sudo apt-get install fail2ban

Par défaut, Fail2ban propose déjà plusieurs filtres pré-configurés. On retrouve les filtres dans « /etc/fail2ban/filter.d/ ».
Le fichier de configuration où l’on peut spécifier pour chaque filtre le nombre d’essai avant le bannissement et le temps de bannissement, est: /etc/fail2ban/jail.conf

En plus des filtres existants, on peut ajouter des filtres pour se protéger des requêtes excessives sur phpmyadmin ainsi que bloquer les attaques w00tw00t (fruit d’un logiciel de scanning « DFind » utilisé par des kiddies) et DOS et autres, ici, nous verrons les 3 que je viens de citer.

1 – Fail2ban contre les attaques sur phpmyadmin
Créez un nouveau filtre dans « /etc/fail2ban/filter.d »

sudo nano /etc/fail2ban/filter.d/apache-phpmyadmin.conf

et copiez:

[Definition]
docroot = /var/www
badadmin = PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2|administrator|d$
failregex = [[]client <HOST>[]] File does not exist: %(docroot)s/(?:%(badadmin)s)
ignoreregex =

Et enregistrez.
Dans le fichier /etc/fail2ban/jail.conf ajoutez à la fin:

[apache-phpmyadmin]
enabled = true
port = http,https
filter = apache-phpmyadmin
logpath = /var/log/apache*/*error.log
maxretry = 3

2 – Fail2ban et protection contre les requêtes w00tw00t

 

sudo nano /etc/fail2ban/filter.d/apache-w00tw00t.conf

Copiez:

 

 

[Definition]
failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*
ignoreregex =

Dans /etc/fail2ban/jail.conf copiez:

 

 

[apache-w00tw00t]
enabled = true
port = 80,443
action = %(action_mwl)s
filter = apache-w00tw00t
logpath = /var/log/apache*/*error.log
maxretry = 1

3 – Fail2ban contre les DOS avec mod_evasive (source Linux magazine, hors-série N°66)
Installation mod_evasive

 

 

sudo apt-get install libapache2-mod-evasive

Créer un répertoire pour stocker les informations liées aux attaques et préciser les propriétés du répertoire.

 

 

sudo mkdir /var/log/apache2/mod_evasive
sudo chown www-data.www-data /var/log/apache2/mod_evasive

Configurer apache

 

 

sudo nano /etc/apache2/conf.d/evasive

et collez:

 

 

DOSHashTableSize 3097
# pas plus de 5 pages toutes les 2 secondes
DOSPageCount 5
DOSPageInterval 2
# Pas plus de 100 requête par seconde (image, CSS…)
DOSSiteCount 100
DOSSiteInterval 1
# Bloquer le client pendant 10 secondes
DOSBlockingPeriod 10
# Dossier contenantles IP blacklistées
DOSLogDir "/var/log/apache2/mod_evasive"

Puis recharger la configuration

 

 

sudo service apache2 reload

Créez le filtre

 

 

sudo nano /etc/fail2ban/filter.d/apache-modevasive.conf

copiez:

 

 

[Definition]
failregex = ^\[[^\]]*\]\s+\[error\]\s+\[client <HOST>\] client denied by server configuration:\s
ignoreregex =

Dans /etc/fail2ban/jail.conf copiez:

 

 

[apache-modevasive]
enabled = true
filter&nbsp; = apache-modevasive
action = iptables-allports[name=apache-modevasive]
logpath = /var/log/apache*/*error.log
bantime = 60
bantime = 3600
maxretry = 10

FIN.
Si vous avez d’autres suggestions ou améliorations, je suis preneur…

 

Kclean ou comment supprimer les anciens noyaux

kclean ou comment supprimer des anciens noyaux.pngComme tous les articles jusqu’à cette date, c’est encore du réchauffé, mais vous remarquerez à la version des noyaux que j’ai refait le test pour ce billet…

Lors des successives mises à jour, les nouveaux noyaux viennent s’installer et s’ajouter aux anciens. J’utilise au boulot une version Ubuntu LTS, le nombre de noyaux depuis avril 2010 commence sérieusement à prendre de la place.

Hoper m’a parlé de son script permettant d’éliminer proprement les anciens noyaux en toute simplicité, j’ai donc décidé de vous faire découvrir.

J’ai fait le choix de la faire en ligne de commande, mais on a la possibilité de le lancer en mode graphique.
Voyons la place que prend la totalité de mes noyaux:

$ sudo du -h /boot
[sudo] password for sima78:
/boot/grub/locale
4,4M
/boot/grub171M
/boot

Donc 171 Méga pour le répertoire /boot\r\n

Les options de la commande Kclean:

$ sudo ./kcleaner.sh -k
[sudo] password for sima78: 

Noyau actuellement en cours d'utilisation : 3.13.0-51
Par defaut, seul ce noyau est conserve. 

Ce script va tenter de trouver la version precedente du noyau pour la conserver.
Verifiez les informations fournies avant de valider la suppression.

La version precedemment installee (a conserver) est la version : 3.13.0-49
Les paquets suivants vont etre supprimes :

    linux-image-3.13.0-46-generic
    linux-image-3.13.0-48-generic
    linux-image-extra-3.13.0-46-generic
    linux-image-extra-3.13.0-48-generic
    linux-headers-3.13.0-46
    linux-headers-3.13.0-46-generic
    linux-headers-3.13.0-48
    linux-headers-3.13.0-48-generic

Cela devrait liberer environ 516 MiB d'espace disque

 Voulez vous indiquer manuellement des paquets à conserver ? [o/N] :n
 Voulez vous supprimer l'ensemble des paquets indiques ? [o/N] :o

 Suppression en cours :
(...) ---> là vous allez voir un tas ligne défiler, le travail va
           se lister jusqu'à arriver à:
 -------------- Suppression effectuee ---------------
$
$ sudo du -h /boot
48K    /boot/grub/locale
4,4M    /boot/grub
33M    /boot

171M – 33M = 138 méga supprimés et très proprement, car je suis en dualboot avec une version X -1 de ubuntu LTS et le script n’a pas touché aux lignes de lancement de la version X -1 dans le fichier Grub, mais a bien supprimé les autres.

En savoir plus et se procurer kclean.

Ajouter les coordonnées GPS dans EXIF avec exiv2

mettre les coordonnées gps dans exif avec exiv2.pngLinux, exiv2 et ajout des coordonnées GPS dans EXIF

Ajouter les coordonnées GPS à une photo en ligne de commande nécessiterai trois (3) lignes de commande, ce script peut simplifier la tâches.

Ici un petit script permettant de rentrer des coordonnées GPS dans les métadonnées EXIF dans une série de photos.

« exiv2 » doit être installé… sinon:

apt-get install exiv2

Ce script va vous poser quelques questions, bien entendu, il ne faut pas mettre les parenthèses…

Les questions qui vous seront posées:

  • Entrez l’extension de fichier en respectant la casse (jpg) (JPG) (RAW)… : Tapez JPG ou jpg ou RAW ,bref l’extension de votre série photos en respectant la casse, c’est-à-dire, en majuscules ou minuscules…
  • Entrez la latitude (N) ou (S) : N ou S Cela se transformera en North ou South sur les tags exif
  • Entrez la latitude sous forme ex (48/1 13/1 24/1) : Imaginons la latitude à rentrer est 48°, 13min et 24sec… vous devrez le saisir sous forme de 48/1 13/1 24/1 et cela donnera 48deg 13′ 24″ sur le tag exif.
  • Entrez la longitude (E) ou (O) : E ou O cela se transformera en East ou West
  • Entrez la longitude sous forme ex (9/1 52/1 51/1) : (même principe que pour la latitude).

Le sript:

#!/bin/bash
# Ajouter les données GPS aux métadonnées EXIF - Sima78
# Entrez vos données GPS sans les parenthèses... :-)"
echo -n "Entrez l'extention de fichier en respectant la casse (jpg) (JPG) (RAW)... : "
read form
echo -n "Entrez la latitude (N) ou (S) : "
read latref
echo -n "Entrez la latitude sous forme ex (48/1 13/1 24/1) : "
read lat
echo -n "Entrez la longitude (E) ou (O) : "
read longref
echo -n "Entrez la longitude sous forme ex (9/1 52/1 51/1) : "
read long
for i in *.$form
   do
      exiv2 -M"set Exif.GPSInfo.GPSLatitudeRef $latref" $i
      exiv2 -M"set Exif.GPSInfo.GPSLatitude $lat" $i
      exiv2 -M"set Exif.GPSInfo.GPSLongitudeRef $longref" $i
      exiv2 -M"set Exif.GPSInfo.GPSLongitude $long" $i
   done
echo "TERMINE"

Pour utiliser ce script, copiez-le dans votre éditeur texte favori et enregistrez sous… par exemple: ajout-gps-exif.sh

Le rendre exécutable par:

chmod +x ajout-gps-exif.sh

Le placer dans le dossier de vos clichés à modifier et le lancer par:

./ajout-gps-exif.sh

Pour voir le résultat:

exiv2 -pt votre_photo.JPG

Exemple de résultat:

(...)
Exif.GPSInfo.GPSLatitudeRef     Ascii    2  North
Exif.GPSInfo.GPSLatitude        Rational 3  48deg 13' 24" 
Exif.GPSInfo.GPSLongitudeRef    Ascii    2  East
Exif.GPSInfo.GPSLongitude       Rational 3  9deg 52' 51"

Ce script utilise une simple boucle (for, do, done) il est donc facile de l’enrichir avec d’autres champs complémentaires (copyright, auteur, commentaire, etc…)

Liste des champs possibles sur www.exiv2.org/tags.html

Renommer les photos sans utiliser les métadonnées Exif

Renommer les photos sans utiliser les métadonnées EXIFRenommer sans utiliser les métadonnées Exif.

De retour de vacances, il n’est pas rare de se retrouver avec répertoire contenant plus de 400 photos avec des noms de fichiers du genre:
dsc_0007.jpg
dsc_0009.jpg
dsc_0016.jpg

Or on souhaite que les noms soient plus explicites, genre «2010-07-vancances-numéro.jpg»

Faire des modifications une par une est fastidieux, c’est là qu’intervient la commande «sed»

On va utiliser une boucle «for, do, done», J’ai déjà donné les explications sur le billet « Initiation au shell boucle (for, do, done) » (la punition de mon fils).

Voici la ligne magique avec la commande «sed»:

for i in dsc_*; do mv $i `echo $i | sed "/^dsc_/s//2010-07-vacances-/"`; done

« dsc_ » sera remplacé par « 2010-07-vacances-« 

Ce qui donnera des noms de fichier du genre :

2010-07-vacances-0007.jpg
2010-07-vacances-0009.jpg
2010-07-vacances-0016.jpg

Pour éviter de retaper la ligne on peut faire un mini script:

#!/bin/bash
# renommer des photos dans le répertoire courant.
echo "Entrez ce que vous souhaitez remplacer, ex. dsc_, DSC ..."
echo "Gardez la numérotation finale des photos..."
echo -n "respectez les la casse, majuscules / Minuscules : "
read rempl
echo -n "Entrez ce que vous souhaitez voir à la place : "
read souhait
for i in "$rempl"*
do mv $i `echo $i | sed "/^"$rempl"/s//"$souhait"/"`
done
echo "TERMINE"

On va le nommer « renom-photos.sh »

Le rendre exécutable par:

chmod +x renom-photos.sh

Plaçons-le dans le répertoire courant et utilisons-le.
Voyons ce qu’il y a dans le répertoire courant.

$ ls -l
total 10764
-rwxr-xr-x 1 sima78 sima78 2231659 2010-06-13 16:07 DSC_0007.JPG
-rwxr-xr-x 1 sima78 sima78 2720329 2010-06-13 16:09 DSC_0009.JPG
-rwxr-xr-x 1 sima78 sima78 1996609 2010-06-18 15:04 DSC_0016.JPG
-rwxr-xr-x 1 sima78 sima78     383 2010-08-17 20:55 renom-photos.sh
-rwxr-xr-x 1 sima78 sima78 2036985 2010-06-18 15:03 souhait0015.JPG
-rwxr-xr-x 1 sima78 sima78 1996609 2010-06-18 15:04 souhait0016.JPG

On voit aussi le script qui se termine par .sh et je souhaite renommer mes photos DSC_*
Je lance le script et réponds au 2 questions…

$ ./renom-fotos.sh
Entrez ce que vous souhaitez remplacer, ex. dsc_, DSC ... (ici se serait DSC_)
Gardez la numérotation finale des photos...
respectez les la casse, majuscules / Minuscules : DSC_
Entrez ce que vous souhaitez voir à la place : 2010-07-vacances-
TERMINE

Voyons le résultat.

$ ls -l
total 10764
-rwxr-xr-x 1 sima78 sima78 2231659 2010-06-13 16:07 2010-07-vacances-0007.JPG
-rwxr-xr-x 1 sima78 sima78 2720329 2010-06-13 16:09 2010-07-vacances-0009.JPG
-rwxr-xr-x 1 sima78 sima78 1996609 2010-06-18 15:04 2010-07-vacances-0016.JPG
-rwxr-xr-x 1 sima78 sima78     383 2010-08-17 20:55 renom-fotos.sh
-rwxr-xr-x 1 sima78 sima78 2036985 2010-06-18 15:03 souhait0015.JPG
-rwxr-xr-x 1 sima78 sima78 1996609 2010-06-18 15:04 souhait0016.JPG
drwxr-xr-x 2 sima78 sima78    4096 2010-08-17 20:50 sous-photos

Il a donc bien modifier les fichiers commençant par « DSC_ »

Maintenant, tout ça peut être perfectionné… à vos shells.

Supprimer les espaces dans les noms de fichier

Supprimer les espace et accents des fichiers à la volée en ligne de commandeC’est toujours plus simple de travailler sur des fichiers n’ayant pas d’espace dans leur nom, alors voici un petit script qui permet de remplacer à la volée les espaces par des « _ ».

#!/bin/sh
# Suppression des blancs dans les noms des
# fichiers du répertoire courant et remplacement
# par des "_" factorisés.
# Mémoire à Jeanmm pour ce script.
for a in * ;do
b=$(echo "$a" | tr " " _ | tr --squeeze-repeats _ _ )
if [ "$a" != "$b" ] ; then
echo "mv \"$a\" $b"
mv "$a" $b
fi
done

On peut améliorer le script pour remplacer également les accents (é, è, à, ô, û; ù…)

D’une manière générale, il est préférable d’éviter les accents et espaces sur les noms de fichier, c’est un principe de base.
Rappel: on rend exécutable un script par un « chmod +x » et on le lance par un « ./nom_du_script« .

Base d’une boucle (for, do, done) et d’un script: Punition de mon fils

Initiation au shell boucle (for, do, done)

punition de mon fils - initiation à la ligne de commandeLa punition de mon fils.

J’avais prévenu, certains articles sentiront le réchauffé, celui date d’au moins environ 8 ans.

« Ton lit n’est pas encore fait!?… J’en ai assez! Tu vas me copier cent fois Je fais mon lit chaque matin. »

C’est ça l’autorité du père!

Une feuille m’arrive sous le nez, avec une seule ligne à l’encre noire:

for i in $(seq 100); do echo $i" Je fais mon lit chaque matin."; done;

Que dire?… La majuscule en début de phrase est respectée, le point final aussi et en plus, les lignes seront numérotées de 1 à 100.

Alors pour ne pas en rester là, je lui dis qu’une ligne de commande, c’est bien, mais un script aurait été mieux. Il faut bien avoir le dernier mot quand on est le père.

Introduction au script

Le signe « # » signifie que la ligne ou ce qui suit le « # » est un commentaire et donc ignoré par le Shell. Exception « #! » en effet « #! » (sans espace) signifie un préfixe au nom de l’exécutable qui va effectivement traiter les lignes qui le suivent. On l’appelle « shebang » et doit être la première ligne du script.

#!/bin/bash
# boucle basique avec for, do done
for i in $(seq 100)
do
echo $i" Je fais mon lit chaque matin."
done
echo "TERMINE"

Explications :
seq: affiche le nombre séquences allant de 1 au maximum indiqué.
for: cherche des éléments restants dans une liste ou ici dans une séquence de 1 à 100 (c’est-à-dire reste-t-il des chiffres à lire avant d’atteindre le maximum?), et attend donc une réponse à ce test.
Le code de retour est égal à 0 quand il est vrai (true) il est égal à 1 quand il est faux (false).
S’il renvoie « true » il met le nombre actuel dans la liste à la variable (« i » dans notre exemple) et exécute la partie entre do et done (écrit le chiffre « i » en cours et « Je fais mon lit chaque matin. »). Il vérifie de nouveau jusqu’au renvoie « false » qui signifie que les séquences sont terminées.
A « false », « for » arrête de boucler et passe à la ligne suivant « done« , l’instruction (echo « TERMINE »).
« echo » permet d’écrire à l’écran.

Vous allez me dire « Oui, mais la phrase peut être différente en fonction de la faute et le nombre de lignes peut varier en fonction de la gravité de la faute« .

Vous avez raison, il y a deux variables qu’il faut saisir, alors on peut rajouter:

#!/bin/bash
# boucle basique avec for, do done
echo -n "Entrez votre phrase de punition : "
read phrase
echo -n "Entrez le Nb de lignes : "
read lignes
for i in $(seq $lignes)
do
echo $i" $phrase"
done
echo "TERMINE"echo

Une fois le script enregistré (par exemple sous le nom : punition.sh), il suffit de le rendre exécutable puis le lancer, ce qui donne:

$ chmod +x punition.sh
$ ./punition.sh
Entrez votre phrase de punition : Je fais mon lit chaque matin.
Entrez le Nb de lignes : 5
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
TERMINE

Vous pouvez aussi avec « $RANDOM » choisir un nombre aléatoire de lignes.

$ echo $RANDOM

Cela renvoie un nombre aléatoire entre 0 et 32767, oui, mais avec un peu de chance, on peut donc tomber sur 0 ligne, c’est inacceptable comme punition.
Nous allons donc rajouter un « +1 ».
«Oui, mais 32767 semble exagéré!»
Alors prenons le nombre de lignes maximum « 150 », ce n’est pas trop sévère…
Et voici notre ligne:

$ echo $((RANDOM%150+1))

A vous de l’intégrer dans votre script.