Archives de l’auteur : Fenrir

IPv6 – Sécurité

Un petit article pour vous mettre en garde contre le danger de l’IPv6 tel qu’il est proposé par les FAI.

Mon objectif n’est pas de critiquer l’IPv6, ce protocole offre de grandes perspectives pour l’avenir, je souhaite simplement que son adoption ne se fasse pas au détriment de votre sécurité à cause du manque de communication de la part des FAI.

L’IPv6 c’est bien car :

En théorie :

  1. c’est pratique : tous nos équipements peuvent avoir une adresse publique sur Internet
  2. c’est sécurisé : l’IPsec est directement intégré dans la norme
  3. c’est plus simple : la configuration est automatique (pas de dhcp, …)

Passons à la vraie vie :

  1. c’est pratique : tous nos équipements peuvent être accédés depuis Internet
  2. c’est sécurisé : intégré à la norme ne veut pas dire obligatoire ni utilisable
  3. c’est plus simple : on passe d’adresses du type 192.168.123.18 à des adresses du type fc00:a1bc:d852:358f:85ac:d35f:cd18:e561

Sans compter les problèmes de configuration en entreprise (filtrage des RA, configuration DNS, routes statiques, …).

Mais ne vous arrêtez pas là, l’IPv6 c’est aussi l’avenir, ça serait dommage de s’en passer.

Avec un peu de bonne volonté (de la part des FAI et des équipementiers), l’IPv6 peut très bien être déployé massivement sans créer de nouveaux problèmes.

Nous pourrons ainsi profiter de nouveaux services, comme :

  • la diffusion multicast : plus besoin d’avoir une bande passante proportionnelle au nombre de visiteurs pour diffuser une vidéo,
  • le VPN natif : sans avoir à passer des heures de configuration,
  • de meilleures performances : le protocole dispose de nombreuses optimisations,

Le problème

Actuellement de ce que j’ai pu constater, il n’y a qu’un problème majeur avec l’IPv6, c’est la sécurité. Il touche essentiellement les particuliers ou les petites entreprises car ils n’ont que rarement les connaissances, le temps ou les moyens de s’occuper de la sécurité de leurs données. C’est une erreur, mais c’est un fait !

En version courte :

  • Les systèmes récents ont presque tous la couche IPv6 activée par défaut (y compris les tablettes et les smartphones)
  • Les trucBOX sont rarement pourvues d’un vrai pare feu, en général elles proposent au mieux de faire un peu de translation (pour que vous ayez accès à Internet) et de filtrage (contrôle parental).
  • En IPv4, votre réseau local est « protégé » (à prendre avec les guillemets) des attaques directes depuis Internet, non pas grâce à votre trucBOX, mais grâce aux normes qui imposent qu’une adresse de type privé (un 192.168.x.x par exemple) ne doit pas circuler sur Internet.
  • Comme les adresses IPv4 sont une denrée de plus en plus rare, votre FAI vous en distribue une seule (sauf exceptions), voir aucune (si si ça existe, y compris en France)
  • En IPv6, la norme dit la même chose qu’en IPv4, ce qui est privé doit rester privé, mais comme il n’y a pas de pénurie d’adresse, votre FAI vous octroie une plage d’adresse public (souvent un simple /64), vos machines sont donc directement exposées à Internet.
  • Les trucBOX deviennent alors de simples commutateurs (switch) qui relient vos machines à Internet.
  • Dès que vous connectez un équipement compatible IPv6 (ils le sont presque tous maintenant) à votre box, cet équipement devient directement accessible depuis Internet.

Concrètement ça veut dire que tous les équipements branchés à une, par exemple, Freebox révolution (qui a l’IPv6 activé par défaut) sont directement accessible depuis Internet.

Le second problème de sécurité nous vient tout droit de Microsoft. Par défaut Windows  tente de monter un tunnel Teredo entre votre machine et Microsoft (teredo.ipv6.microsoft.com) afin de vous faire profiter de l’IPv6 au travers d’une connexion IPv4, que l’IPV6 soit activé ou non sur votre poste (c’est une interface « cachée »).

