Vous êtes sur la page 1sur 12

Mise en place d'une passerelle "scurise" pour le partage d'une connexion internet

Date de publication : 09/08/2006 , Date de mise jour : 13/07/2007 Par Nicolas Valle (Home Page) Le but de cet article est de permettre tout dbutant "clair" de mettre en place une passerelle, ne ncessitant pas des performances monstrueuses, afin de partager de manire scurise, et scurisante, sa connexion internet. Ici, nous avons choisi de montrer l'exemple sur une machine Debian... vous pourrez facilement vous adapter votre distribution, en changeant juste les procdures d'installation. Par ailleurs, je considre que le monde extrieur est branch sur eth0, et que les machines utilisateurs sont relies via eth1. Sommaire Suivant Version PDF (Miroir) Version hors-ligne (Miroir) Serveurs installer I. Serveurs I-1. Squid I-1-1. Rinitialiser le cache I-1-2. Authentification I-1-3. Cascader des proxys I-2. DansGuardian Optimisations II. Quelques petits plus... II-1. Proxy Transparent II-2. Interdire ping depuis l'extrieur II-3. Fermer certains ports II-4. Se doter d'un nom de domaine II-5. Autres services II-6. Quelques notions sur iptables II-7. Complments Le mot de la fin III. Divers III-1. Rfrences III-2. Conclusion
*

I. Serveurs I-1. Squid I-1-1. Rinitialiser le cache I-1-2. Authentification I-1-3. Cascader des proxys

I-2. DansGuardian

I. Serveurs

I-1. Squid Commenons d'abord par installer le plus important des serveurs : un proxy http. Ici, nous avons choisi Squid, qui est trs populaire, stable et dispose de nombreux modules... installation de squid
apt-get install squid

Ensuite vous devez diter le fichier /etc/squid/squid.conf configuration de squid - /etc/squid/squid.conf


# ne doit ecouter que les appels locaux # pour infos, 3128 est le port standard de Squid http_port 127.0.0.1:3128 # nom visible lors des messages aux clients visible_hostname gw.domain.com # remplacer zone_ip_interne par votre zone personnelle # par exemple 192.168.1.0 acl LocalNet src zone_ip_interne/255.255.255.0 # autoriser les acces venant de cette zone http_access allow LocalNet # Taille optimale de mmoire vive utilise pour stocker du cache cache_mem 16 MB # voir aussi cache_mem_low et cache_mem_high # Taille maximale des maximum_object_size 8 # Taille minimale des minimum_object_size 0 objets stocks dans le cache MB objets stocks dans le cache KB

# Paramtrage d'un cache sur un disque # 1 - Type de stockage # 2 - Emplacement du cache # 3 - Taille totale du cache en MB # 4 - Nombre de rpertoires de niveau 1 et de niveau 2 cache_dir ufs /var/spool/squid 200 16 256

Vous devez ensuite redmarrer squid de manire ce que les nouveaux paramtres soient pris en compte.

/etc/init.d/squid restart

