Installation et configuration du mod_security pour apache2 sous Debian

Adminstration Server Linux, Debian, Sécurité 14 Comments »

Le module Security est une sorte de firewall pour Apache qui apporte une solution aux problèmes de sécurité et d’attaques applicatives web. En effet, malgrés le déploiement de mesures de sécurité élevées sur un serveur web, il est toujours possible qu’une simple erreur de programmation dans un script « cgi » ou « php » mette en péril l’intégrité et la confidentialité des données stockées.
Pour faire simple ce module bloque les requêtes pouvant être dangereuses.
Exemple en image :

modsecurity

Installation.

Ce module n’est pas installé de base avec Apache, je vais vous proposer deux méthodes à vous de choisir la votre :
L’installation par la commande dpkg est très simple, wget doit être installé sur votre système.

wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/mod-security-common_2.5.9-1_all.deb
wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/libapache-mod-security_2.5.9-1_i386.deb

Installation du paquet :

dpkg -i mod-security-common_2.5.9-1_all.deb libapache-mod-security_2.5.9-1_i386.deb

Voila le module est installé. Maintenant on active ce dernier auprès d’Apache.

 a2enmod mod-security

L’installation du module Security est terminée

Configuration

La configuration du module Security consiste dans sa plus grande partie à ajouter des règles “de filtrage”.
Ces règles sont séparées en plusieurs fichiers (blacklist, proxy, règles de bases, rootkits, etc…).
On créé un répertoire modsecurity2 dans le répertoire /etc/apache2/, on se place dedans et on télécharge les règles.

mkdir /etc/apache2/modsecurity2/
cd /etc/apache2/modsecurity2/
wget http://www.gotroot.com/downloads/ftp/mod_security/2.0/apache2/apache2-gotrootrules-modsec2.0-latest.tar.gz

Une fois le téléchargement terminé nous allons décompresser l’archive contenant les règles.

tar zxvf apache2-gotrootrules-modsec2.0-latest.tar.gz

Puis créez un fichiers nommé mod_security pour y ajouter les lignes suivantes :

vi /etc/apache2/conf.d/mod_security
# A adapter en fonction de la version du module qui est utilisé.


# Analyse uniquement les requêtes dynamiques.
#SecFilterEngine DynamicOnly

# Active le filtrage.
SecFilterEngine On

# Rejette les requêtes ayant le status 500.
SecFilterDefaultAction "deny,log,status:500"

# Quelques règles de bases.
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckCookieFormat On
SecFilterCheckUnicodeEncoding Off
SecFilterNormalizeCookies On
# Active la version 1 (RFC 2965) cookies
SecFilterCookieFormat 1

# Ne donne aucune précision sur le serveur web.
SecServerResponseToken Off

# Scanner le flux de sortie.
#SecFilterScanOutput On
#SecFilterOutputMimeTypes "(null) text/html text/plain"

# Autorise presques toutes les valeurs de bytes.
SecFilterForceByteRange 1 255

# Masquer le serveur.
#fake server banner - NOYB used - no one needs to know what we are using
SecServerSignature "NOYB"

#SecUploadDir /tmp
#SecUploadKeepFiles Off

# Only record the interesting stuff
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log

# Configuration du module de debuggage.
SecFilterDebugLevel 0
SecFilterDebugLog /var/logs/apache2/modsec_debug_log

# Règles d'exlusion.
# Cette ligne doit rester devant les autres.
Include /etc/apache2/modsecurity2/exclude.conf

# Règles de protections.
Include /etc/apache2/modsecurity2/rules.conf

# Règles dédiées au spam.
Include /etc/apache2/modsecurity2/blacklist.conf

# Règles de filtrage des hotes, proxy, etc...
Include /etc/apache2/modsecurity2/blacklist2.conf

# Règles interdisant certains client, robots, etc...
Include /etc/apache2/modsecurity2/useragents.conf

# Protection contre les rootkits.
Include /etc/apache2/modsecurity2/rootkits.conf

# Règle empéchant l'utilisation du serveur comme proxy.
# A utiliser seulement si le serveur n'est pas en mod proxy.
Include /etc/apache2/modsecurity2/proxy.conf

# Quelques règles de plus, uniquement pour Apache2.
Include /etc/apache2/modsecurity2/apache2-rules.conf

La configuration du module est terminé, il ne reste plus qu’a relancer Apache.

