Catégories
Open-source Reseau Systeme

Autoriser le FTP avec un firewall PF

Si comme moi, vous utilisé la couche PF (sous OS BSD) pour protéger votre réseau des attaques extérieures, la problématique de la compatibilité du protocole FTP avec la translation d’adresse NAT devrait se poser à vous.

Nous allons donc dans ce billet voir comment configurer votre Firewall PF comme un proxy FTP efficace.

Un peu de théorie…

Si vous avez déjà eu à coder des règles de Firewall pour le protocole FTP (actif ou passif), vous savez que cela nécessite l’ouverture d’un grand nombre de ports TCP. L’idée développé dans ce billet est de passer par un mandataire (un proxy hébérgé sur votre Firewall écoutant sur le port TCP 8021) qui va effectuer les requêtes FTP à la place de votre client.

FTP proxy - Nicolargo.png

Installation de ftp-proxy

ftp-proxy est un daemon fourni en standard avec les OS BSD. Pour le lancer au démarrage du Firewall, il faut ajouter les lignes suivantes à votre fichier /etc/rc.conf:

# FTP Proxy

ftpproxy_enable= »YES »

ftpproxy_flags= »-a @IP-PUBLIQUE« 

ou vous allez remplacer @IP-PUBLIQUE par l’adresse IP publique de votre Firewall. Il est possible de changer le port d’écoute par défaut de ftp-proxy en utilisant l’option -.

Pour lancer le daemon:

/etc/rc.d/ftp-proxy start

Configuration de PF pour utiliser ftp-proxy

La première chose est de configurer les règles de NAT et de PAT en utililisant les ancres pré-définies pour ftp-proxy. Pour cela, il faut ajouter les deux lignes suivantes dans la section NAT de votre fichier /etc/pf.conf.