En pratique, quand vous voyez une adresse qui commence par 2001:0000:, c’est probablement une adresse qui sort de chez Microsoft.

Si l’idée est louable, permettre à de nombreuse personnes de disposer d’une adresse IPv6, il faut tout de même se poser une question : est il normal qu’une partie de notre trafic Internet passe par des serveurs étrangers sans notre consentement ?

2 grands axes s’offrent à vous :

  • ne pas utiliser l’IPv6 – ça serait dommage, mais ça ne devrait pas poser de problèmes pour encore quelques années, vous pouvez alors :
    • désactiver l’IPv6 sur tous vos équipements : ce n’est pas toujours possible et cela reste risqué
    • désactiver l’IPv6 sur votre connexion : c’est la solution la plus simple si votre FAI le permet
    • mettre un équipement (typiquement un routeur wifi) qui bloque l’IPv6 entre votre box et votre réseau : c’est souvent déjà le cas pour d’autres raisons que de bloquer l’IPv6
  • utiliser l’IPv6 – vous pouvez alors :
    • ne rien faire et laisser n’importe qui accéder et utilisez directement vos équipements : je ne pense pas que beaucoup de personnes choisissent cette possibilité
    • installer un pare feu sur tous vos équipements : sur un ordinateur c’est assez simple à faire, sur votre imprimante, votre TV connecté, …, bon courage
    • investir (du temps et/ou de l’argent) dans un système vous permettant de profiter de l’IPv6 sans devoir intervenir sur tous vos équipements et sans les mettre en danger

Je recommande ce dernier choix à celles et ceux qui souhaite profiter pleinement des possibilités d’Internet. C’est aussi l’occasion d’apprendre (un article est disponible ici).

Quel que soit votre choix, passez le mot à vos proches : sans action de leur part, leurs équipements seront très vite la proie des pirates.

Sauvegarde – Rotation

Ce petit article indique comment faire des sauvegardes complètes avec une rotation.

Il n’y a rien de bien compliqué, c’est simple à mettre en place et très fiable. Je l’utilise depuis des années sur certains de mes serveurs.

Sauvegarde

Identifier la source

La première chose à faire et d’identifier ce que l’on veut sauvegarder.

Accès aux données

Selon le type de source (une base SQL, un dossier, quelques fichiers, un serveur complet, …), la méthode et les outils d’archivages peuvent différer.

Par exemple pour une base MySQL, on peut utiliser la commande « mysqldump », alors que pour un dossier, le plus efficace est souvent d’utiliser dar (équivalent de tar, mais plus adapté aux sauvegardes sur disque, permet, entre autre, les sauvegardes différentielles).

Types de données

Ensuite selon le contenu de ce que l’on va sauvegarder, il peut être intéressant de compresser les données (par exemple un dossier plein de fichiers de configuration, comme /etc), dans certains cas au contraire, la compression ne sert qu’à consommer des ressources et ne fait pas gagner de place (un dossier plein d’images png).

Automatiser la sauvegarde

Création d’un script

Une fois la méthode de sauvegarde bien identifiée, on en fait un petit script.

On rend le script exécutable par l’utilisateur qui va le lancer (cet utilisateur doit bien entendu avoir le droit de lire se qu’il va sauvegarder !!) et on place les droits de lecture qui vont bien (il peut y avoir des mots de passe, donc ce fichier ne doit pas être lisible par n’importe qui).

L’objectif est d’obtenir un fichier unique contenant nos données.

Exemples de scripts

Voici quelques exemples de scripts. Ils sont à adapter en fonction de vos besoins et de vos outils.

Toutes les bases d’un serveur MySQL

#!/bin/bash
pwd=`pwd`
bkp_serveur='adresse_du_serveur_mysql'
bkp_user='compte_mysql_avec_les_bons_droits'
bkp_password='son super password bien compliqué'
bkp_dossier_destination='/backups/mysql'
bkp_fichier_destination=$bkp_dossier_destination/all-databases.sql.gz
cmd_archive='/bin/gzip'
cmd_mysqldump='/usr/bin/mysqldump'