/etc/init.d/apache2 restart

Mise à jour des règles.

Un script a été conçu pour permettre le téléchargement des nouvelles règles automatiquement.
Cette méthode nécessite l’ajout d’une tâche dans votre crontab.

Dans le répertoire /etc/cron.d/ nous allons créer un fichier modsecurity contenant ceci :

vi /etc/cron.d/modsecurity
# Tout les jours à 5h30 du matin.
30 5 * * * /etc/apache2/modsecurity2/modsec.sh

Ce script bash a été adapté pour une distribution Debian, il aura pour nom modsec.sh et sera placé dans /etc/apache2/modsecurity2/

vi /etc/apache2/modsecurity2/modsec.sh
#!/bin/sh

# Autoupdater for modsec rulesets.
 #
 # This script will attempt to update your rulefiles, and restart apache.
 # If it apache does not start after changing rules, it will roll back to
 # the old ruleset and restart apache again.
 #
 # Version: $Id: modsec.sh,v 1.1 2005/06/29 18:07:53 olei Exp $
 # URL: http://cs.evilnetwork.org/cycro
 # Copyright 2005, All Rights Reserved

APACHESTART="/usr/sbin/apache2ctl start"
 MODSECPATH="/etc/apache2/modsecurity2 "
 APACHEPID="/var/run/apache2.pid"

##########################################################################
 ######### you probably don't need to change anything below here ##########
 ##########################################################################

# urls
 BLACKLIST="http://www.gotroot.com/downloads/ftp/mod_security/blacklist.conf"
 RULES="http://www.gotroot.com/downloads/ftp/mod_security/rules.conf"
 APACHE2="http://www.gotroot.com/downloads/ftp/mod_security/apache2-rules.conf"

# internal
 PID=`cat ${APACHEPID}`
 UPDATED=0

echo -n "Changing PWD: "
 cd ${MODSECPATH}
 echo `pwd`

# blacklist
 echo -n "Updating blacklist.conf: "
 /usr/bin/wget -t 30 -O blacklist.conf.1 -q ${BLACKLIST}
 if [ `md5sum blacklist.conf | cut -d " " -f1` != `md5sum blacklist.conf.1 | cut -d " " -f1` ] ; then
 /bin/mv blacklist.conf blacklist.conf.bak
 /bin/mv blacklist.conf.1 blacklist.conf
 UPDATED=`expr $UPDATED + 1`
 echo "ok."
 else
 echo "allready up to date."
 /bin/rm -f blacklist.conf.1
 fi

# rules
 echo -n "Updating rules.conf: "
 /usr/bin/wget -t 30 -O rules.conf.1 -q ${RULES}
 if [ `md5sum rules.conf | cut -d " " -f1` != `md5sum rules.conf.1 | cut -d " " -f1` ] ; then
 /bin/mv rules.conf rules.conf.bak
 /bin/mv rules.conf.1 rules.conf
 UPDATED=`expr $UPDATED + 1`
 echo "ok."
 else
 echo "allready up to date."
 /bin/rm -f rules.conf.1
 fi

# apache2 rules
 echo -n "Updating apache2-rules.conf: "
 /usr/bin/wget -t 30 -O apache2-rules.conf.1 -q ${APACHE2}
 if [ `md5sum apache2-rules.conf | cut -d " " -f1` != `md5sum apache2-rules.conf.1 | cut -d " " -f1` ] ; then
 /bin/mv apache2-rules.conf apache2-rules.conf.bak
 /bin/mv apache2-rules.conf.1 apache2-rules.conf
 UPDATED=`expr $UPDATED + 1`
 echo "ok."
 else
 echo "allready up to date."
 /bin/rm -f apache2-rules.conf.1
 fi

# try restart
 if [ "$UPDATED" -gt "0" ]; then
 echo -n "Restarting apache: "
 /bin/kill -HUP ${PID} 2>/dev/null
 # did it work?
 if `/bin/kill -CHLD ${PID} >/dev/null 2>&1`; then
 echo "ok."
 exit 0
 fi
 echo "error. Apache not running."

# blacklist
 echo -n "Rolling back blacklist.conf: "
 /bin/mv blacklist.conf blacklist.conf.new
 /bin/mv blacklist.conf.bak blacklist.conf
 echo "ok."

# rules
 echo -n "Rolling back rules.conf: "
 /bin/mv rules.conf rules.conf.new
 /bin/mv rules.conf.bak rules.conf
 echo "ok."