I-1-1. Rinitialiser le cache Il arrive parfois que le cache local n'ait pas la bonne forme, car squid n'a pas t arrt correctement... vous devez alors le reconstruire.
rm -rf /var/spool/squid/* squid -z

I-1-2. Authentification Vous ne devez pas avoir activer le mode proxy transparent, si vous souhaitez mettre en place une authentification. Vous avez srement remarqu que le seul contrle effectu dans /etc/squid/squid.conf porte sur les adresses IP des machines clientes. Mais vous pouvez avoir envie de faire plus...

Pour cela, il existe diffrentes mthodes :

ldap_auth, pour authentifier les utilisateurs depuis un annuaire LDAP smb_auth, pour utiliser l'authentification d'un contrleur de domaine Windows NT (lien) ncsa_auth, utilisant un fichier d'utilisateurs local

Dans un premier temps, nous nous contenterons de ncsa_auth. Pour d'autres utilisations, vous trouverez facilement, car c'est similaire aux mthodes utilises par d'autres serveurs ;) Crez un fichier pour grer les utilisateurs, et remplissez-le via l'utilitaire htpasswd (celui des .htaccess/.htpasswd d'Apache) /etc/squid/users

touch /etc/squid/users htpasswd -b /etc/squid/users <nom de l'utilisateur>

<mot de passe>

Il vous est alors conseill de tester la main... en lanant le module d'authentification, et en lui donnant les entres par la console. Sortez en tapant Ctrl+d

/usr/lib/squid/ncsa_auth /etc/squid/users username password OK bas_user bad_passwd ERR

Si a marche, on peut alors passer au mode automatique. Pour cela, allez modifier votre fichier /etc/squid/squid.conf, pour y ajouter ceci :
# preciser qu'on oblige a passer par l'authentification acl Users proxy_auth REQUIRED http_access deny !Users # pour indiquer le mode d'authentification authenticate_program /usr/lib/squid/ncsa_auth /etc/squid/users # duree de validite de l'authentification authenticate_ttl 30 minute # lier un utilisateur a une adresse ip pendant un laps de temps authenticate_ip_ttl 30 minute

Pour viter qu'un utilisateur ne donne son accs tous ses amis (ou se le fasse squatter), on peut aussi limiter le nombre de connexions diffrentes qu'il peut effectuer. Pour cela, rajouter ceci dans /etc/squid.conf

# duree du couplage adresse ip <-> utilisateur authenticate_ip_ttl 2 hours # declaration du mode authentification acl users proxy_auth required # nombre de sessions simultanees maximal pour un utilisateur acl maxauth max_user_ip -s 1 # regles d'acces http_access deny maxauth http_access allow users

I-1-3. Cascader des proxys Il arrive parfois que votre passerelle se trouve dans un sous-rseau, et donc doive passer par une autre passerelle pour se connecter internet. Ce n'est pas trs grave, tout est prvu dans Squid... :D Il vous suffit d'ajouter dans votre /etc/squid/squid.conf

# la commande indispensable cache_peer ip_proxy_general parent port_de_autre_proxy 3130 no-query default # une optimisation pour naviguer directement entre les deux passerelles cache_peer_domain ip_proxy_general !.domain.com # avoir quand meme des logs... debug_options ALL, 9

I-2. DansGuardian Maintenant, nous allons installer un filtre, DansGuardian, tant un module de squid, afin de :

interdire l'accs des contenus peu recommendables (avec possibilit de rgler le seuil, d'interdire certains mots-cls, etc) grer les tlchargements de fichiers potentiellement dangereux (excutables, scripts, etc) contrler les virus ( partir de la version 2.9 en standard ;sinon partir de la 2.8 si recompilation avec le plugin DGAV)

Commenons par l'installer...


apt-get install dansguardian

Maintenant, il faut le configurer. Commenons par le strict minimum pour le faire fonctionner, avec le fichier /etc/dansguardian/dansguardian.conf configuration de DansGuardian - /etc/dansguardian/dansguardian.conf
# Commentez cette ligne, sinon DansGuardian ne voudra pas dmarrer... # UNCONFIGURED # Changez la langue des messages envoys aux utilisateurs #language = 'ukenglish' language = 'french' # N'autorisez que les connexions depuis votre rseau local... filterip = IP_interne # Choisissez le port que va couter DansGuardian filterport = 8080 # Mettez ici l'adresse pour joindre Squid proxyip = 127.0.0.1 # Mettez ici le port qu'coute Squid proxyport = 3128

Commenons raffiner... et configurons le fichier /etc/dansguardian/dansguardianf1.conf configuration de DansGuardian - /etc/dansguardian/dansguardianf1.conf


# autorise un contenu jusqu' une certaine limite # on peut abaisser le seuil # - 50 pour jeunes enfants # - 100 pour adolescents # - 160 pour jeunes adultes naughtynesslimit = 160 # autorisez toutes les extensions au tlchargement # utile pour les mises jour ou autre... # mais vos risques et prils, vous devrez grer une partie de la scurit au niveau des machines clientes # vous pouvez aussi seulement autorisez certaines extensions, # en le commentant dans le fichier /etc/dansguardian/bannedextensionlist # par exemple, il suffit de commenter les extensions .gz pour pouvoir installer et mettre jour une machine debian bannedextensionlist = '/dev/null' #bannedextensionlist = '/etc/dansguardian/bannedextensionlist'

Ici, nous sommes assez permissifs avec les utilisateurs, que nous considrons comme suffisamment autonomes, et responsables... ce n'est pas forcemment votre cas, et sachez qu'il y a de nombreux rglages possibles dans ce fichier. Prcdent Sommaire Suivant Version PDF (Miroir) Version hors-ligne (Miroir)

II. Quelques petits plus... II-1. Proxy Transparent II-2. Interdire ping depuis l'extrieur II-3. Fermer certains ports II-4. Se doter d'un nom de domaine II-5. Autres services II-6. Quelques notions sur iptables II-7. Complments

II. Quelques petits plus...

II-1. Proxy Transparent On peut vouloir configurer un proxy transparent. Ainsi, les machines clientes ne devront pas tre configures spcialement pour aller sur internet. /etc/squid/squid.conf
httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on # activer le routage d'adresses echo 1 > /proc/sys/net/ipv4/ip_forward # vous devez adapter zone_ip_interne et IP_interne # exemple zone_ip_interne = 192.168.0.0 iptables -t nat -A PREROUTING -s zone_ip_interne/255.255.255.0 \ -p tcp -m tcp --dport 80 -j REDIRECT --to-port 8080 # exemple IP_interne = 192.168.0.1 iptables -t nat -A PREROUTING -s zone_ip_interne/255.255.255.0 \ -p tcp -m tcp --dport 80 -j DNAT --to-destination IP_interne:8080

II-2. Interdire ping depuis l'extrieur Il peut tre utile d'interdire le ping depuis l'extrieur, surtout si votre machine est directement relie un modem, et non un routeur... car dans une telle situation, vous tes en premire ligne. D'ailleurs, il vaut mieux toujours penser qu'on est dans la pire des situations, car des petits malins finiront par nous prouver qu'on tait bien en-dessous de la vrit.

Pour cela, nous allons crer un fichier /etc/init.d/no_ping_from_eth0 /etc/init.d/no_ping_from_eth0


#! /bin/sh echo "Setting 'No Ping From Red Zone'" iptables -i eth0 -A INPUT -p icmp -j DROP

Il faut ensuite le placer au niveau 2 du dmarrage... enfin, je conseille le niveau 2 ;)


update-rc.d no_ping_from_eth0 start 99 2 5 .

II-3. Fermer certains ports Pour des raisons de scurit, il est parfois utile de fermer certains ports... pour les services inutiliss.

On commence par regarder les ports ouverts n'importe quelle machine...


netstat -lp | grep "*"

Toutefois, c'est un peu lourd dcrypter... et pas forcemment parlant. On peut aussi utiliser cette commande.
lsof -P | grep TCP | grep '*:' # la sortie est formatee ainsi # service ... TCP *:port (LISTEN)

Ainsi, vous voyez quel processus utilise quel port. Ensuite, quand on voit un process inutile, on commence par chercher sur google quoi il peut bien servir. Si l'on veut toujours le supprimer, on commence par l'arrter "temporairement"...
/etc/init.d/service stop

On vrifie que tout fonctionne normalement... si oui, on veut qu'il ne dmarre pas tout simplement.
update-rc.d -n service remove # on verifie d'abord ce que cela va realiser... puis, on fait : update-rc.d -f service remove

Par exemple, avec l'installation minimale par dfaut de la debian sarge, on pourrait dsactiver les services suivants :

portmap (port 111) inetd (port 113) nfs-common (statd port 742) On peut aussi fermer le ssh (port 22) sur la zone rouge (eth0), mais cela dpend de votre utilisation...

Si vous n'avez pas besoin de cet accs extrieur ajoutez cette ligne dans /etc/ssh/sshd_config /etc/ssh/sshd_config

# Vous devez adapter IP_interne vos besoins ListenAddress IP_interne

II-4. Se doter d'un nom de domaine Si vous souhaitez bnficier d'un accs extrieur pour un service quelconque (http, ssh, ftp, etc), vous pouvez souhaiter disposer d'un nom de domaine... ce qui vite d'avoir apprendre son IP publique par coeur, ou permet de faciliter l'usage des IP dynamiques. Prenez un compte gratuit sur DynDNS par exemple.

Une fois que cela est fait, si vous tes dans le cas d'une IP publique dynamique, il vous faut installer un client dyndns.
apt-get install ipcheck

Ensuite, il faut crer un script /usr/local/sbin/update_ip_dyndns.sh


#! /bin/sh /usr/sbin/ipcheck -l -r checkip.dyndns.org:8245 login password hostname

Maintenant, il faut excuter ce script rgulirement, afin qu'il mette jour votre IP publique auprs de DynDNS. Il faut donc ajouter votre crontab.
crontab -e # cela va vous ouvrir un fichier avec votre editeur prfr... # et il faudra ajouter cette ligne */10 * * * * /usr/local/sbin/update_ip_dyndns.sh

