Configurer une passerelle à authentification

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

OpenBSD, authpf, pf, passerelle, authentification

Introduction

Ce document décrit comment réaliser une authentification utilisateur sur une paserelle OpenBSD en utilisant le mécanisme authpf(8). Cette authentification permet de limiter l'accès à la passerelle, au réseau local et à Internet aux seuls utilisateurs authentifiés.

Une passerelle à authentification se comporte comme n'importe qu'elle passerelle, à ceci près qu'il est obligatoire de s'authentifier avant de pouvoir utiliser ses fonctionnalités de routage. Le principe de fonctionnement d'authpf(8) est assez simple. Un utilisateur sur un poste client se connecte sur la passerelle via SSH en utilisant un compte spécial (le shell de ce compte est positionné à /usr/sbin/authpf, et non pas à sh ou bash). Si l'authentification réussie, authpf(8) va effectuer les changements définis aux règles pf(4) courrantes (pass, block, rdr, nat, bi-nat). Dès que l'utilisateur ferme la session, authpf(8) décharge les règles, et supprime les états associés. Ainsi, l'accès n'est permis QUE durant le temps de la session SSH.

authpf(8) est utilisé ici pour limiter l'accès aux stations d'un réseau wifi, mais il peut servir pour tout type de réseau.

Présentation de la maquette

Les éléments suivants sont mis en oeuvre :

  • une passerelle sous OpenBSD. Cette machine est à la fois le routeur Internet du réseau local (filaire) et le point d'accès (“Access Point”) wifi.
  • un client wifi sous linux ou windows (ce dernier doit posséder un client ssh, par exemple putty)

Note

Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.

Pré-requis

Ce document suppose que les pré-requis suivants soient remplis :

  • un système OpenBSD installé et fonctionnel
  • un accès wifi fonctionnel sur la passerelle et sur le client
  • une certaine connaissance de 'pf(4)'

Créer un utilisateur spécifique

L'authentification sur la passerelle s'effectue via une connexion SSH sur un compte utilisateur spécifique. Avant tout, il faut créer ce nouvel utilisateur.

Modifier le fichier /etc/login.conf

Pour créer une nouvelle classe d'utilisateur, ajoutez les lignes suivantes au fichier /etc/login.conf :

#
# authpf authenticating gateway
#
authpf:\
        :welcome:/etc/motd.authpf:\
        :shell=/usr/sbin/authpf:\
        :tc=default:

Pour plus de détails, consultez la page de manuel login.conf(5).

Créer le nouvel utilisateur

Cet utilisateur est membre de la classe authpf, a pour groupe principal authpf et pour shell /usr/sbin/authpf.

Notez que le groupe authpf existe déjà sur le système :

# grep authpf /etc/group
authpf:*:72:

Créez un nouvel utilisateur de classe 'authpf' et avec pour shell /usr/sbin/authpf :

# useradd -L authpf -u 666 -g authpf -c "authpf user" -d /var/empty -s /usr/sbin/authpf  toto

# passwd toto

Configurer les règles pour authpf(8)

Attention, les permissions des fichiers de définition des règles de filtrage sont très importantes. Voici les règles à respecter :

