ProFTPd, Fail2ban, locales

linux

Fail2Ban, qu’on ne présente plus, est un outil bien utile.
Encore faut-il que les regex soit bien configurées, et que les services (tels que ProFTPd) sortent un log qui est interprétable par ProFTPd.

Il m’est arrivé de détecter que fail2ban ne faisait pas bien son job avec proftpd.
En effet, un log comme suit :

déc. 08 04:26:16 xxx.sn4ky.net proftpd[20043] 127.0.0.1 (174.133.xxx.xxx[174.133.xxx.xxx]): USER Administrator: no such user found from 174.133.xxx.xxx [174.133.xxx.xxx] to 217.174.xxx.xxx:21

n’est pas correctement interprété par fail2ban (fail2ban ne parvient pas à « lire » le format de la date – date dont il se sert afin de déterminer la fréquence des tentatives de connexions).

Ceci n’est pas un problème d’une regex mal configurée, comme on peut le voir en utilisant l’outil fail2ban-regex (qui permet de valider le bon fonctionnement d’un filtre dans /etc/filter.d/profptd.conf) :

fail2ban-regex /var/log/proftpd/proftpd.logbak /etc/fail2ban/filter.d/proftpd.conf
Found a match for 'd xxx.sn4ky.net proftpd[20043] 127.0.0.1 (174.133.xxx.xxx[174.133.xxx.xxx]): USER Administrator: no such user found from 174.133.xxx.xxx[174.133.xxx.xxx] to 217.174.xxx.xxx:21
' but no valid date/time found for 'éc. 08 04:26:16'. Please contact the author in order to get support for this format

Il apparaît que le démon proftpd démarre en utilisant la valeur de la variable d’environnement LANG, définie par la locale par défaut utilisée sur le système au moment du démarrage de celui-ci :

# echo $LANG
fr_FR@euro

Une solution permet de contourner ce problème, modifier les locales afin d’utiliser un environnement en Anglais, qui serai reconnu correctement par proftpd.
MAIS, je n’aime pas trop cette solution (bien qu’efficace, changer sa locale par défaut peut parfois causer des soucis).

Une autre solution, beaucoup plus « soft » m’es venue à l’esprit :
On va tout d’abord ajouter une locale à notre système :

# dpkg-reconfigure locales

(on va ajouter une locale en anglais, par exemple en_US.UTF-8 – universelle en plus)
On ne change pas la locale par défaut, par contre, on va éditer le fichier /etc/default/proftpd.conf et y rajouter la ligne suivante :

export LANG=en_US.UTF-8

Par la suite, il ne reste plus qu’à redémarrer proftpd, puis constater, dans les logs :

déc. 10 01:50:32 xxx.sn4ky.net proftpd[8594] 127.0.0.1: ProFTPD 1.3.3a standalone mode SHUTDOWN
Dec 10 01:50:34 xxx.sn4ky.net proftpd[9237] 127.0.0.1: ProFTPD 1.3.3a (maint) (built Sun Nov 13 2011 22:40:44 UTC) standalone mode STARTUP