II-5. Autres services Si vous avez besoin d'ouvrir des ports pour des services ne passant pas par une passerelle http, il vous faudra soit installer un "proxy" spcifique (ftp, smtp) ; soit quelques notions d'iptables... un article est en cours de rdaction avec Spoutnik. Nous allons maintenant montrer comment ouvrir l'accs vers un port spcifique l'extrieur, depuis les machines situes derrire la passerelle ; et ce, de manire transparente. L'exemple sera avec le protocole SSH, associ au port tcp 22.
IF_LOCAL="eth1" IF_NET="eth0" iptables -A FORWARD -d zone_ip_interne/255.255.255.0 -i ${IF_LOCAL}

-o ${IF_NET} \ --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s zone_ip_interne/255.255.255.0 -i ${IF_LOCAL} -o ${IF_NET} \ --dport 22 -m state --state ! INVALID -j ACCEPT

On peut aussi, si l'on ne veut pas s'embter, laisser la zone verte sortir librement...
IF_LOCAL="eth1" IF_NET="eth0" ## On active la translation d adresse pour l'ensemble du reseau local pour l ensemble des ports iptables -t nat -A POSTROUTING -o ${IF_NET} -i ${IF_LOCAL} -s zone_ip_interne/255.255.255.0 -d 0.0.0.0/0 -j MASQUERADE

