Exemple de configuration du service firewall dans OSX 10.8 serveur

{0 Comments}

Firewall

L’une des configurations les plus répandues pour les serveurs OSX  dotés de deux cartes Ethernet et proposant des services sur internet, prévoyait l’utilisation du service firewall pour séparer et protéger le port LAN ou DMZ du port muni d’ IP publique.

Cette configuration était facilement réalisable par le biais du logiciel « Server Admin » et l’utilisation des options de filtrage par groupe d’adresses proposées par ce même logiciel.

Je vais essayer de montrer dans l’exemple qui suit comment parvenir au même résultat en utilisant le firewall de Mountain Lion serveur.

Cet exemple simpliste a comme but de présenter la nouvelle logique de paramétrage et est donc exempt de toute velléité d’optimisation: pour une description de toutes (les multiples et variés) possibilités de ce puissant firewall je vous encourage à vous référer à la documentation officielle de ce produit à cette adresse : http://www.openbsd.org/faq/pf/

En effet OS X 10.8 Serveur marque un changement important au niveau de ce  service , du point de vue de l’administration (exit le GUI dédie, mis à part l’administration partielle par Systèmes Preferences/sécurité), comme du point de vue technique :

ipfw qui était le moteur du firewall jusqu’à la version 10.7 est déclaré obsolète par Apple en faveur de pf (Pour les informations officielles concernant ce changement veuillez vous référer à cette kb http://support.apple.com/kb/HT5413?viewlocale=fr_FR )

Tous les automatismes de l’OS lié au firewall sont désormais préparamétrés par Apple dans les fichiers de configuration de ce dernier.

Pour obtenir le même résultat que pour 10.7 il faut, donc intervenir au niveau de ces fichiers

Avant toute opération d’édition, il faut vérifier qu’une erreur de jeunesse encore présente à l’heure actuelle dans la version 10.7.4 et 10.8.2 est corrigée selon la kb : http://support.apple.com/kb/TS4418

(Cette erreur de « trailing slash » est bloquante et silencieuse: sans la correction citée, aucune règle supplémentaire ne sera prise en charge par le firewall)

Une fois cette vérification effectuée nous pouvons passer à l’édition de fichiers de configuration afin d’obtenir une règle qui nous permet de ne pas rendre publique et donc vulnérables les services critiques et ne publier que les services souhaités.

Il est important de signaler que nous n’allons pas écrire un fichier de configuration standard puisque Apple a déjà préconfiguré les fichiers pf.conf et pf.anchors pour s’intégrer aux autres services de sécurité (ALF et Gatekeeper) ainsi qu’aux autres services réseau (Partage, NAT) de l’OS

Le fichier /etc/pf.conf comme préconfiguré en 10.7 et 10.8 à l’heure actuelle :

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

Fichier /etc/pf.anchors/com.apple comme préconfiguré en 10.7 et 10.8 à l’heure actuelle :

scrub-anchor "100.InternetSharing/*"
scrub-anchor "300.NetworkLinkConditioner/*"
nat-anchor "100.InternetSharing/*"
rdr-anchor "100.InternetSharing/*"
anchor "100.InternetSharing/*"
anchor "200.AirDrop/*"
anchor "250.ApplicationFirewall/*"
dummynet-anchor "300.NetworkLinkConditioner/*"
anchor "300.NetworkLinkConditioner/*"
anchor "400.AdaptiveFirewall/*"
load anchor "400.AdaptiveFirewall" from "/Applications/Server.app/Contents/ServerRoot/private/etc/pf.anchors/400.AdaptiveFirewall"

La partie LAN comme l’on peut constater par le fichier pf.conf est parfaitement prise en charge par les règles préconfigurées.

En effet OSX utilisé des entrées pf_anchor dans un souci de fonctionnalité et organisation des règles selon les services activés.

En partant du principe que le port en0 soit celui dédié au LAN ou DMZ et en1 à l’IP publique, dans cet exemple nous allons simplement ajouter à notre tour un anchor  contenant  un set d’actions relatives à notre port Ethernet externe en1 à fin d’obtenir le même résultat que la configuration précédemment exposée pour 10.7. (simplement au lieu de nous appuyer sur le groupe d’adresses nous allons intervenir au niveau du port)

Nous allons, donc, créer un « anchor » qui stipule que tout le trafic sur le port externe IP public est bloqué sauf pour les services qu’on autorise explicitement.

Pour ce faire nous allons créer un fichier dans /etc/pf.conf que nous allons nommer 500.IpPub (sudo nano /etc/pf.anchors/500.IpPub dans le Terminal) qui contient les déclarations suivantes :

ip_pub = "en1"
block in on $ip_pub all

Ces lignes permettent de bloquer TOUT le trafic entrant sur le port public.
Nous allons le compléter avec les déclarations permettant d’autoriser uniquement les ports nécessaires selon les protocoles souhaités (pour connaitre les ports utilisés par les différents services, veuillez vous référer à ces kb : http://support.apple.com/kb/ts1629 et http://support.apple.com/kb/HT5302)

pass in log quick on $ip_pub proto { tcp, udp } from any to port 548 keep state
pass in log quick on $ip_pub proto { tcp, udp } from any to port 80 keep state

Dans cet exemple nous permettons uniquement les partages de fichier AFP et le serveur web.
Notre set de règles est prêt.

Nous allons le lier à la configuration Apple préexistante.
Pour ce faire nous allons ajouter les lignes suivantes dans le fichier pf.anchors

anchor « 500.IpPub/* »
load anchor « 500.IpPub » from « /etc/pf.anchors/500.IpPub »

Une fois les règles posées et la liaison effectuée il est fondamental de les faire contrôler (sanity check) par le firewall pour s’assurer qu’elles soient correctes.

En effet, le cas échéant, le service pf ne démarre pas et aucun signal ou erreur ne permet de déceler l’état d’arrêt (Silent error)

Pour contrôler la configuration :

sudo pfctl -v -n -f /etc/pf.conf

Si les fichiers sont corrects la ligne de commande va énumérer les réglés, en cas d’erreur elle retournera la section compromise à corriger.

Une fois validées, nous pouvons les charger dans le firewall avec les arguments :

sudo pfctl -f /etc/pf.conf

Nous pouvons finalement démarrer le service :

sudo pfctl -e

Dernière étape : s’assurer avec les lignes de commande suivantes que le service soit automatiquement activé au démarrage du serveur.

(Pour la documentation officielle sur la procédure d’activation automatique, au démarrage veuillez vous référer à cette kb : http://support.apple.com/kb/HT5519)

sudo defaults write /System/Library/LaunchDaemons/com.apple.pfctl ProgramArguments '(pfctl, -f, /etc/pf.conf, -e)'
sudo chmod 644 /System/Library/LaunchDaemons/com.apple.pfctl.plist
sudo plutil -convert xml1 /System/Library/LaunchDaemons/com.apple.pfctl.plist

Annotations en marge:

OS X 10.8 ne propose plus d’interface graphique pour la gestion du firewall, néanmoins, une application répandue et gratuite est disponible à cette adresse http://www.hanynet.com/icefloor/

Un magnifique exemple de configuration avancée est disponible dans le github de H. Juutilainen https://github.com/hjuutilainen/pf-conf#readme : il s’agit d’ un set de regles et macros PF qui se « greffent » par include sur la configuration par défaut avec un lanceur personnalisé, le tout sous former de paquet prêt au déploiement. (!)

 

Leave a Comment

Your email address will not be published.

*