Ce guide pratique suppose que vous avez un noyau de la série 2.4 car il utilise iptables. En dehors de ceci, il n'existe aucune autre raison pour laquelle il ne pourrait pas être utilisé avec une machine disposant d'un noyau 2.2 après avoir adapté les scripts à ipchains.
Bien sûr, vous avez besoin d'installer les outils utilisateur d'iptables, un serveur http apache si vous voulez utiliser un outil CGI pour changer les mots de passe, et samba. Et vous aurez besoin d'un noyau compilé avec les modules iptables.
Vous pouvez utiliser DHCP. Si c'est le cas, il est assez simple de le configurer. Rappelez-vous de configurer le serveur dhcp pour qu'il donne l'adresse IP du serveur de noms ainsi que l'adresse IP de la passerelle. Les machines Windows feront bon usage de cette information.
Généralement, toute configuration de base à partir des distributions Linux connues conviendra pour l'exemple de passerelle. Vérifiez simplement que vous disposez de samba et d'iptables.
Une hiérarchie de répertoires supplémentaires sera nécessaire pour accomplir l'exemple de ce guide pratique :
/var/run/smbgate/ : Ceci est fait pour conserver trace des utilisateurs et des adresses IP ;
/etc/smbgate/users/ : C'est ici que je place les scripts spécifiques aux utilisateurs ;
/home/samba/netlogon/ : Répertoire du partage netlogon ;
/home/samba/samba/ : Répertoire du partage de trace.
Ces répertoires sont nécessaires pour certains des scripts et démons de cet exemple.
Il est très improbable que le noyau de votre distribution n'ait pas été compilé avec iptables et que les outils utilisateur ne soient pas non plus installés. Néanmoins, si vous ne les avez pas, référez-vous à http://www.netfilter.org/ ou http://www.iptables.org/ pour récupérer le logiciel et la documentation.
Vous aurez besoin d'une configuration basique du pare-feu pour que la passerelle fonctionne. Jetez un œil sur le tutoriel iptables disponible sur netfilter.org. Cette lecture est très intéressante. Néanmoins, si vous n'avez pas de temps pour cela, le code suivant est très basique mais il peut convenir à vos besoins :
#!/bin/sh IPTABLES=/usr/sbin/iptables /sbin/depmod -a /sbin/insmod ip_tables /sbin/insmod ip_conntrack /sbin/insmod ip_conntrack_ftp /sbin/insmod ip_conntrack_irc /sbin/insmod iptable_nat /sbin/insmod ip_nat_ftp echo "1" > /proc/sys/net/ipv4/ip_forward echo "1" > /proc/sys/net/ipv4/ip_dynaddr $IPTABLES -P INPUT ACCEPT $IPTABLES -F INPUT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -F OUTPUT $IPTABLES -P FORWARD ACCEPT $IPTABLES -F FORWARD $IPTABLES -t nat -F |
Vous remarquerez que ce code ne fait que charger les modules du noyau en relation avec NAT et le pare-feu, et mettre en place la transmission des paquets. Vous pouvez (et devriez) placer toutes les règles pour donner à votre passerelle un comportement standard, mais toute la magie sera réalisée par des scripts appelés par le démon samba.
S'il-vous-plait, rappelez-vous que ce code n'apporte pas la moindre sécurité ! N'utilisez pas cet exemple sur des machines de production. Cet exemple a seulement pour but d'informer. Vous devez ajouter une configuration de pare-feu convenant à votre système.
Vous êtes prévenus !
Vérifiez que samba est installé. Si votre distribution ne vient pas avec samba préparé, alors référez-vous à http://www.samba.org pour obtenir le paquet et la documentation sur son installation. Regardez sur leur site web et apprenez. Le site est rempli de documentations et peut-être que votre distribution Linux dispose elle-aussi de documentation sur samba.
Nous aurons besoin de configurer Samba comme contrôleur principal de domaine. Je donnerais un fichier de configuration en exemple, mais vous devriez lire la collection de guides pratiques sur Samba et tout apprendre sur les PDC.
Comme je n'ai pas l'intention de réécrire la documentation de samba, voici un simple fichier smb.conf :
# Global parameters
[global]
workgroup = DOMAIN
netbios name = LINUX
server string = Linux PDC
encrypt passwords = Yes
map to guest = Bad Password
passwd program = /usr/bin/passwd
unix password sync = Yes
max log size = 50
time server = Yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
logon script = netlogon.bat
domain logons = Yes
os level = 64
lm announce = True
preferred master = True
domain master = True
dns proxy = No
printing = lprng
[homes]
comment = Home Directories
path = /home/%u
read only = No
[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
browseable = No
available = No
[netlogon]
comment = NetLogon ShARE
path = /home/samba/netlogon
guest account =
[samba]
comment = login tracking share
path = /home/samba/samba
browseable = No
root preexec = /usr/local/bin/netlogon.sh %u %I
root postexec = /usr/local/bin/netlogoff.sh %u
|
Vous devrez faire avec ou lire la documentation de samba si vous voulez réellement contrôler votre serveur et votre réseau.
Le partage netlogon est l'endroit où les stations Windows vont télécharger le script de connexion (logon). Nous avons besoin de ce partage pour y placer un script de connexion qui dira à la station de monter un partage que nous utiliserons pour tracer l'adresse IP de l'utilisateur.
Comme vous le voyez, il doit y avoir une ligne comme ci-dessous dans votre smb.conf.
logon script = netlogon.bat |
Cette ligne indiquera au client Windows de télécharger et exécuter le script nommé netlogon.bat. Ce script doit être placé dans le partage netlogon. Donc, nous aurons aussi besoin d'un script netlogon.bat pour vos stations Windows. Vous pouvez utiliser l'exemple suivant et créer un fichier nommé NETLOGON.BAT et placé dans le partage netlogon, dans ce cas dans /home/samba/netlogon/NETLOGON.BAT.
REM NETLOGON.BAT net use z: \\linux\samba /yes |
Ce script indiquera aux stations Windows de monter le partage spécifié, et donc nous serons capable de garder la trace de l'utilisateur et de la station au travers de la sortie du programme smbstatus.
Assez simple ! Mais pas suffisant…
Comme vous pouvez le voir, nous aurons aussi besoin d'un partage de trace que j'ai nommé samba dans cet exemple. Vous pouvez voir dans le fichier smb.conf la configuration du partage de traces :
[samba] comment = login tracking share path = /home/samba/samba browseable = No root preexec = /usr/local/bin/netlogon.sh %u %I root postexec = /usr/local/bin/netlogoff.sh %u |
Comme vous pouvez le deviner, ou le savoir si vous avez lu la documentation de samba, les lignes « root preexec » et « root postexec » indiquent à samba de lancer les scripts indiqués lorsqu'un utilisateur monte ou démonte le partage. Dans ce cas, nous passons le nom de l'utilisateur comme paramètre au script. Notez le %u à la fin des lignes. Ces scripts vont appeler un script ou un programme pour modifier les règles de filtrage de paquets de notre passerelle.
Notez que le script netlogon.sh doit vérifier si la station en question a déjà monté le partage des traces.
Jetez un œil sur les scripts netlogon.sh et netlogoff.sh :
#!/bin/sh # # netlogon.sh # # usage: # netlogon.sh <nom_utilisateur> # if [ -f /var/run/smbgate/$1 ] ; then exit 0 fi echo $2 > /var/run/smbgate/$1 IPTABLES='/usr/sbin/iptables' EXTIF='eth0' COMMAND='-A' ADDRESS=`cat /var/run/smbgate/$1` GROUP=`groups $1 | gawk '// { print $3 }'` if [ -f /etc/smbgate/users/$1 ] ; then /etc/smbgate/users/$1 $COMMAND $ADDRESS $EXTIF else if [ -f /etc/smbgate/groups/$GROUP ] ; then /etc/smbgate/groups/$GROUP $COMMAND $ADDRESS $EXTIF else /etc/smbgate/users/default.sh $COMMAND $ADDRESS $EXTIF fi fi |
Ce script (netlogon.sh) a pour but d'être exécuté lors de la connexion de l'utilisateur et de sélectionner les scripts à exécuter suivant le nom de l'utilisateur et le groupe auquel celui-ci appartient. L'adresse IP de l'utilisateur sera enregistré dans un fichier sous /var/run/smbgate pour en conserver la trace. Le fichier prendra le nom de l'utilisateur et servira de nouveau lorsque celui-ci se déconnectera. L'adresse IP sera passée en argument à un script avec le nom de l'utilisateur qui mettra à jour les règles du pare-feu.
Notez que ce script commence par essayer un script utilisateur, puis, si il n'en trouve pas, il essaie un script groupe et, finalement, si il n'en trouve pas non plus, il essaie le script default.sh. Vous pouvez modifier cette logique et ce comportement si vous le souhaitez ou en avez besoin. Rappelez-vous simplement de modifier les autres de manières concordantes.
Il y a des chances pour que l'utilisateur appartienne à plus d'un des scripts et que ces scripts échouent. Je n'ai pas le temps d'écrire un meilleur code.
#!/bin/sh # # netlogoff.sh # # usage: # netlogoff.sh <nom_utilisateur> # IPTABLES='/usr/sbin/iptables' EXTIF='ppp0' COMMAND='-D' ADDRESS=`cat /var/run/smbgate/$1` GROUP=`groups $1 | gawk '// { print $3 }'` if [ -f /etc/smbgate/users/$1 ] ; then /etc/smbgate/users/$1 $COMMAND $ADDRESS $EXTIF else if [ -f /etc/smbgate/groups/$GROUP ] ; then /etc/smbgate/groups/$GROUP $COMMAND $ADDRESS $EXTIF else /etc/smbgate/users/default.sh $COMMAND $ADDRESS $EXTIF fi fi rm -f /var/run/smbgate/$1 |
Ce script (netlogoff.sh) a pour but d'être exécuté lors de la déconnexion de l'utilisateur. Il récupérera l'adresse à partir du fichier /var/run/smbgate/user, adresse qui sera passée en argument pour le script /etc/smbgate/users/user. Ce dernier mettra à jour le pare-feu dans l'état désiré lorsque l'utilisateur ne sera plus connecté.
Certaines versions de Windows, telles que Windows 2000, montent le répertoire partagé plus d'une fois lors de la connexion. Ceci peut apporter des problèmes avec les scripts netlogon.sh et netlogoff.sh en les exécutant plus d'une fois. Donc, vous pouvez utiliser un script de vérification de déconnexion lancé par le cron au lieu d'un script netlogoff.sh lancé par samba. En voici un exemple :
#!/bin/sh # checklogout.sh # # usage: # doit être lancé par cron (par exemple toutes les dix minutes) # TRACKDIR="/var/run/smbgate" DIRLENGTH=${#TRACKDIR} TRACKSHARE="samba" EXTIF='eth0' COMMAND='-D' if [ -d $TRACKDIR ]; then for n in $TRACKDIR/*; do [ -d $n ] && continue; if [ -f $n ] ; then IPADDRESS=`cat $n` USERNAME=${n:$DIRLENGTH+1} NMS=`smbstatus -u $USERNAME | grep $TRACKSHARE | \ grep $IPADDRESS | grep -v grep | wc -l` if [ $NMS == 0 ] ; then rm -f $n GROUP=`groups $USERNAME | gawk '// { print $3 }'` if [ -f /etc/smbgate/users/$USERNAME ] ; then /etc/smbgate/users/$USERNAME $COMMAND $IPADDRESS $EXTIF else if [ -f /etc/smbgate/groups/$GROUP ] ; then /etc/smbgate/groups/$GROUP $COMMAND $IPADDRESS $EXTIF else /etc/smbgate/users/default.sh $COMMAND $IPADDRESS $EXTIF fi fi fi else exit 0 fi done fi |
Dans ce cas, vous devez supprimer la clause postexec de la déclaration du partage dans smb.conf :
root postexec = /usr/local/bin/netlogoff.sh %u |
La suite est un script standard /etc/smbgate/users/user. Ce script modifiera réellement les règles du pare-feu.
#!/bin/sh # COMMAND=$1 ADDRESS=$2 EXTIF=$3 IPTABLES='/usr/sbin/iptables' $IPTABLES $COMMAND POSTROUTING -t nat -s $ADDRESS -o $EXTIF -j MASQUERADE |
Nous devons aussi avoir un script default.sh sur /etc/smbgate/users/ pour donner à la passerelle un comportement par défaut.
#!/bin/sh # # default.sh COMMAND=$1 ADDRESS=$2 EXTIF=$3 IPTABLES='/usr/sbin/iptables' #$IPTABLES $COMMAND POSTROUTING -t nat -s $ADDRESS -o $EXTIF -j MASQUERADE exit 0 |