# apache2 rules
 echo -n "Rolling back apache2-rules.conf: "
 /bin/mv apache2-rules.conf apache2-rules.conf.new
 /bin/mv apache2-rules.conf.bak apache2-rules.conf
 echo "ok."

# try starting httpd again
 `${APACHESTART}`
 PID=`cat ${APACHEPID}`

# did that fix the problem?
 if `/bin/kill -CHLD ${PID} >/dev/null 2>&1`; then
 echo "That did the trick."
 exit 0
 fi

echo "Fatal: Apache still not running! Run apache2ctl -t to find the error."
 exit 999
 fi

Il faut rendre ce script exécutable.

chmod +x /etc/apache2/modsecurity2/modsec.sh

Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP

Adminstration Server Linux 18 Comments »

Ce tutorial a été intégralement repris du site  http://www.starbridge.org et a été réalisé par tonio. Il est distribué sous licence creativecommons  Creative Commons License

Le système sur lequel est basé ce document est une DEBIAN stable (Lenny). La version ancienne Stable (Etch) à la date de rédaction présente quelques différences sur certains paquets (changement de nom lors des montées de version : voir le site Debian pour les versions équivalentes) mais cela n’entraîne aucun problème dans les fonctionnalités. Le tuto est aussi compatible avec la version Testing.

Par souci de clarté, on a detaillé chaque action le plus précisement possible, et ce pour ne pas réduire le tuto à une simple succession de commandes. Mais cela peut se réveler parfois fastidieux de créer un fichier en copier/coller puis de modifier le mot de passe. (surtout quand il faut modifier plusieurs occurences).

C’est pour cela que l’on trouvera en note en pied de page les commandes rapides pour exécuter certaines actions longues.

Un hyperlien avec un numéro est le signe de l’existence d’une commande rapide. Pratique lorsque l’on refait le tuto (ou pour les fainéants !)

Ce tuto fonctionne également sous Ubuntu mais certains paquets présentent de légères différences. On essaiera de les indiquer si possible.

On utilisera comme serveur IMAP celui de Courier, mais pour ceux qui le souhaitent, nous préciserons la marche à suivre pour installer Dovecot à la place.

On prendra comme base pour l’exemple le domaine starbridge.org
et le hostname du serveur de mail sera spike.

Read the rest of this entry »

WPAD : Auto-configuration d’un serveur proxy

Administration des Réseaux, Adminstration Server Linux 4 Comments »

Web Proxy Auto-Discovery. Il s’agit d’un protocole imaginé par Microsoft, qui permet d’effectuer automatiquement le paramétrage du server proxy de son navigateur.

Server DNS

