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 paquetage 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
add user script = /usr/sbin/useradd -d /dev/null -g 100 -s /bin/false -M %u
logon script = %a.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.
Utiliser « logon script = %a.bat » fait que samba évalue le système d'exploitation invité et appelle le script de connexion approprié. Si vous préférez un script statique, modifiez seulement cette ligne par « logon script = netlogon.bat ». En fait, vous pouvez tout faire ici, y compris générer un script lors de la connexion.
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 fichier 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 traces
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 chercher un script utilisateur, puis, si
il n'en trouve pas, il cherche un script groupe et, finalement, si il n'en
trouve pas non plus, il utilise 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 <username> # IPTABLES='/usr/sbin/iptables' EXTIF='ppp0' COMMAND='-D' TRACKSHARE="samba" ADDRESS=`cat /var/run/smbgate/$1` GROUP=`groups $1 | gawk '// { print $3 }'` NM=`smbstatus -u $1 | grep $TRACKSHARE | wc -l` if [ $NM -gt 0 ]; then exit fi 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