mkdir -p $bkp_dossier_destination
cd $bkp_dossier_destination
$cmd_mysqldump -h $bkp_serveur -u $bkp_user -p$bkp_password --all-databases | $cmd_archive --rsyncable > $bkp_fichier_destination
chmod 600 $bkp_fichier_destination
cd $pwd

Un dossier complet avec tar

#!/bin/bash
pwd=`pwd`
bkp_source='/chemin/de/la/source /une/autre/source'
bkp_exclude='--exclude /chemin/de/la/source/temp'
bkp_dossier_destination='/backups/documents_importants'
bkp_fichier_destination=$bkp_dossier_destination/documents_importants.tgz
cmd_archive='/bin/tar'

mkdir -p $bkp_dossier_destination
cd $bkp_dossier_destination
$cmd_archive zcf $bkp_fichier_destination $bkp_source $bkp_exclude
chmod 600 $bkp_fichier_destination
cd $pwd

Un dossier complet avec dar

#!/bin/bash
pwd=`pwd`
bkp_source='/chemin/de/la/source'
bkp_dossier_destination='/backups/documents_importants'
bkp_fichier_destination=$bkp_dossier_destination/documents_importants.dar
cmd_archive='/usr/bin/dar'

mkdir -p $bkp_dossier_destination
cd $bkp_dossier_destination
$cmd_archive -c $bkp_fichier_destination -R $bkp_source -w -y -P 'dossier_temporaire' -X '*.tmp' -Z '*.gz' -Z '*.png'
chmod 600 $bkp_fichier_destination
cd $pwd

Tester nos scripts

Avant de rendre tout ça automatique, on test nos différents scripts afin de vérifier que tout fonctionne.

On exécute les différents scripts puis on vérifie que les données résultantes sont bien sauvegardées et intègres (une sauvegarde qui n’est pas utilisable ça ne sert pas à grand chose).

Planification des sauvegardes

Rien de plus simple, on créer une tache planifiée qui va s’occuper de lancer nos scripts de manière périodique => une simple tache cron fera très bien l’affaire

Il faut bien entendu avoir une bonne idée de la périodicité à utiliser (tous les jours, toutes les semaines, …).

La méthode présentée ici ne sait (directement) travailler qu’avec les unités de temps suivantes : jour, semaine, mois.

Exemples :

@daily /mon/script/qui/se/lance/touslesjours.sh
@weekly /mon/script/qui/se/lance/touteslessemaines.sh

Rotation

On va faire simple, plutôt que d’écrire un script qui va gérer la rotation de nos sauvegardes, on va utiliser un outil standard et éprouvé : logrotate

De base dans tous les systèmes Linux, cet outil permet de faire une rotation des fichiers de logs dans /var/log et donc d’éviter de se retrouver avec des fichiers de plusieurs To (déjà vu).

Fonctionnement

Comme un bon exemple vaut mieux qu’un long discours, voici comment logrotate traite le fichier /var/log/syslog :

  1. /var/log/syslog.3.gz -> /var/log/syslog.4.gz
  2. /var/log/syslog.2.gz -> /var/log/syslog.3.gz
  3. /var/log/syslog.1 -> /var/log/syslog.2.gz
  4. /var/log/syslog -> /var/log/syslog.1
  5. création d’un fichier vide /var/log/syslog (il demande au daemon syslog de le faire)

Utilisation avec nos sauvegardes

Pour que logrotate travail avec nos sauvegardes, il faut simplement les déclarer dans sa configuration (le fichier de configuration accepte d’inclure d’autres fichiers de configuration définis avec « include »).

Voici un exemple de configuration (beaucoup des paramètres sont ceux par défaut, donc peuvent être retirés) :

/backups/mysql/all-databases.sql.gz {
    daily
    dateext
    rotate 56
    nocompress
    nocopytruncate
    ifempty
    nomissingok
    nocreate
    noolddir
    nomail
    extension .sql.gz
}