Fichier Propriétaire Groupe Droits
/etc/pf.conf root wheel 600
/etc/authpf/* root authpf 640

Dans le cas contraire, la passerelle à authentification ne fonctionnera pas, ou ouvrira des failles de sécurité.

Modifier le fichier /etc/pf.conf

Il faut légèrement modifier les règles de pf(4) pour pouvoir utiliser authpf'8). Ajoutez aux sections adéquates du fichier /etc/pf.conf les règles suivantes :

nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"

Pour plus de précision, consultez les pages de manuel pf(4) et pf.conf(5).

Une fois la modification effectuée, recharger les règles pf(4) comme suit :

# pfctl -Fr -f /etc/pf.conf

Créer un fichier /etc/authpf/authpf.conf

Pourqu'authpf(8) puisse s'activer il faut impérativement que le fichier /etc/authpf/authpf.conf existe (même vide). Dans le cas contraire, les connexions seront refusées.

Pour créer un fichier /etc/authpf/authpf.conf vide, procédez comme suit :

# > /etc/authpf/authpf.conf
# chown root:authpf /etc/authpf/autpf.conf
# chmod 640 /etc/authpf/authpf.conf

Définir les règles à charger

Créer les fichiers de règles

Le fichier /etc/authpf/authpf.rules contient les règles de filtrage (pass, block) et de translation (nat, bi-nat, rdr) génériques à tous les utilisateurs authentifiés via authpf(8).

Si vous voulez définir des règles spécifiques à un utilisateur, il faut les renseigner dans le fichier /etc/authpf/users/$USER/authpf.rules. Si ce fichier existe, les règles définies vont écraser les règles génériques du fichier /etc/authpf/authpf.rules.

Ce document utilise uniquement le fichier générique : /etc/authpf/authpf.rules.

Attention, ces fichiers doivent-être lisibles par les utilisateurs authpf(8).

# chown root:authpf /etc/authpf/authpf.rules
# chmod 640 /etc/authpf/authpf.rules

Synthaxe des règles

Les règles de filtrage et de translation ont la même synthaxe que celles du fichier /etc/pf.conf, à une exeption près : authpf(8) permet l'utilisation de deux macros prédéfinies.

  • $user_ip - l'adressse IP de l'utilisateur authentifié
  • $user_id - le nom de l'utilisateur authentifié

Il est recommandé d'utiliser la macro $user_ip dans les règles pour n'autoriser le traffic à travers la passerelle que depuis la machine de l'utilisateur authentifié.

En plus de la macro $user_ip, authpf(8) utilise la table authpf_users (si elle définie dans le fichier /etc/pf.conf) pour stocker la liste des adresses IP de tous les utilisateurs authentifiés. Il est ainsi possible de définir des règles dans le fichier /etc/pf.conf uniquement pour les utilisateurs authentifiés via authpf(8).

Créer les fichiers d'accueil

Quand l'utilisateur est authentifié via authpf(8) et que les règles de pf(4) ont été chargées plusieurs messages apparaissent à la console. Tout d'abord, le contenu du fichier /etc/motd.authpf (défini par la ligne welcome du fichier /etc/login.conf), puis un message générique d'authpf(8) et enfin, le contenu du fichier /etc/authpf/authpf.message.

Pour créer un bandeau d'accueil, procédez comme suit :

Créer le fichier /etc/motd.authpf

Le nom de ce fichier est défini par la ligne welcome dans le fichier /etc/login.conf.

# echo "   **********************   " > /etc/motd.authpf

Message d'authpf

Par défaut, authpf(8) affiche ce message à la console :

Hello toto. You are authenticated from host "192.168.1.28"

Créer un fichier /etc/authpf/authpf.message

Voici un exemple de fichier /etc/authpf/authpf.message :

Vous etes maintenant autorise a utiliser le reseau Leaves.

/!\ Attention /!\
Surtout NE FERMER PAS cette fenetre.
L'acces est ouvert tant que cette fenetre est active.
Des qu'elle est fermee, l'acces est coupe.

   **********************   

Résultat

Une fois l'utilisateur authentifié, voici le message affiché :

   **********************   

Hello toto. You are authenticated from host "192.168.1.28"

Vous etes maintenant autorise a utiliser le reseau Leaves.

/!\ Attention /!\
Surtout NE FERMER PAS cette fenetre.
L'acces est ouvert tant que cette fenetre est active.
Des qu'elle est fermee, l'acces est coupe.

   **********************   

Modifier le fichier /etc/ssh/sshd_config

Dans certains cas, il est possible que le serveur SSH de la passerelle déconnecte le client sur inactivité. Pour forcer le serveur à tester réguilièrement la présence du client, ajouter les lignes suivantes au fichier /etc/sshd/sshd_config :

# Increase Timeout (60->120s) for Mac OS X clients
LoginGraceTime 120
PermitRootLogin no

ClientAliveInterval 15
ClientAliveCountMax 4

Puis, relancer le service sshd :

# pkill sshd
# /usr/sbin/sshd

Pour plus de détails, consultez la page de manuel de sshd_config(5).

Utiliser authpf

S'authentifier

Pour s'authentifier sur la passerelle, logez vous sur le poste client, ouvrez un terminal et exécutez la commande suivante :

user@client$ ssh toto@ip_de_la_passerelle
toto@ip_de_la_passerelle's password:

Encore une fois, il TRES important de ne pas fermer le terminal dans lequel l'authentification a eu lieu. Sinon, les règles chargées via authpf(8) ( *anchor “authpf/*” ) sont déchargées et les états supprimés. L'accès est donc coupé.

Voir qui est connecté

Une fois qu'un utilisateur s'est connecté et qu'authpf(8) a chargé les règles pf(4), authpf(8) change son nom de processus pour indiquer le nom et l'adresse IP de l'utilisateur connecté :

# ps -ax | grep authpf
23664 p0  Is+     0:00.11 -authpf: toto@192.168.1.28 (authpf)

Ici, l'utilisateur toto est connecté depuis la machine 192.168.1.28. Si un signal SIGTERM est envoyé à ce processus, l'utilisateur est déconnecté. authpf(8) supprime alors les règles et les tables états de pf(4) chargés pour cette connexion.

# kill -TERM 23664

Exemple

Voici un exemple d'intégration de pf(4) et d' authpf(8) :

fichier /etc/pf.conf

## MACROS ##
ext_if = "fxp0"     # interface wan
int_if = "xl0"      # interface lan
wifi_if = "wi0"     # interface wifi
servers = "{ 192.168.1.15, 192.168.2.1 }"

table <authpf_users> persist

scrub in all

## REGLES  ###

## NAT
# autorise le reseau local a acceder a internet
nat on $ext_if from $int_if:network -> ($ext_if)
# charge les regles de nat pour les utilisateurs authpf
nat-anchor "authpf/*"

## FILTRES
# par defaut, bloque tout
block drop all

# autorise le lan et la gw a aller partout
pass out quick on $ext_if inet proto tcp from \
   { $int_if:network, $ext_if } flags S/SA modulate state
pass out quick on $ext_if inet proto { udp, icmp } from \
   { $int_if:network, $ext_if } keep state

# autorise le reseau wifi a se connecter ssh (necessaire pour authpf)
pass in quick on $wifi_if inet proto tcp from $wifi_if:network \
   to ($wifi_if) port ssh flags S/SA keep state

# autorise les utilisateurs authpf authentifiés a acceder a certains dns
pass in quick on $wifi_if inet proto { tcp, udp } from <authpf_users> \
   to $servers port domain keep state

# charge les regles pour les utilisateurs authpf
anchor "authpf/*" in on $wifi_if

#EOF

fichier /etc/authpf/authpf.rules

Voici un exemple de règles définies dans le fichier /etc/authpf/authpf.rules :

## MACROS
ext_if = "fxp0"     # interface wan
int_if = "xl0"      # interface lan
wifi_if = "wi0"     # interface wifi

## REGLES
# Permet de "nater" l' ip de l'utilisateur pour acces a Internet
nat on $ext_if from $user_ip -> ($ext_if)

# Autorise l'ip de l'utilisateur a acceder partout (sauf au reseau local)
pass in quick on $wifi_if proto tcp from $user_ip \
 to ! { $int_if, $int_if:network } modulate state

#EOF

Liens

 
doc/openbsd/authpf.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page