Chaque proxy a sa propre configuration, et nous ne pouvons pas tous les prsenter ici...

II-6. Quelques notions sur iptables Il faut faudra certainement quelques notions d'iptables pour mieux comprendre ces rgles...

#! /bin/sh IPTABLES="iptables" IF_LOCAL="eth1" IF_NET="eth0" IP_NET=XXX.XXX.XXX.XXX ZONE_INTERNE=192.168.0.0/255.255.255.0 IP_LOCAL=192.168.0.1 DNS_FAI=YYY.YYY.YYY.YYY GW_FAI=ZZZ.ZZZ.ZZZ.ZZZ #### Initialisation # modes pour le ftp modprobe ip_nat_ftp modprobe ip_conntrack_ftp # purger iptables $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -X $IPTABLES -t nat -X $IPTABLES -t mangle -X # Politique par defaut : les paquets sont refuses

$IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP # On accepte $IPTABLES -A $IPTABLES -A $IPTABLES -A les paquets reconnus par le moteur d'etat INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#### Autoriser les connexions sortantes sur un port particulier # exemple: on autorise les connexion ssh sortantes $IPTABLES -A OUTPUT -m state --state ! INVALID -p tcp --sport 1024: --dport 22 -j ACCEPT #### Autoriser les connexions entrantes vers un port particulier, et une interface particulire # exemple: on ouvre le port tcp/22 depuis l'interieur, donc sur l'interface eth1 $IPTABLES -A INPUT -m state --state NEW -p tcp -s ${ZONE_INTERNE} --sport 1024: --dport 22 -i ${IF_LOCAL} -j ACCEPT #### Router les paquets arrivant sur un port vers un autre port de la meme machine # exemple: on route le port web (tcp/80) sur le port de squid $IPTABLES -t nat -A PREROUTING -s ${ZONE_INTERNE} -p tcp -m tcp --dport 80 -j REDIRECT --to-port 3128 $IPTABLES -t nat -A PREROUTING -s ${ZONE_INTERNE} -p tcp -m tcp --dport 80 -j DNAT --to-destination ${IP_LOCAL}:3128 ##### Router les paquets arrivant sur un port vers le port d'une autre machine # exemple: on autorise le routage des connexions ssh depuis l'interieur vers l'exterieur $IPTABLES -A FORWARD -m state --state NEW -p tcp -s ${ZONE_INTERNE} --sport 1024: --dport 22 -i ${IF_LOCAL} -o ${IF_NET} -j ACCEPT #### Diriger les requetes en sortie # pour qu'elles fassent ZONE_INTERNE -> eth1:Passerelle -> eth0:Passerelle -> ZONE_EXTERNE $IPTABLES -t nat -A POSTROUTING -s ${ZONE_INTERNE} -o ${IF_NET} -j SNAT --to ${IP_NET} #### Activer le routage echo 1 > /proc/sys/net/ipv4/ip_forward

II-7. Complments Il faut se protger d'une attaque Denial of Service, dont le but est de saturer la passerelle par de nombreuses connexions non abouties, et ainsi de la faire tomber sous la charge. Pour cela, une ligne suffit...

echo 1 > /pros/sys/net/ipv4/tcp_syncookies

Je signale l'existence du module AdZapper pour Squid, afin de supprimer tout ce qui pourrait ressembler un bandeau publicitaire...

Il manque encore quelques dtails rajouter sur la QoS, mais vous trouverez plus complet dans un article venir sur iptables. Si vous avez d'autres suggestions... n'hsitez pas ;) III. Divers III-1. Rfrences III-2. Conclusion

III. Divers

III-1. Rfrences

Documentation de "rfrence" (en anglais) Expos complet sur Squid Squid et SquiGuard avec Webmin Avantages et inconvnients de DansGuardian Vieil article sur les passerelles

III-2. Conclusion Ceci n'est pas assez complet pour esprer apprhender correctement la scurit sous Linux... il vous faudra maintenant approfondir les notions survoles ici.

Vous aimerez peut-être aussi