Les actions réalisées sont les suivantes :

  • daily : la rotation doit être effectuée tous les jours
  • dateext : au lieu d’avoir un nombre (1, 2, 3, …), on demande d’utiliser une date (par défaut au format YYYYMMDD)
  • rotate n : nombre de versions à conserver (ici 56 jours)
  • nocompress : on demande de ne pas compresser les versions
  • nocopytruncate : ne pas réduire le fichier à zéro après la copie
  • ifempty : fait la rotation même si le fichier est vide
  • nomissingok : déclenche une erreur (non bloquante) si le fichier n’existe pas, ça peut être utile pour détecter une sauvegarde qui ne s’est pas effectuée
  • nocreate : on ne recréé pas le fichier d’origine (/backups/mysql/all-databases.sql.gz dans mon exemple)
  • noolddir : on ne déplace pas les versions dans un autre dossier
  • nomail : ne pas envoyer les nouvelles versions par mail (ça risque de faire de gros messages sinon)
  • extension .sql.gz : permet de conserver l’extension du fichier à la fin du nom (par défaut fichier.toto devient fichier.toto-YYYYMMJJ)

Vous pouvez (devez ?) les adapter en fonctions de vos besoins, il existe plusieurs autres paramètres, je ne vais pas les lister ici, le man est suffisamment explicite.

Certains paramètres peuvent être utiles comme « compress » (qui permet de compresser les versions), ou « prerotate » et « postrotate » (qui permettent de lancer des commandes avant et après la rotation).

Ils peuvent aussi être gênants, voir dangereux si ils sont mal utilisés. Le paramètre « compress » par exemple, si on demande à logrotate de compresser une sauvegarde de plusieurs centaines de Go, le processus de rotation va prendre un temps certain (cela va décaler la rotation des logs suivants de plusieurs minutes, voir de plusieurs heures si vos disques ne suivent pas).

Rotations plus rapides

Plus haut j’ai indiqué que logrotate travaillait au mieux une fois par jour. Ce comportement est simplement du au fait qu’il est lancé par une tâche cron de type @daily, donc qui s’exécute une fois par jour.

La commande logrotate peut aussi être appelée directement :

  • dans une tâche cron planifiée toutes les n minutes
  • dans une tâche incron qui détecte la création de votre nouvelle sauvegarde
  • directement dans le script de sauvegarde

Il suffit de définir vos paramètres de rotation dans un fichier de configuration séparé et d’appeler ce fichier en paramètre de logrotate. Par exemple :

logrotate /usr/local/etc/rotationsauvegardes.conf

Le plus important pour la fin

Tester ses sauvegardes

Une sauvegarde qu’on ne peut pas restaurer n’est pas une sauvegarde => testez régulièrement vos sauvegardes.

Voici quelques exemples :

  • base de données : le plus simple reste de restaurer le dump sur un autre serveur puis de comparer les données
  • archive générique : une extraction partielle (ou complète) sur un autre support et une comparaison des données (diff est très bien pour ça) permet de faire le test
  • archive tar ou dar : les 2 commandes disposent d’options permettant de tester l’intégrité d’une archive

Exporter ses sauvegardes

Une sauvegarde qui reste au même endroit que sa source (même machine, ou pire, même disque) n’est pas fiable. Si votre serveur est effacé (accident, malveillance, …), vos sauvegardes le seront aussi.

A titre d’illustration, au travail nous procédons comme suit :

  1. sauvegardes locales : la plupart des serveurs font eux mêmes leurs sauvegardes, qu’ils stockent en local (pratique pour faire une restauration rapide en cas de perte de données)
  2. copie distante : certains serveurs copient la dernière sauvegarde sur un autre serveur (situé dans une autre salle machine, ce serveur est aussi sauvegardé à l’étape suivante)
  3. sauvegarde distante : tous les serveurs importants sont aussi sauvegardés par un système autonome constitué de plusieurs répliques (situées dans des salles machines différentes)
  4. sauvegardes critiques : en complément, les données les plus critiques sont aussi copiées hors site et hors ligne (la bonne vieille méthode des bandes/dat/… que l’on met au coffre)

Donc toutes nos données importantes existent au moins en 3 exemplaires (active, sauvegarde locale et sauvegarde distante), certaines de nos données se retrouvent en 6 exemplaires (3+copie distante, sauvegarde de la copie distante et coffre), sans compter les différentes versions !