nat-anchor « ftp-proxy/* »

rdr-anchor « ftp-proxy/* »

Nous allons ensuite forcer les paquets TCP de vos clients (venant de votre LAN) ayant comme port de destination 21 à être re-routé vers le daemon ftp-proxy qui écoute sur le port 8021.

rdr pass proto tcp from any to any port 21 -> 127.0.0.1 port 8021

Ensuite, on autorise dans la section règles de votre fichier /etc/pf.conf, les flux FTP partant de votre Firewall.

anchor « ftp-proxy/* »

pass out proto tcp from self to any port 21

Conclusion

Voici donc un moyen simple et efficace de gérer vos connections FTP sortantes. ftp-proxy peut également être utilisé pour gérer les accès entrants vers un serveur FTP hébergé sur votre réseau local. J’y reviendrai certainement dans un prochain billet.

Catégories
Open-source Reseau

De IPFW à PF

istockphoto_143506_burning_fire_wall.jpgFidèle utilisateur de l’operating système FreeBSD pour toutes les fonctions réseaux (notamment les Firewall), je suis tombé il y a quelques temps sur un problème d’interopérabilité entre l’utilisation du couple CARP/PFSYNC (le truc pour faire de la redondance de Firewall) avec IPFW.

J’ai donc décidé de switcher de IPFW vers PF. Je vais donc abordé dans ce billet les quelques choses à avoir en tête si vous suivez le même chemin… Si vous souhaitez vous formez sur PF, je vous conseille la lecture de l’excellent article paru dans Linux Magazine HS n°29, dont vous trouverez une version électronique ici.

Un peu d’histoire

IPFW (IPFireWall) est un module logiciel permettant de faire du filtrage de paquets réseau sous BSD (c’est actuellement le module de firewall utilisé par défaut sous Mac OS X).

Jusqu’à la version 3.0 de OpenBSD, ce module était intégré par défaut au noyau du système, mais de sombres histoires de licences et de batailles interne entre Darren Reed (l’auteur de IPFW) et les développeurs d’OpenBSD ont débouché par son remplacement par PF (Packet Filter).

PF est maintenant fourni en standard sur l’OS FreeBSD (depuis la version 5.3).

Les principales différences entre IPFW et PF

Voici une liste non-exhaustive:

  • le fichier de configuration unique (/etc/pf.conf) comprend, la définition des règles (comme sous IPFW) mais aussi la configuration du NAT et du PAT (délégué au processus IPNAT avec IPFW)
  • comportement atomique du chargement de la configuration: si une erreur est détectée dans le fichier de configuration, aucune règle n’est appliquée
  • l’interprétation des règles est de type “last matching rules wins”: la dernière règle qui correspond au paquet est appliquée
  • le suivi de connexions complexes comme FTP se fait via un module externe (ftp-proxy)
  • il est possible de rediriger les paquets en fonction de l’OS émetteur (ne marche pas dans tout les cas de figures)
  • assure une compatibilité native avec CARP et PFSYNC pour faire de la redondance active de Firewall

Architecture du fichier de configuration /etc/pf.conf

Le fichier comporte plusieurs sections (l’ordre est important).

1) Définition des macros, listes et des tables

En plus des listes (comme sous IPFW), il est possible d’utiliser des tables pour stocker des adresses IP. L’avantage des tables par rapport aux listes est la rapidité d’accès à l’information. En effet, basées sur des tables de hachage, le temps pour accéder à une information est constant quel que soit la taille de la table. De plus il est possible de modifier dynamiquement ces tables (à l’aide de la commande “pfctl -t …”) sans avoir à recharger les règles.

Quelques exemples de macros:

Définition

ip_interne=”192.168.1.254”

ip_externe=”80.80.80.80”

Utilisation dans les règles

pass quick proto tcp from $ip_interne to any port 80

pass quick from $lan_interne to any keep state

Quelques exemples de listes:

Définition

lan_interne=”{ 192.168.1.0/24 192.168.2.0.24 }”

lan_interne_saufdmz=”{ 192.168.1.0/24 192.168.2.0.24 !192.168.2.0/29 }”

web_ports=”{ http https ftp }”

Utilisation dans les règles

pass quick from $lan_interne to any keep state

Quelques exemples de tables:

Définition

table <ip_clients> “{ 192.168.1.10 192.168.1.100 }”

Utilisation

pass quick from <ip_clients> to any keep state

Modification de la table

pfctl -t ip_clients -T add 192.168.1.101

pfctl -t ip_clients -T delete 192.168.1.101

2) Options et normalisation des paquets

Personnellement, j’utilise les options suivantes:

# On ne filtre pas sur l’interface locale

set skip on lo

# En cas de blocage, on envoie un RST sur les paquets TCP

# et UNREACHABLE sur les ICMP

set block-policy return

# On normalise les paquets avec gestion de la fragmentation

scrub in all fragment reassemble

3) Gestion des queues pour la QoS

Permet de faire de la qualité de service: CBQ, Priorité et HFSC. Il faut cependant passer par un module externe: altq.

Je reviendrai sûrement sur ces fonctions 12c4.

4) Translation d’adresse (NAT) et re-direction de ports (PAT)

Contrairement à IPFW qui ne gérait pas la translation d’adresse et de port (il fallait utiliser IPNAT), PF s’acquitte parfaitement de ces taches. La syntaxe est très proche de celle utilisée par IPNAT.

Exemple de NAT:

nat pass on eth0 from eth1:network to any -> $ip_externe

On notera l’utilisation de la macro eth1:network qui donne le réseau associé à l’interface réseau eth1

binat on $if_externe from 192.168.1.100 to any -> 80.80.80.81

Exemple de PAT:

rdr on $if_externe from any to $ip_externe port 8080 -> $ip_serveur port 80

5) Règles de filtrage

On entre (enfin ?) dans le vif du sujet avec l’adaptation des règles de IPFW vers PF.

La première chose à se rappeler est que l’interprétation des règles est de type “last matching rules wins”: la dernière règle qui correspond au paquet est appliquée. C’est le contraire de la logique que l’on suivait avec IPFW. Cependant, si comme moi vous avez du mal à réfléchir à l’envers, il reste la possibilité d’utiliser l’option quick. Quand cette dernière est présente dans une règle, PF arrête l’interprétation des règles suivantes.

L’option permettant de faire du suivi de connexion (sur TCP mais aussi sur UDP ou tout autre protocole IP) est “keep state” (attention c’était “keep-state” avec un – sous IPFW…). Cette option est maintenant ajouté par défaut sur les OS BSD (depuis OpenBSD 4.0 et FreeBSD 7.0).

Exemple de filtres:

pass in on $int_if from $internal_net to any

pass out on $ext_if proto tcp all modulate state flags S/SA

pass out on $ext_if proto { udp, icmp } all keep state

pass in on $ext_if inet proto tcp from any to $webserver port 80 flags S/SA synproxy state

Gestion de votre nouveau Firewall PF

La gestion de la configuration de votre Firewall PF se fait via l’utilitaire pfctl.

Quelques commandes utiles:

Vérification de la syntaxe du fichier /etc/pf.conf

pfctl -n -f /etc/pf.conf

Activation du filtrage:

pfctl -e

Dés-activation du filtrage:

pfctl -d

Rechargement des règles:

pfctl -f /etc/pf.conf

Affichage des règles de filtrage:

pfctl -s rules

Affichage des NAT et PAT:

pfctl -s nat

Affichage l’état des sessions existantes (connections):

pfctl -s state

Affichage du fichier de log (pour voir les paquets rejetés):

tcpdump -r /var/log/pflog

ou bien:

tcpdump -i pflog0 -qea -ttt

Conclusion

Je dois vous avouer que j’étais très réticent pour ce passage de IPFW et PF mais après quelques heures d’utilisations je pense que ce système de filtrage est très bon et aussi facile à administrer (en tout cas beaucoup plus simple que l’usine à gaz IPTABLES… je sais je troll…).

Catégories
Open-source Reseau

Redondance de firewall sous FreeBSD

Dans une infrastructure réseau, le firewall est souvent le point central par lequel l’ensemble des flux transite. C’est donc un SPOF (« single point of failure » ou « point individuel de défaillance ») de votre système d’information. En effet, en cas de problème sur ce noeud, l’ensemble de votre réseau devient in-opérationnel (ce qui est impensable pour un administrateur réseau;)).

Ce billet fait suite à un autre: Installation d’un Firewall sous FreeBSD. Nous allons donc voir comment redonder notre cher Firewall en utilisant les protocoles CARP (« Common address redundancy protocol ») et PFSYNC (pour le synchronisation des règles PF). Pour cela, nous allons nous baser sur le réseau suivant afin d’illustrer notre article:

Architecture CARP.png

Comme on peut le voir, il faut donc deux machines pour effectuer cette redondance. La première (firewall-1) est celle utilisée par défaut. La seconde (firewall-2) prendra le relais en cas de problème sur la première. Il faut bien sûr mettre en place un système automatique de synchronisation des configurations entre les deux serveurs (sujet non abordé dans ce billet).

Catégories
Open-source Systeme

Mise à jour des ports sous FreeBSD

Une petite procédure toute simple pour mettre à jour l’arbre des ports de votre machine FreeBSD ainsi qu’une upgrade automatique des logiciels installés.

Mise à jour de l’arbre des ports

L’arbre en question se trouve normalement dans le répertoire /usr/ports. On va donc se rendre dans ce répertoire et lancer une mise à jour grâce à la commande:

cvsup -g -L 2 /usr/local/etc/cvsup/port-supfile

PS: vous pouvez remplacer le chemin du fichier port-supfile par un autre
PS2: si vous utiliser une version de FreeBSD >= 6, vous pouvez remplacer cvsup par csup (plus rapide car codé en C).

La mise à jour est assez longue et dépend de la rapidité de votre liaison Internet.

Upgrade de vos logiciels

Nous allons utiliser le script portupgrade qui s’occupe de:

  • détecter les logiciels à mettre à jour sur votre système
  • mettre à jour les logiciels

Pour installer portupgrade:

cd /usr/ports/port-mgmt/portupgrade && make install distclean

Pour lancer la mise à jour:

portupgrade -aRr

Et voili.

Catégories
Open-source Reseau Systeme

Supervision de vos serveurs FreeBSD avec Nagios et NRPE

En complément du billet sur la supervision des serveurs Linux, voici une simple procédure pour mettre en place le monitoring de serveurs sous FreeBSD (ou Mac OS X) à partir de Nagios en utilisant le plugin NRPE.

Catégories
Open-source Reseau Systeme

Installation serveur DHCP sous FreeBSD

procedure.jpgNous allons nous attaquer à la configuration d’un serveur DHCP (ISC DHCP Server) sous FreeBSD. Vous pouvez également utiliser en grande partie cette procédure sous GNU/Linux.

Rappel: le protocole DHCP permet la configuration automatique des paramètres IP des machines d’un réseau (plus de littérature sur le Wiki).

Introduction

ISC DHCP est un projet open-source disponible dans une suite qui comprend les éléments suivants:

  • le fameux serveur DHCPd
  • le client DHCPclient
  • un serveur de relais DHCPrelay

Cette suite est disponible sur la plupart des OS: Linux, BSD, Mac OS X et Windows.

La dernière version stable à la date de l’éecriture de ce billet est la 3.0.6

Installation du serveur DHCPd

Sous FreeBSD la procédure est la suivante:

# pkg_add -r isc-dhcp3-server

Pour les puristes, il est également de compiler le serveur à partir des sources.

Quelques trucs utiles à savoir avant la configuration

DHCP est un protocole servant à distribuer des configurations réseaux (c’est à dire adresse IP, masque, routes, serveurs DNS…) sur un réseau local. Il faut donc que le serveur et les clients se trouvent sur un même réseau de niveau 2. En clair, il ne doit pas y avoir de routeur IP entre le serveur et les clients. Si vous ne pouvez pas faire autrement, le serveur relais pourra vous être utile…

Si vous avez un Firewall entre votre serveur et vos clients, il faut veillez à ajouter les règles suivantes:

Autoriser les paquets UDP/67 (source UDP/68) entre l’adresse 0.0.0.0 et l’adresse 255.255.255.255

Autoriser les paquets UDP/68 (source UDP/67) entre le serveur et les clients

C’est à dire autoriser vos clients qui n’ont pas encore d’adresse IP (0.0.0.0) à envoyer sur le réseau une requête DHCP (UDP/67) vers toutes les machines du réseau (255.255.255.255) afin de chercher le serveur DHCP. Le serveur DHCP répond (UDP/68) en offrant un bail DHCP (c’est à dire une configuration IP valable un certain temps).

Sous FreeBSD, la règle IPFW correspondante est:

# ipfw add allow udp from 0.0.0.0 68 to 255.255.255.255 67 keep-state

# ipfw add allow udp from @SERVEUR 67 to any 68 keep-state

Configuration du serveur DHCP

Toute la configuration est centralisée dans le fichier dhcpd.conf. Nous allons donc commencer par archiver la configuration par défaut.

# mv /usr/local/etc/dhcpd.conf.sample /usr/local/etc/dhcpd.conf

Puis éditer notre fichier dhcpd.conf:

# vi /usr/local/etc/dhcpd.conf

# C’est bien le serveur DHCP principal

authoritative;

# Nom de domaine de votre réseau

option domain-name « monboreseau.com »;

# Adresses des serveurs DNS

option domain-name-servers ns1.monboreseau.com, ns2.monboreseau.com;

# Définition de la durée du bail

default-lease-time 600;

max-lease-time 7200;

# On logue les messages dans le syslog

log-facility local7;

# Définition des plages d’adresses dynamiques du LAN

subnet 192.168.1.0 netmask 255.255.255.0 {

range 192.168.1.100 192.168.1.200 ;

option routers 192.168.1.1 ;

option broadcast-address 192.168.1.255 ;

}

# Définition des machines statiques (les entrées doivent exister dans le serveur DNS)

# Attention, elles doivent être en dehors du range dynamique définie ci-dessus.

host mamachine {

hardware ethernet 00:11:09:1A:-:- ;

fixed-address mamachine.alcasat.net ;

}

Les opérations de base sur votre serveur DHCP

Démarrage du serveur (sous FreeBSD):

# /usr/local/etc/rc.d/isc-dhcpd start

Arrêter le serveur DHCP (sous FreeBSD):

# /usr/local/etc/rc.d/isc-dhcpd stop

Pour connaître la liste des baux (leases) en cours:

# cat /var/db/dhcpd.leases

Exemple:

lease 192.168.1.112 {

starts 2 2008/05/13 10:22:43;

ends 2 2008/05/13 10:32:43;

binding state active;

next binding state free;

hardware ethernet 00:08:02:f4:-:-;

uid « \001\000\010\002\364o\310 »;

client-hostname « port2 »;

}

Et la redondance ?

Si vous souhaitez avoir deux serveurs DHCP en redondance sur votre réseau, vous pouvez suivre cette procédure.

Catégories
Open-source Reseau Systeme

Installation d’un Firewall sous FreeBSD

daemon.jpg

L’OS FreeBSD est très bien classé en ce qui concerne la stabilité (voir le top des uptimes ici) et la qualité de son stack IP. C’est donc un candidat idéal pour y bâtir le routeur/firewall de votre réseau. Nous allons dans ce billet faire une installation “from scratch” d’un Firewall sous FreeBSD 7.0 et la configuration des services de bases.

Installation de FreeBSD depuis les sources

On insère le CD d’installationdans le lecteur et après le démarrage sur ce média, on lance une installation de type Custom avec les caractéristiques suivantes:

Partition: on choisi une partition libre sur un disque dur. On y installe le boot manager standard

Label: on met le label SWAP sur un disque de taille 2xRAM puis le label / sur le reste du disque

Distribution: on ne chipote pas et on selectionne la distribution Developer

Media: CD

Commit: On lance l’installation

Une fois l’installation faite, on reboote et on se logue avec l’utilisateur root (ne pas oublier de changer le password grâce à la commande passwd).

Catégories
Open-source Systeme

Comment maintenir son FreeBSD à jour

… ou comment refaire le monde…

freebsdlogo.jpeg

Comme tout système d’exploitation, la mise à jour est une action nécessaire pour la bonne stabilité/sécurité de votre FreeBSD. Celle-ci peut paraître compliquée, voici donc un billet qui détaille la mise à jour d’un système FreeBSD 6.x.

La première chose à faire est bien entendu de sauvegarder vos fichiers importants (mais je n’ai même pas à vous le dire ;)).

Ensuite, il faut télécharger la dernière version des sources. J’utilise pour ma part l’utilitaire cvsup:

# cvsup /etc/stable-supfile

Il faut alors se rendre dans le répertoire /usr/src et lire le fichier UPDATING. Ce dernier peut vous renseigner sur des changements préalable à faire sur votre système avant d’effectuer la mise à jour.

# cd /usr/src

# more UPDATING

Catégories
Systeme

Récupérer une partition FreeBSD sous Ubuntu

post-it.jpegUn petit pense-bête pour ceux qui souhaitent récupérer des fichiers sur une partition FreeBSD 5.x défectueuse.

J’ai utilisé le DVD d’installation d’Ubuntu (7.10), puis j’ai ouvert un terminal et saisie les commandes suivantes:

# sudo mkdir /mnt/freebsd
# sudo mount -t ufs -o ufstype=5xbsd -r /dev/sda1 /mnt/freebsd

Et voilà, il ne me restait plus qu’a insérer une clès USB et a y copier mes fichiers.

Catégories
Open-source Reseau

Comment surveiller son réseau avec le cochon Snort ?

Distribué sous licence open source (GPL), Snort est un IDS: c’est à dire un système de détection d’intrusion.

Souvent les réseaux (personnel ou d’entreprise) sont protégés par des Firewalls. Cette protection, bien que nécessaire, ne permet pas la détection des attaques extérieures. En effet, un Firewall est fait pour bloquer les flux réseaux non désirés tout en laissant passer le « trafic utile ». Deux problèmes peuvent se poser:

  • comment analyser à l’interieur d’un « trafic utile », les données potentiellement dangereuses (par exemple un script CGI contenant un virus).
  • comment se prévenir de attaques de type DOS (flood UDP).

Snort est une des réponses possible. Il va analyser, en temps réel, le trafic réseau, rechercher dans sa base de donnée des profils d’attaques connus et logger les résultats.

Nous allons donc dans ce billet installer Snort sur un routeur sous FreeBSD (mais la procédure est la même pour un OS de type Linux).

Installation de Snort

Snort est disponible dans les ports FreeBSD, il faut donc effecter les actions suivantes afin de le compiler sur votre système:

# cd /usr/ports/security/snort
# make WITH_MYSQL=YES WITH_FLEXRESP=YES install

Remarque: Sur Fedora, l’installation peut être effectuée avec la commande: « yum install snort »

Pour automatiser le lancement de Snort au démarrage du serveur FreeBSD, il faut éditer le fichier /etc/rc.conf et ajouter les lignes suivantes:

snort_enable= »YES »
snort_interface:= »bge0″

PS: il faut remplacer bge0 par le nom de l’interface qui se trouve du coté du réseau que l’on veut surveiller

Configuration de la base de donnée

Snort utilise une base de donnée pour stocker les attaques. Le schéma de la base de donnée se trouve dans le fichier ../usr/ports/security/snort/work/snort-<version>/schemas/create_mysql, il faut alors effectuer les taches suivantes sur la machine qui héberge votre serveur MySQL:

# mysql -u root -p
mysql> CREATE DATABASE snort;
mysql> GRANT ALL PRIVILEGES ON snort.* TO ‘snortuser’@’localhost’ IDENTIFIED BY ‘snortpassword’;
mysql> FLUSH PRIVILEGES;
# mysql -u root -p snort < ./create_mysql

Configuration de Snort

Le fichier de configuration par défaut se nomme snort.conf (sous FreeBSD dans /usr/local/etc/snort). Par rapport au fichier par défaut, j’ai juste modifié les deux lignes suivantes:

# vi /usr/local/etc/snort/snort.conf
var HOME_NET [192.168.1.0/24]
output database: log, mysql, user=snortuser password=snortpassword dbname=snort host=localhost
var SSH_PORTS 22
include $RULE_PATH/bleeding-all.rules

Il faut également mettre en commentaire toutes les autres lignes commencant par include « $RULE_PATH ».

Dans cette configuration, les attaques seront logger à la fois dans le fichier standard (/var/log/snort sous FreeBSD) et dans la base de donnée.

Initialisation des règles (attaques)

De nouvelles attaques apparaissant tous les jours, une mise à jour régulière des règles doit être effectuée. Direction le site officiel pour s’enregistrer en ligne et récupérer les dernières règles stables pour votre version de Snort.

Une fois les règles téléchargées (Sourcefire VRT Certified Rules – The Official Snort Ruleset (registered user release)), il faut les décompresser dans le répertoire /usr/local/etc/snort/rules.

Cette opération est à faire régulièrement, à chaque mise à jour des règles.

Lancement de Snort

On ajoute les options suivantes dans le fichier rc.d (sous FreeBSD):

# SNORT
snort_enable= »YES »
snort_interface= »em0″

Il ne reste plus qu’a lancer Snort.

Sous FreeBSD:
# /usr/local/etc/rc.d/snort start

Sous Fedora:
# service snort start

Comment exploiter les résultats

C’est très bien d’avoir un IDS en fonctionnement, mais maintenant comment voir et analyser les résultats…

Le plus rapide est d’aller voir le fichier alert (sous /var/log/snort). C’est ici qu’est logger la liste des attaques reconnus par vos règles.

Si vous voulez une interface plus « user friendly », vous pouvez utiliser Base, un autre outil open source proposant une interface Web pour l’analyse des logs venant de Snort.