Par défaut le browser cherche le sous-domaine wpad du domaine dans le quel on est connecté ensuite il lira a la racine de de ce domaine le fichier wpad.dat (http://wpad.mondomaine.lan/wpad.dat
Voici un exemple de ligne a mettre dans votre BIND

intranet        A       172.16.1.100
wpad            CNAME   intranet

Server DHCP

Dans la config du server DHCP il faut ajouter l’option 252, et lui indiqué le lien du fichier de configuration, les lignes suivante doivent se mettre en dehors d’une définition de range

option wpad-url    code 252 = text;
option wpad-url     "http://wpad.mondomaine.lan/wpad.dat\n";

Server WEB

Il faut maintenant configurer un vhost pour ce sous domaine


 DocumentRoot /home/website/wpad
 ServerName wpad.mondomaine.lan
 ServerAlias 172.16.1.100
 AddType application/x-ns-proxy-autoconfig .dat
 AddType application/x-ns-proxy-autoconfig .pac
 Redirect permanent /wpad.dat /proxy.pac
 
 Options FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 

Le fichier de config

Dans notre exemple nous avons définit la racine du vhost là /home/website/wpad

On crée le fichier proxy.pac

vi /home/website/wpad/proxy.pac

et on copie le code suivant

function FindProxyForURL(url, host)
{
if( shExpMatch(url, "!https:*") || isPlainHostName(host) || dnsDomainIs(host, ".mondomaine.lan"))
return "DIRECT";
else
return "PROXY srvproxy:3128";
}

Cette fonction va permettre de définir quand utiliser le proxy et de spécifier le proxy en question. Ici on se connecte directement au machine du même domaine par contre tous le reste utilise le proxy

Plugins Fail2Ban pour Munin

Adminstration Server Linux, Sécurité 14 Comments »

Ne trouvant pas mon bonheur parmi les plugins munin pour fail2ban j’ai décidé de l’écrire moi même. Le plugins s’adapte automatiquement à votre fail2ban car il récupère les jails activées.

On crée le fichier /usr/share/munin/plugins/fail2ban et on le remplit le avec le code ci-dessous

#! /bin/bash

PROGNAME=fail2ban
STATEDIR=/var/lib/munin/plugin-state
LISTJAIL=$(fail2ban-client status | grep " Jail list:" | sed 's/`- Jail list:\t\t//g' | sed 's/,//g')

if [ "$1" = "config" ]
then
 echo 'system.type ABSOLUTE'
 echo 'graph_title Fail2ban'
 echo 'graph_vlabel Number of ban'
 echo 'graph_category Security'
 for f  in $LISTJAIL; do
 echo "$f.label $f"
 done
 exit 0
fi

for f  in $LISTJAIL; do
 echo "$f.value $(fail2ban-client status $f | grep " Currently banned:" | sed 's/   |- Currently banned:\t//g')"
done

Ensuite on active le plugins en créant le lien symbolyque

ln -s /usr/share/munin/plugins/fail2ban /etc/munin/plugins/

Il faut également élever les privilèges de munin pour qu’il puisse utiliser fail2ban

vi /etc/munin/plugin-conf.d/munin-node

On ajoute à la fin :

[fail2ban]
user root

On termine on redémarrant munin

/etc/init.d/munin-node restart

Et vous devriez avoir après quelques jours un graphique semblable 🙂

Graph Munin Fail2ban

Graph Munin Fail2ban

Configurer SSH via un jeu de clé privée/publique

Adminstration Server Linux, Sécurité No Comments »

Dans ce mémo j’expliquerais comment générer un jeu de clé avec PuttyGen et comment l’installer sur le server afin que le user ROOT ne puisse se connecter qu’avec un jeu de clé.

A télécharger si vous ne les avez pas encore Putty et PuttyGen sur PuTTY Download Page

Génération d’une paire de clés (privée/publique) avec PuTTYGen

On commence par lancer PuTTYGen, choisir le type de clé à générer SSH-2 RSA, et la longueur de la clé 1024 bits. On clique ensuite sur le bouton Generate, il faut faire bouger la souris dans la fenêtre de PuTTY Key Generator de façon aléatoire, et c’est ce mouvement aléatoire qui va servir à générer la clé.

puttygen

Une fois la clé générée , on doit arriver à quelque chose ressemblant à ça :

puttygen2

On commence par remplir le champ passphrase afin d’avoir encore un peu de plus de sécurité. Ainsi, même si quelqu’un avait accès à notre clé privée, il lui faudrait le mot de passe pour s’en servir. On peut maintenant sauvegarder la clé publique et la clé privée; pour la clé publique on peut lui affecter l’extension que l’on veut, mais on prend généralement .pub, et on peut largement diffuser cette clé, alors que pour la clé privée, ce sera l’extension .ppk, et cette clé DOIT rester confidentielle.
Attention : laissez ouvert votre PuTTYGen ouvert, afin d’avoir la clé à copier/coller sous la main.

Enregistrement d’une session dans Putty

On va maintenant ajouter la configuration d’une session vers un serveur dans putty. Pour cela, ouvre Putty. On renseigne les champs hostname, Saved Session,  l’encodage des caractères dans Window > Translation (puisque la plupart des serveurs sont en UTF-8 alors que PuTTY est en ISO par défaut), etc. Pour gagner encore un peu de temps lors de chaque connexion, on peut rentrer le nom d’utilisateur dans Connection > Data, au champ auto-login username.

putty

On peut maintenant retourner dans Session, enregistrer notre session sous le nom que l’on veut, et, enfin, ouvrir la connexion en cliquant sur Open.

Ajout de la clé publique sur le serveur Linux

La première connexion au serveur se déroule comme d’habitude, il faut rentrer notre mot de passe. Une fois cette tâche effectuée, on va éditer le fichier /root/.ssh/authorized_keys, et on va copier/coller notre clé publique dans ce fichier (n’hésitez pas à créer le répertoire et le fichier s’ils n’existent pas). On retourne sur la fenêtre de PuTTYGen, et on copie/colle la clé. Si jamais vous aviez fermé bêtement la fenêtre de PuTTYGen, vous pouvez rouvrir le logiciel, et charger votre clé privée grâce au bouton load. Il faut respecter simplement le fait de placer une seule clé par ligne dans le fichier /root/.ssh/authorized_keys.

Configuration de OpenSSH

Il faut configurer le serveur ssh pour qu’il n’autorise que l’accès par clé y compris pour root. On passe les options suivantes dans /etc/ssh/sshd_config

PermitRootLogin without-password
AllowUsers toto root
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no

Il faut ensuite redémarrer le sshd

/etc/init.d/ssh reload

On peut désormait se loguer en root en utilisant uniquement un jeu de clé.

Installation du mod evasive sur apache 2.2 pour contrer des attaques DOS

Adminstration Server Linux, Sécurité 8 Comments »

Cette après midi après plusieurs test de charge du serveur Web, je me suis rendu compte que c’était un jeu d’enfant de faire planter à la fois le apache mais aussi la machine.

Comment me direz-vous, tous simplement en flood le serveur de centaine de thread, la charge CPU monte la ram aussi, vient ensuite le tour de la swap et puis c’est la fin, le serveur ne répond plus à rien sauf au ping.

htop

Après quelque recherche j’ai installé le mod_evasive qui permet de détecter les floods et les tentatives de déni de service.  Ce module renvoie des erreurs HTTP 403 lorsque le seuil de sollicitation du serveur Web par IP a été dépassé. Ce blocage dure pendant 10 secondes (paramétrable). Il est aussi possible de demander au module d’exécuter une commande lorsque qu’un flood est détecté, il est ainsi possible d’ajouter une règle Iptables à chaque nouvelle détection de flood.

apt-get install libapache2-mod-evasive

On édite le fichier de configuration d’apache2 et on ajoute les lignes suivante :

vi /etc/apache2/apache2.conf
# mod_evasive


DOSHashTableSize 3097
DOSPageCount 3
DOSSiteCount 50
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 300
DOSEmailNotify "admin@majorxtrem.be"
DOSLogDir "/var/log/mod_evasive/"
#DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"
DOSSystemCommand "/bin/echo %s >> /var/log/mod_evasive/dos_evasive.log && /bin/date >> /var/log/mod_evasive/dos_evasive.log"
DOSWhiteList 127.0.0.1
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
DOSWhitelist 66.249.67.*

Les valeurs données dans cette exemple sont à adapter selon votre serveur.

Explications :

DOSHashTableSize Size of the hash table. The greater this setting, the more memory is required for the look up table, but also the faster the look ups are processed. This option will automatically round up to the nearest prime number.
DOSPageCount définie le nombre de fois ou une page peut être appelée par la même adresse IP avant que celle-ci soit bloquée.
DOSSiteCount définie le nombre de fois ou un site peut être demandé par la même adresse IP avant que celle-ci soit bloquée.
DOSPageInterval détermine un interval en seconde qui autorise l’affichage de la même page avant un bloquage.
DOSSiteInterval détermine un interval en seconde qui autorise l’affichage de d’un même site avant un bloquage.
DOSBlockingPeriod détermine la durée de bloquage.
DOSEmailNotify permet qu’un email soit envoyé à chaque bloquage d’adresses IP.
DOSSystemCommand permet de définir une commande bien précise en cas d’attaque (bannissement de l’adresse IP dans IPTables par exemple).
DOSLogDir détermine le chemin ou seront stockés les logs d’attaques.
DOSWhiteLt définie une liste blanche d’adresse IP.

DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"

Cette commande permet de bloquer une adresse IP à l’aide d’IPTable.
Cependant l’utilisation de DOSSystemCommand doit être prise au sérieux car en cas d’attaques massives l’instruction déterminée entre ”“ sera répétée autant de fois qu’il faut.

Pour que l’adresse IP soit ajoutée à IPTables il est nécessaire que l’utilisateur “www-data” ait les droits pour manipuler IPTables

On crée le dossier /var/log/mod_evasive/ et on lui donne les bon droits

mkdir /var/log/mod_evasive/
chown -R www-data /var/log/mod_evasive/

On charge le module

a2enmod mod-evasive

On termine en redémarrant apache

/etc/init.d/apache2 restart

On va maintenant tester la configuration à l’aide d’un petit script perl mais il faut avant tous commenter temporairement la ligne DOSWhiteList 127.0.0.1 et redémarrer apache

vi test.pl
#!/usr/bin/perl

# test.pl: small script to test mod_dosevasive's effectiveness

use IO::Socket;
use strict;

for(0..100) {
  my($response);
  my($SOCKET) = new IO::Socket::INET( Proto   => "tcp",
                                      PeerAddr=> "127.0.0.1:80");
  if (! defined $SOCKET) { die $!; }
  print $SOCKET "GET /?$_ HTTP/1.0nn";
  $response = <$SOCKET>;
  print $response;
  close($SOCKET);
}

On le rend exécutable

chmod +x test.pl

Et on le lance

./test.pl

Code Source & Résultat

Votre serveur apache est désormais capable de réagir sur des attaques DOS

S’authentifier sur apache2 avec LDAP

Adminstration Server Linux 1 Comment »

Nous avons récemment mis en place en serveur LDAP sous OpenLDAP.
On va maintenant configurer apache2 pour qu’il puisse s’authentifier dans le LDAP.

Voici le lien vers la documentation officielle d’apache2 à ce sujet

On va commencer par activer les modules nécessaires d’apache2

a2enmod ldap auth_basic authnz_ldap authz_user

Ensuite vous éditez vos vhosts et ajouter une des configurations suivante entre les balises

L’utilisateur doit exister dans l’Organisation Unit Users

AuthType Basic
AuthName "Restricted Area"
AuthLDAPBindDN "uid=read_user,cn=Managers,dc=majorxtrem,dc=be"
AuthLDAPBindPassword "le_pass_de_read_user"
AuthBasicProvider ldap
AuthLDAPURL ldap://127.0.0.1/ou=Users,dc=majorxtrem,dc=be?uid
AuthzLDAPAuthoritative OFF
Require valid-user

L’utilisateur doit exister dans l’Organisation Unit Users et faire partie du groupe Admins

AuthType Basic
AuthName "Restricted Area"
AuthLDAPBindDN "uid=read_user,cn=Managers,dc=majorxtrem,dc=be"
AuthLDAPBindPassword "le_pass_de_read_user"
AuthBasicProvider ldap
AuthLDAPURL ldap://127.0.0.1/ou=Users,dc=majorxtrem,dc=be?uid
AuthzLDAPAuthoritative OFF
AuthLDAPGroupAttribute memberUid
AuthLDAPGroupAttributeIsDN on
Require ldap-group cn=Admins,ou=Groups,dc=comitetig,dc=be

L’utilisateur doit être majorxtrem

AuthType Basic
AuthName "Restricted Area"
AuthLDAPBindDN "uid=read_user,cn=Managers,dc=majorxtrem,dc=be"
AuthLDAPBindPassword "le_pass_de_read_user"
AuthBasicProvider ldap
AuthLDAPURL ldap://127.0.0.1/ou=Users,dc=majorxtrem,dc=be?uid
AuthzLDAPAuthoritative OFF
Require user majorxtrem

On termine en rédémrant apache2

/etc/init.d/apache2 restart

Installation et configuration d’un serveur OpenLDAP sous Debian

Administration des Réseaux, Adminstration Server Linux, Debian 15 Comments »

ldapworm

OpenLDAP est une implémentation libre du protocole LDAP développée par The OpenLDAP Project.
Lightweight Directory Access Protocol (LDAP) est à l’origine un protocole permettant l’interrogation et la modification des services d’annuaire.

Nous allons utiliser le serveur LDAP afin de centraliser les informations utilisateurs des sites et services du serveur. En effet la plus par des services telles que les serveur web, ftp, proxy peuvent s’authentifier sur un serveur LDAP, mais également les CMS les plus populaires.

Avant de commencer l’installation on va vérifier le hostname de la machine

# hostname -f
server.majorxtrem.be

Vous devez obtenir quelque chose de similaire, si ce n’était pas le cas éditer le fichier /etc/hostname afin d’avoir :  nomdelamchine.domaine.com

On commence l’installation par le traditionnel apt-get

apt-get install slapd ldap-utils

Durant l’installation on vous demande simplement le password admin du serveur .

Vous tapez ensuite la commande slappasswd, elle va vous permettre de générer un password SSHA

# slappasswd
New password: toto
Re-enter new password: toto
{SSHA}gHus2hriMC95mCcmPtXbK8Nv/oh2hZy5

Copiez-le on va en avoir besoin dans le fichier de configuration de slapd, il se trouve ici :

vi /etc/ldap/slapd.conf

Vous vérifiez que suffix est égale à :

suffix          "dc=majorxtrem,dc=be"

Et ajouter les lignes :

rootdn          "cn=admin,dc=majorxtrem,dc=be"
rootpw          {SSHA}gHus2hriMC95mCcmPtXbK8Nv/oh2hZy5

On édite également afin que l’annuaire ne soit pas lisible en anonyme

access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=majorxtrem,dc=be" write
        by anonymous auth
        by self write
        by * none

access to *
        by dn="cn=admin,dc=majorxtrem,dc=be" write
        by dn="uid=read_user,cn=Managers,dc=majorxtrem,dc=be" read

On redémarre slpad

/etc/init.d/slapd restart

On va maintenant créer la base de l’annuaire

vi racine.ldif

Et on ajoute les lignes suivantes dedans

# Racine
dn: dc=majorxtrem,dc=be
objectClass: top
objectClass: dcObject
objectClass: organization
o: majorxtrem.be
dc: majorxtrem

# OU Manager
dn: cn=Managers,dc=majorxtrem,dc=be
objectClass: organizationalRole
objectClass: top
cn: Managers

# OU Groups
dn: ou=Groups,dc=majorxtrem,dc=be
objectClass: organizationalUnit
objectClass: top
ou: Groups

# OU Users
dn: ou=Users,dc=majorxtrem,dc=be
objectClass: organizationalUnit
objectClass: top
ou: Users

Ensuite on l’ajoute au LDAP :

ldapadd -f racine.ldif -D "cn=admin,dc=majorxtrem,dc=be" -w toto

À ce stade votre serveur est fonctionnel, on va tous de même installer une interface de gestion en PHP
apt-get install phpldapadmin

L’interface sera accessible via l’url http://ipduserver/phpldapadmin

Loguez vous et ajoutez un utilisateur read_user dans le groupe Manager
Le login est cn=admin,dc=majorxtrem,dc=be, le pass est celui que vous avez généré tous à l’heure

Cliquez sur manager et ensuite sur Create a child

ldap1

Choisissez : Simple Security Object

ldap2

Ensuite remplissez le username, le password et spécifiez SSHA pour l’encryption

ldap3
Ce user servira pour authentifier apache, phpbb & cie pour vérifier le login de vos utilisateurs

Dans un prochain article, on verra comment restrientre via apache l’accés à un dossier via authentification LDAP

Bloquer les scans de dossier par dictionnaire sur votre serveur WEB

Administration des Réseaux, Adminstration Server Linux 4 Comments »

Je vous expliquais hier comment se protéger des scans Dfind. Aujourd’hui nous allons aller un peu plus loin dans la sécurisation de son server web en bannisant tous requêtes se faisant directement sur l’ip et non via un nom de domaine.

Concrètement dans les logs d’apache vous devriez avoir quelque chose de semblable :

[Fri May 01 14:52:11 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/phpMyAdmin
[Fri May 01 14:52:11 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/PHPMYADMIN
[Fri May 01 14:52:11 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/phpmyadmin/main.php
[Fri May 01 14:52:12 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/pHpMyAdMiN
[Fri May 01 14:52:12 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/PhPmYaDmIn
[Fri May 01 14:52:13 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/phpMYadmin
[Fri May 01 14:52:13 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/PHPmyadmin
[Fri May 01 14:52:13 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/PHPMYadmin
[Fri May 01 14:52:14 2009] [error] [client 24.123.67.41] client denied by server configuration: /var/www/phpmyADMIN

On  commence par préparer apache, en effet on va déclarer un vhost qui s’occupera de traiter les requêtes sur l’IP

On crée le dossier /var/empty et on lui donne les droits adéquats pour que apache puisse lire le dossier

mkdir /var/empty
chown www-data:www-data -R /var/empty
chmod 664 -R /var/empty

Ensuite vous créez le vhost

vi /etc/apache2/sites-available/nodnsuse

Et vous copier les lignes suivantes dedans :


        DocumentRoot /var/empty/
        
                Order Deny,Allow
                Deny from All
        

Vous activez le vhost et relancez apache2

a2ensite nodnsuse
/etc/init.d/apache2 restart

On installe Fail2Ban si vous ne l’avez pas encore fait

apt-get update && apt-get install fail2ban

On edit le fichier jail.conf pour y ajouter la nouvelle règle

vi /etc/fail2ban/jail.conf

On ajoute à la fin du fichier les lignes suivantes :

[apache-nodnsuse]

enabled = true
port    = http,https
filter  = apache-nodnsuse
logpath = /var/log/apache*/*error.log
maxretry = 1
banTime = 86400

On ajoute le fichier de détection

vi /etc/fail2ban/filter.d/apache-nodnsuse.conf

Et on y ajoute :

[Definition]
failregex = [[]client []] client denied by server configuration: /var/empty/.*
ignoreregex=

Vous redémarrez enfin Fail2Ban et consulter les logs pour voir qui sera le premier gagnant

/etc/init.d/fail2ban restart && tail -f -n 30 /var/log/fail2ban.log

Bloquer les attaques de type w00tw00t.at.ISC.SANS sur Apache2

Administration des Réseaux, Adminstration Server Linux 4 Comments »

apache_w00tw00tSi vous avez un serveur Apache, vous avez très certainement dans les logs des attaques de type w00tw00t.at.ISC.SANS. Elles sont le fruit de kiddies utilisant un logiciel de scanning nommé DFind

Si votre serveur est à jour et correctement configuré, vous ne devriez pas en avoir peur. Mais on va quand même s’occuper de ces petits mariols du net tout juste bon à utiliser un script.

On va installer Fail2Ban est dés que l’on trouvera la signature du scanner dans les logs, on bannira l’IP de l’attaquant via iptables, simple et radicale.

On commence par mettre à jour les dépôts et installer fail2ban

apt-get update && apt-get install fail2ban

On créer maintenant le fichier qui ajoutera une règle iptables

vi /etc/fail2ban/action.d/iptables-allports.conf

On copie les lignes suivantes dedans

# Fail2Ban configuration file
#
# Author: Cyril Jaquier
# Modified: Yaroslav O. Halchenko 
#             made active on all ports from original iptables.conf
#
# $Revision: 658 $
#

[Definition]

# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart = iptables -N fail2ban-
              iptables -A fail2ban- -j RETURN
              iptables -I INPUT -p  -j fail2ban-

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop = iptables -D INPUT -p  -j fail2ban-
             iptables -F fail2ban-
             iptables -X fail2ban-

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck = iptables -n -L INPUT | grep -q fail2ban-

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:      IP address
#            number of failures
#          

On créé maintenant le fichier qui contenant le regex de détection de la signature de Dfind

vi /etc/fail2ban/filter.d/apache-w00tw00t.conf

On le rempli avec ce qui suit

# w00tw00t.at.ISC.SANS.DFind

[Definition]

# Option:  failregex
# Notes.:  regex to match the w00tw00t scan messages in the logfile. The
#          host must be matched by a group named "host". The tag "" can
#          be used for standard IP/hostname matching.
# Values:  TEXT
failregex = [[]client []] (client sent HTTP/1.1 request without hostname|Invalid method in request|request failed: URI too long|erroneous characters after protocol string)

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT

ignoreregex =

Pour finir on édit le fichier jail.conf

vi /etc/fail2ban/jail.conf

Et on y ajoute les lignes suivantes, elles on pour effet de bannir complètement pendant 24h l’IP des attaquant.

[apache-w00tw00t]
enabled  = true
filter   = apache-w00tw00t
action   = iptables-allports[name=w00tw00t]
logpath  = /var/log/apache2/error.log
maxretry = 1
bantime  = 86400

On redémarre Fail2ban

/etc/init.d/fail2ban restart

On peut à présent attendre tranquillement les prochaines attaques

tail /var/log/fail2ban.log
2009-04-30 20:24:29,858 fail2ban.actions: WARNING [apache-w00tw00t] Ban 85.114.141.205
2009-04-30 20:24:29,906 fail2ban.actions: WARNING [apache-w00tw00t] Ban 62.75.220.143
2009-04-30 20:24:29,954 fail2ban.actions: WARNING [apache-w00tw00t] Ban 212.180.3.123
2009-04-30 20:24:30,001 fail2ban.actions: WARNING [apache-w00tw00t] Ban 91.121.210.244
2009-04-30 20:26:03,142 fail2ban.actions: WARNING [apache-w00tw00t] Ban 89.19.1.18

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Connexion
ipv6 ready