Archives pour la catégorie ‘Administration’

Packet Filter : protection d'attaque SSH par brute force

La technique pour éviter les attaques SSH par brute force avec PacketFilter consiste à ajouter les IP fautives dans une table et d’exclure les IP qui y sont contenues pour les connexions SSH ou de façon globale (petit vilain).

Procédure chef :

  1. déclarer la table qui va contenir les IP bannies
  2. bloquer en début de filtrage les connexions entrantes de ces IP.
  3. ajouter les options de collecte des états des connexions sur les règles que l’on souhaite protéger du bruteforce.
  4. vider la table, en tâche cron par exemple.

Exemple d’un parefeu PF rudimentaire, fait main (70% main droite), autorisant le trafic ICMP et les connexions SSH :

#
# pf.conf
#

# macros
ext_if = "re0" # ou mi0, fa0, sol0 çà dépend
myip = "XX.XX.XX.XX" # comme c'est trop secure

# tables
table <bruteforce> persist {}

# options
set block-policy drop
set skip on lo0 # non ce n'est pas la0
set limit { states 20000, frags 5000, src-nodes 2000 }

# normalization
scrub in all fragment reassemble
scrub all reassemble tcp
scrub in all random-id

#
# rules
#

block all
block quick from <bruteforce>
antispoof quick for lo0

pass out inet proto tcp all flags S/SA keep state
pass out inet proto udp all keep state

pass in on $ext_if inet proto icmp from any to any keep state
pass out on $ext_if inet proto icmp from any to any keep state

pass in on $ext_if inet proto tcp from any to any port 22 flags S/SA keep state (source-track rule, max-src-nodes 8, max-src-conn 8, max-src-conn-rate 10/60, overload <bruteforce> flush global)

Dans le cas où un client se  connecte 10 fois par minute, il est banni et bloqué pour toute nouvelle connexion. Il ne reste plus que de lancer la commande permettant de supprimer les adresses IP enregistrées, ici pour le jour précédent :

# /usr/local/sbin/expiretable -t 24h bruteforce

Certificat SSL multi-domaines gratuit signé par CACert.org

Un certificat multi-domaines (à ne pas confondre avec un certificat wildcard) permet d’utiliser un certificat SSL pour différents noms de domaines et sous-domaines. Ceux-ci peuvent alors être hébergés sur un même serveur Web à adresse IP unique. Pour rappel, lors de l’établissement de la connexion sécurisée, le serveur Web envoie  le certificat SSL alors même que le client n’a pas encore envoyé sa requête. Les certificats au standard X509 ne présentant qu’un unique nom de domaine ou sous-domaines (cas d’un certificat wildcard) par le biais du champ CN (Common Name) : le serveur Web ne peut donc que se mapper  localement à un unique site Web.

Pourtant, une extension existe depuis quelques années (pour ma part je l’ai appris en 2005) et permet de déclarer dans le certificat plusieurs domaines. Celle-ci associe au certificat une liste de domaines : le champ SubjectAltName. Le serveur Web est alors capable de gérer plusieurs domaines, le certificat pouvant être mappé aux hôtes virtuels de cette liste. Seul bémol, la liste des domaines est présente en clair dans le certificat (il n’y aurait pas de magie).