Miracle ! le format de sortie du log a changé !
Et cette fois, il est lisible par Fail2ban (un fail2ban-regex pour s’en convaincre, après avoir fait un petit coup de sed -i.bak 's/déc\./Dec/g' /var/log/proftpd/proftpd.log pour s’en convaincre.

En espérant en avoir dépanné plus d’un.

Droits d’écriture par listes de contrôle d’accès (ACL)

linux

Si vous hébergez plusieurs sites web sur un seul et même serveur dédié, vous avez probablement dû être confrontés à ce problème :
Apache ne peut écrire dans un répertoire utilisateur (sauf permissions folkloriques 777 ou lancer le démon httpd en root:root…)

Pour cela, on va utiliser ce qu’on appelle les ACL, les listes de contrôle d’accès.

Avec votre gestionnaire de package préféré, installer les utilitaires fournis par le paquet « acl »

aptitude install acl

Remontez la partition que vous souhaitez contrôler avec les ACL, avec l’option adéquate :

mount -o remount,acl /home

Dans le fstab, rajouter l’option ‘acl’ au point de montage
Par exemple :

cat /etc/fstab
/dev/sdb    /home    ext3    defaults,acl        0       2

Pour finir, appliquez les ACL sur le ou les répertoires concernés !

setfacl -R -m u:sn4ky:rwX,u:www-data:rwX,d:u:sn4ky:rwX,d:u:www-data:rwX,g::r-X,o::r-X,d:g::r-X,d:o::r-X,m::rwX,d:m::rwX /home/sn4ky/public_html/blog/wp-content/

Explications :

  • setfacl : le programme (installé avec acl)
  • -R : récursif
  • -m : modifier (ou créer) une ACL
  • u:sn4ky:rwx : défini que l’utilisateur sn4ky (moi) a les droits rwx sur les fichiers et dossiers existants
  • u:www-data:rwx : défini que l’utilisateur www-data (Apache) a les droits rwx sur les fichiers et dossiers existants
  • d:sn4ky:rwx : défini les droits rwx sur tout fichier ou dossier nouvellement créé après la mise en place de l’ACL (default)
  • d:www-data:rwx : idem
  • m::rwx : masque a appliquer sur tous fichiers et dossiers courants
  • d:m::rwX : masque a appliquer pour toute future création de fichiers ou de dossiers
  • g::—,o::— respectivement pour group et other

n.b. : le flag X indique : excécution uniquement si l’objet est un répertoire ou s’il y a déjà les droits d’exécution pour d’autre utilisateurs (manpage : execute only if the file is a directory or already has execute permission for some user)

htaccess dans répertoire virtuel

htaccess

On connaît tous les méthodes pour appliquer une ou plusieurs règles de htaccess à un ou plusieurs répertoire (avec Directory), mais comment faire lorsque l’URL demandée par le navigateur est un virtuel (genre une alias ou de l’url rewriting) ?

La réponse avec un exemple :

<location ~ "/(repertoire1|repertoire2)/.*">
	Order Deny,Allow
	Deny from all
	allow from 91.121.12.183
</location>

Alors après, vous pouvez jouer de fantaisies diverses et variées pour subvenir a vos besoins.

Désactiver l’attente sur l’installation d’un module Firefox

firefox

Il est parfois très lourd d’attendre 4 secondes à chaque fois que vous voulez installer un module pour Firefox avec son message : « N’installez que des modules complémentaires dont les auteurs ont votre confiance ».

Read more »

find -delete avant ou après sur Linux ?

find

Pour faire une suppression avec la commande « find » sous linux, il y a une fonction très pratique, elle se nomme -delete. Suivant la documentation du man entre debian et ubuntu, il peut y avoir une très grosse erreur.

Read more »

mysqldump en mode silencieux

mysqldump

mysqldump permet de sauvegarder en masse vos bases de données, le souci avec mysqldump, c’est qu’il écrit gentiment ce qu’il fait, et donc à chaque sauvegarde, on reçoit souvent un mail pour nous expliquant ce que mysqldump vient de faire. Malheureusement, il n’existe pas encore de commande magique comme –silent pour faire taire mysqldump…

Nous allons voir ensemble comment exporter une base mysql et ensuite de la GZIP sans que mysqldump nous harcèle avec un mail pour nous dire tout ce qu’il vient de faire.

/usr/bin/mysqldump --lock-tables -v -h localhost -u root--password=1234 MABDD 2> /dev/null | /bin/gzip > /MONREP/backup_sql_20101129.sql.gz

Aide :
-u root : remplacer root par votre utilisateur
–password=1234 : remplacer 1234 par votre mot de passe
MABDD : remplacer MABDD par la base que vous souhaitez sauvegarder
>2 /dev/null : Sert à rediriger un contenu dont on a pas besoin, et qui ne doit pas être sauvegardé ni affiché à l’écran.
MONREP : remplacer MONREP par la destination où vous souhaitez sauvegarder votre base.

Et voilà, pas de mail, le résultat de mysql tombe directement dans /dev/null.

Renommer plusieurs fichiers

linux

Voici comment faire pour renommer tout ces fichiers JPG en fichiers jpg (quand on a pas de Windows et de TheRenameProgram sous la main)

rename 's/\.JPG$/\.jpg/g' *.JPG

et de manière générale, pour passer le nom de ses fichiers en minuscule :

rename 'y/A-Z/a-z/' *

Supprimer les caractères accentués et les espaces dans le noms de vos fichiers :

find -type f -execdir rename 'y/éèêàâôî /eeeaaoi_/' {} \;

Supprimer des caractères en fin de ligne

linux

Voici comment faire pour supprimer un certain nombre de caractères (3 dans notre cas) à la fin d’une ligne :

message="taratata voici un message bien long"
echo ${message:0:`echo $(( ${#message} - 3 ))`}

Ici voici ce que l’on opère :

${#message}

Calcule la taille de la chaine

echo $(( ${#message} - 3 ))

retourne la taille de la chaine soustrait de 3

echo ${message:0:`echo $(( ${#message} - 3 ))`}

retourne la chaine depuis le premier caractère (0) jusqu’au nombre calculé avant.

Rechercher les liens symboliques erronés

linux

Une petite astuce qui vous permettra de rechercher tous les liens symboliques erronés de votre machine. Très pratique quand il y a des liens dans 1000 sous-répertoires un peu partout dans la machine.

find / -type l | perl -lne 'print if ! -e'

Juste après le find vous avez un « / ». Mettez le répertoire que vous voulez scanner.