Pour une utilisation plus « raisonnable », vous pouvez, dans la plupart des cas, vous contenter de faire régulièrement des sauvegardes distantes de vos sauvegardes locales.

A titre personnel, j’utilise beaucoup rsync pour ça, mais un simple serveur ftp peut faire le travail.

Conclusion

Il existe bien sur plein d’autres manières de faire. Vous devriez par exemple faire vos sauvegardes sur un autre système (mount, rsync, ssh, … le permettent très facilement). Au lieu de faire des sauvegardes complètes, l’utilisation de l’incrémental (à utiliser avec précaution si on fait des rotations) ou du différentiel (idem) peut s’avérer plus efficace (moins consommateur en espace disque et généralement plus rapide).

De même vous pouvez utiliser des outils dédiés (bacula, TimeNavigator, Back In Time, …) qui vont souvent bien plus loin mais qui sont aussi souvent assez complexe à utiliser (pour ne pas dire indigeste, ex : TimeNavigator).

Faire des sauvegardes n’a rien de compliqué et ne nécessite pas nécessairement l’utilisation d’outils complexes.

Les systèmes Unix, Linux en particulier, sont suffisamment souples pour permettre toutes sortes d’automatisations alors il ne fait pas s’en privé.

Mémo – Juniper NetworkConnect 64bits

Un petit mémo pour configurer un client Linux en 64bits afin que le client VPN Juniper NetworkConnect fonctionne.

————update————

Juniper a mis à jour son client NetworkConnect (depuis la version 7.3) pour qu’il prenne en charge les systèmes 64bits. Il continu à s’exécuter en 32bits, mais la manipulation a changé.

L’article a été mis à jour en conséquences avec plus de détails.

————————————

Installation de JAVA

On commence par installer les 2 versions de JAVA (32 et 64bits), par exemple dans :

  • java 7 32bits : /opt/java/32/…
  • java 7 64bits : /opt/java/64/…

On les déclare au niveau système, sur la plupart des distributions c’est à faire avec update-alternatives –install /usr/bin/java java <chemin vers l’exécutable java> <priority> :

update-alternatives --install /usr/bin/java java /opt/java/32/jdk7/jre/bin/java 327
update-alternatives --install /usr/bin/java java /opt/java/64/jdk7/jre/bin/java 647

Les chemins peuvent changer selon que vous installez le jdk ou la jre.

On spécifie la version de java à utiliser par défaut (normalement celle en 64 bits) :

update-alternatives --config java

Installation des lib 32

Comme le client est en 32bits, il a besoin des librairies 32bits :

Debian (ou dérivée) par trop ancienne :

ln -s /usr/bin/update-alternatives /usr/sbin/
dpkg --add-architecture i386
aptitude update
aptitude install libstdc++6:i386 lib32z1 lib32ncurses5 lib32bz2-1.0 libxext6:i386 libxrender1:i386 libxtst6:i386 libxi6:i386

Debian (ou dérivée) plus ancienne :

aptitude install ia32-libs

Pour RedHat (et ses dérivées) :

yum –y install xterm
yum –y ld-linux.so.2
yum –y libstdc++.so.6
yum –y libz.so.1
yum –y libXext.so.6
yum –y libXrender.so.1
yum –y libXtst.so.6

Pour les SuSE (et ses dérivées) :

zypper install libXi.so.6

Firefox

Pour que Firefox prenne en charge votre nouvelle installation de JAVA il peut être nécessaire de déclarer le plugin JAVA. Normalement update-alternatives s’en occupe, sinon il faut créer un lien dans le dossier des plugins de Firefox, par exemple :

mkdir -p ~/.mozilla/plugins/
ln -s /opt/java/64/jdk7/jre/lib/amd64/libnpjp2.so ~/.mozilla/plugins/libnpjp2.so

NetworkConnect

Juniper SA >= 7.3

Normalement c’est fini.

Juniper < 7.3

On renomme le binaire java 64 en, par exemple, java.orig :

mv /opt/java/64/jdk7/jre/bin/java /opt/java/64/jdk7/jre/bin/java.orig

On créé un nouveau script nommé java au même endroit :