Action ! Pour obtenir un certificat SSL gratuit multi-domaines signé par l’autorité CACert (http://www.cacert.org/) :

  1. créez votre compte sur le site CACert en déclarant votre mailbox et votre nom de domaine
  2. générez la demande de certificat (CSR) grâce à ce script : http://svn.cacert.org/CAcert/Software/CSRGenerator/csr .
  3. copiez la demande sur le formulaire du site et enregistrez le certificat.
  4. installez le certificat racine de CACert si votre navigateur ne l’intègre pas : http://www.cacert.org/index.php?id=3.

Exemple d’exécution du script pour mon domaine hbis.fr (notez bien que je répète le domaine pour l’extension) :

Private Key and Certificate Signing Request Generator
This script was designed to suit the request format needed by
the CAcert Certificate Authority. www.CAcert.org

Short Hostname (ie. imap big_srv www2): hbis
FQDN/CommonName (ie. www.example.com) : hbis.fr
Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish
SubjectAltName: DNS:hbis.fr
SubjectAltName: DNS:www.hbis.fr
SubjectAltName: DNS:admin.hbis.fr
SubjectAltName: DNS:mail.hbis.fr
SubjectAltName: DNS:smtp.hbis.fr
SubjectAltName: DNS:
Running OpenSSL...
Generating a 2048 bit RSA private key
.......................+++
..........................+++
writing new private key to '/root/hbis_privatekey.pem'
-----
Copy the following Certificate Request and paste into CAcert website to obtain a Certificate.
When you receive your certificate, you 'should' name it something like hbis_server.pem

Plus d’informations sur le support de l’extension SubjectAltName par les navigateurs Web : http://wiki.cacert.org/wiki/VhostTaskForce.

Script cleanup pour Firebird sous Mac OS X

Ce script vous sera utile dans le cas d’une désinstallation / réinstallation du serveur de base de données Firebird sous Mac OS X :

#!/bin/sh

SystemStarter stop 'Firebird Server'
dscl localhost -delete /Local/Default/Users/firebird
dscl localhost -delete /Local/Default/Groups/firebird

if [ -f "/Library/StartupItems/Firebird" ]; then
   rm -fr /Library/StartupItems/Firebird
fi

if [ -f "/Library/LaunchDaemons/org.firebird.gds.plist" ]; then
   launchctl unload /Library/LaunchDaemons/org.firebird.gds.plist
   rm /Library/LaunchDaemons/org.firebird.gds.plist
fi

rm -fr /Library/Frameworks/Firebird.framework
rm -fr /Library/Receipts/Firebird*.pkg

Rsync 3 pour Mac OS X

Voici un guide complet d’installation de la dernière version 3 de l’utilitaire rsync sous Mac OS X, incluant les patchs nécessaires à la gestion des flags du filesystem HFS+. Il est disponible à cet endroit : http://www.bombich.com/mactips/rsync.html

Le lancement du démon Rsync par xinetd (Mac OS X 10.4) est expliqué ici :

http://maxpowerindustries.com/docs/rsyncdaemon.html.

Dans le cas d’une version 10.5, il faut créer un script launchd :

http://voice.firefallpro.com/2006/03/backing-up-with-launchd-and-rsync-in.html.

Telnet sécurisé

Le package openssl contient un client telnet sécurisé, très utile pour tester les connexions aux serveurs HTTPS, SMTPS, IMAPS et j’en passe.

# openssl s_client -connect localhost:993

Cet outil permet également d’inspecter les certificats SSL.

Ah oui, la bonne nouvelle c’est qu’il est installé sur tous les systèmes Unix, Linux et Mac OS (OpenSSL oblige).

Check DNS

Voice un liste d’outils indispensables pour un administrateur système soucieux de son serveur DNS et de ses domaines :

Stockage de données en cache RAM

Il est parfois utile de mettre en cache des fichiers, telles que des sessions PHP ou des logs (ce qui évite le réveil du disque dur). Le système de fichiers tmpfs (temporaray file system) permet à juste titre de créer un cache RAM. Les données y sont stockées jusqu’au prochain démarrage du serveur. Si aucune taille disque n’est précisée, tmpfs se charge de mettre en swap les données, ce qui peut être problématique.

Exemple de création d’un cache limité à 64 Mo, monté dans /home/cache :

# mount -t tmpfs -o size=128M /dev/shm /home/cache/
shm on /home/cache type tmpfs (rw,size=64M)
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/shm               64M     0   64M   0% /home/cache

Les fichiers / répertoires à stocker peuvent ensuite être copiés.

Apache : redirection transparente en HTTPS

Il existe plusieurs manières de forcer le passage en mode sécurisé d’un site hébergé sous Apache. Cependant, la plupart sont faites en dures : le port 443 est forcé voire également le domaine du site.

Voici donc la manière la plus propre et élégante que j’ai pu faire :

# Force HTTPS mode
<IfModule mod_ssl.c>
  <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
   </IfModule>
</IfModule>

Celle-ci fonctionne quelque soit le port sécurisé déclaré dans la configuration du serveur,  le domaine ou les alias utilisés par le VirtualHost considéré, et ne provoque pas l’arrêt du serveur si un des 2 modules nécessaires n’est plus activé. Pour limiter la redirection à une certaine partie du site, il ne reste plus qu’à restreindre la RewriteRule.

Linux : fichier de swap dynamique

Il peut être utile de créer un fichier de swap sur disque  (et non sur une partition dédiée). L’avantage est que le fichier peut être redimensionné après coup.Par exemple, pour créer un fichier de 256 Mo, il faut procéder ainsi :

# dd if=/dev/zero of=/var/swap bs=1024 count=262136
# mkswap /var/swap
# swapon /var/swap

La dernière ligne doit être exécutée à chaque boot pour activer le fichier de swap. Sous Gentoo, vous pouvez l’ajouter dans /etc/conf.d/local.start. Sous Debian, tout est plus simple avec le package dphys-swap qui permet une gestion automatique. Ce dernier est configuré par le fichier /etc/dphys-swapfile dont voici un exemple :

# /etc/dphys-swapfile - user settings for dphys-swapfile package
# where we want the swapfile to be, this is the default
CONF_SWAPFILE=/var/swap
# size we want to force it to be, default (empty) gives 2*RAM
CONF_SWAPSIZE=256

WordPress et Nginx

J’ai découvert un nouveau serveur web. Il s’agit de Nginx (« engine x »). Ses avantages ? onsommation mémoire minimale, support HTTPS, rewrite rules, load-balancing, proxy… Toutes les fonctionnalités requises pour un serveur web dynamique (PHP/Perl/Ruby), sans compter la cerise sur le gâteau : un proxy mail IMAP / POP3. Rien que çà la petite bête !

Ca ne pouvait pas traîner : installation mode couteau suisse sur mon serveur virtuel destiné à l’hébergement de ce blog. 10 minutes d’installation et c’est réglé.

Il faut ajouter une règle de rewrite pour que WordPress fonctionne parfaitement :

# blog.huisgen.homeip.net
server {
   listen 80;
   server_name blog.bhuisgen.homeip.net;
   root /var/www/blog.bhuisgen.homeip.net;
   index index.php;
   error_page 404 = /wordpress/index.php?q=$request_uri;
   access_log /var/log/nginx/blog.bhuisgen.homeip.net.access.log;

   # wordpress
   location / {
      if (-f $request_filename) {
         break;
      }
      if (-d $request_filename) {
         break;
      }
      rewrite ^(.+)$ /index.php?q=$1 last;
   }

   # PHP
   location ~ \.php$
   {
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /var/www/blog.bhuisgen.homeip.net$fastcgi_script_name;
      include /etc/nginx/fastcgi_params;
   }
}

Enfin, il faut modifier les paramètres des liens dans l’administration de WordPress pour éliminer la présence de index.php dans toutes les URL du blog. Forcer l’utilisation de cette scruture personnalisée :

 /%year%/%monthnum%/%day%/%postname%/

Site officiel / documentation du bolide.

Haut de page