#!/bin/bash
if [ $3x = "NCx" ]
then
/opt/java/32/jdk7/jre/bin/java "$@"
else
/opt/java/64/jdk7/jre/bin/java.orig "$@"
fi

Il ne reste plus qu’à rendre le script exécutable :

chmod a+x /opt/java/64/jdk7/jre/bin/java

En cas de problèmes

Si le client ne fonctionne toujours pas, vérifiez que votre installation de JAVA fonctionne correctement :

En cliquant ici

Avec cette commande :

java -version

En consultant les logs de NetworkConnect (dans ~/.juniper_networks).

sources :

DKIM – Signer ses mails

Je ne vais pas décrire ce qu’est DKIM, ni à quoi ça sert, d’autres le font bien mieux que moi :
Blog Stéphane Bortzmeyer

Il s’agit juste d’un mémo expliquant comment signer les messages sortants, la vérification des mails entrants ne sera pas abordée ici, disons simplement qu’il existe des modules dans la plupart des antispam.

Je note juste ici un exemple de configuration avec dkim-filter et Postfix sur une Debian Squeeze.

On part d’un postfix bien configuré qui envoi directement ses mails sur Internet.

On commence par installer le paquet dkim-filter
apt-get install dkim-filter

Puis on créé un certificat qui va nous servir à signer les mails

mkdir /etc/postfix/dkim/
cd /etc/postfix/dkim/
openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key
chmod 640 private.key
chown dkim-filter private.key

On configure dkim-filter
/etc/default/dkim-filter :

SOCKET="inet:12345@localhost"

/etc/dkim-filter.conf

#On log les actions dans le syslog
Syslog yes
#Utile si vous passez par un socket UNIX
UMask 002
#Les domaines à signer (on peut utiliser un fichier)
Domain mondomaine.tld
#La clef privée, s'il faut signer plusieurs domaines avec plusieurs clefs,
#il faut utiliser le paramètre KeyList à la place de Domain/KeyFile et Selector
KeyFile /etc/postfix/dkim/private.key
#Le selector à utiliser pour vérifier la signature
Selector monselector
#La liste des domaines/ip à signer mais pas à vérifier
InternalHosts /etc/postfix/dkim/InternalHosts.list
#La liste des domaines/ip à ignorer (pas de signature ni de vérification)
PeerList /etc/postfix/dkim/PeerList.list
#On supprimes les anciennes signatures dans le message (en cas de relai)
RemoveOldSignatures yes
#Ces 2 paramètres peuvent être utile pour débugguer
X-Header no
LogWhy no

/etc/postfix/dkim/InternalHosts.list

127.0.0.0/8
192.168.1.0/24

/etc/postfix/dkim/PeerList.list

192.168.2.0/24

S’en est fini de la configuration de dkim-filter, il faut maintenant dire à postfix de l’utiliser :
/etc/postfix/main.cf

smtpd_milters = inet:localhost:12345
non_smtpd_milters = inet:localhost:12345

On relance les 2 daemons

/etc/init.d/dkim-filter restart
/etc/init.d/postfix restart

et on test l’envoi de mails, normalement une signature devrait être présente dans l’entête des messages sortants du serveur.
Si c’est correct, on peut ajouter l’enregistrement DNS contenant la clef public

; DKIM du selector monselector pour le domaine mondomaine.tld
monselector._domainkey.mondomaine.tld. IN TXT "v=DKIM1; k=rsa; p=Afd5g46fdg46fIGfM...9zwIDAQAB"

On peut alors tester en conditions réelles l’envoi de mails vers une domaine qui supporte la vérification DKIM (gmail par exemple)
S’il n’y a pas d’erreurs, on peut ajouter un enregistrement ADSP (Author Domain Signing Practices) dans les DNS, attention, l’enregistrement suivant indique que TOUS les messages non signés venant de mondomaine.tld doivent être jetés !!

; Politique DKIM pour mondomaine.tld
_adsp._domainkey.mondomaine.tld. IN TXT "dkim=discardable"

Cette configuration ne doit pas être installée en production, elle est très incomplète et potentiellement dangereuse pour vos mails !!!
Il s’agit juste d’un mémo, pour le reste RTFM.

sources :