14 octobre 2018

Créer des ACL sous Cisco – Access Control Lists IOS 15.1

On va voir quelques exemple basiques sur la création de permissions ACL. Rien de bien méchant, juste de quoi garder un peu en tête le fonctionnement.

*Ceci n’est pas un cours mais plutôt un gros mémo pour quelqu’un qui sait déjà ce qu’est une ACL. Si vous n’êtes pas familier avec le principe, ce n’est sûrement pas le meilleur endroit où commencer..

 

Les ACL sont des listes de règles de filtrage de paquets (couche 3 et 4) qui permettent de contrôler le trafic sur un réseau. Ces listes analysent les IP, les ports et les protocoles des paquets. Elle se placent au niveau des interfaces des périphériques réseau, et peuvent filtrer ce qui entre ou sort par cette interface.

————————————————————————-

Bon, OK, y’a un sommaire quand même ;D

-Quelque règles importantes

-Les types d’ACL

-Les numeros d’ACL

-Les masques génériques

-L’implicite deny all

-Les opérandes

-Vérifier les ACL existantes

-Modifier ACL existantes

-Exemple 1 : L’ACL étendue

-Exemple 2 : L’ACL nommée et étendue

-Exemple 3 : L’ACL standard

-Exemple 3 bis : étendue – par IP de réseau

————————————————————————-

-Quelques règles importantes :

 

Les ACL sont des listes, les règles sont lues du haut vers le bas. Il faut faire attention car si deux règles agissent sur un même contexte, c’est de toute façon la première qui sera prise en compte et la deuxième sera ignorée. Voyons un exemple d’ACL qui pose problème :

10 permit 192.168.0.0 0.0.255.255 (6 match(es))
20 permit 172.16.0.0 0.0.255.255
30 deny host 192.168.100.1

-Il faut savoir que les ACL analysent chaque paquet. Un paquet arrive, la source et destination sont analysées puis les règles sont lues de haut en bas jusqu’à ce qu’une règle donne la consigne pour ce paquet. Le paquet étant déclaré traité, les autres règles ne sont même pas lues ! Puis on passe au paquet suivant, et la procédure recommence. Il ne peut y avoir qu’une règle appliquée par paquet.

Dans l’exemple, la première règle autorise le réseau 192.168.0.0, et la troisième règle veut interdire l’accès à une IP faisant partie de ce réseau. Quand un paquet viendra de ce réseau, l’ACL va l’analyser, voir la source, et lire les règles de haut en bas et bim, paquet accepté ! La règle numero 30 ne sera jamais efficace en fin de compte. Cette ACL est mal configurée.

-On constate aussi que chaque ligne possède un identifiant (10, 20, 30), cela nous permet de spécifier la position souhaitée pour la nouvelle ACL.

–>On peut modifier les ACL déjà existantes, on peut aussi créer l’ACL, puis entrer dans sa configuration puis enfin taper les règles que l’on souhaite. Vous pouvez voir ça dans le chapitre
Modifier ACL existantes.

-Les listes d’ACL s’associent aux interfaces réseau des périphériques. Chaque interface ne peut se voir attribuée qu’une seule ACL.

————————————-

-Les types d’ACL :

 

Il y a trois types d’ACL que l’on peut choisir en fonction de la situation :

-Les ACL standards : elles ne permettent pas de spécifier grand chose. Avec les standards, on spécifie une adresse source qui sera rejeté ou autorisée et rien d’autre. Bien entendu cette adresse peut être un hôte tout autant qu’un réseau entier. Tout les protocoles seront alors acceptés ou refusés, c’est tout ou rien. Rien de très précis alors.

-Les ACL étendues : avec celles-ci, on peut aller plus loin qu’avec les standards. Par exemple, on peut spécifier une adresse de destination autant qu’une adresse source. Spécifier un protocole de transport (TCP, UDP, ICMP…) ou d’application (HTTP, FTP…).

-Les ACL nommées : celles-ci peuvent très bien être standards ou étendues, cependant on peut les gérer en leur donnant des noms voila tout. Cela peut permettre de s’organiser.

————————————-

-Les numéros d’ACL :

 

Les types d’ACL sont rangés dans des plages de numéros, sauf les ACL nommées :

 

 

*Bien sûr, on ne se souviendra que des Standards et des Étendues, les protocoles IPX et AppleTalk étant probablement morts et enterrés ::)

————————————-

-Les masques génériques :

Quand on veut spécifier une IP de réseau dans les ACL, il faut y associer un masque. Un masque de sous-réseau me direz vous ? Pas tout à fait malheureusement, car il faut bien une petite complexité dans un protocole sinon c’est pas drôle !

Le masque générique permet de spécifier plusieurs sous-réseaux contigus avec un seul masque 😮

-Commençons simple, si je veux travailler une ACL sur le réseau :

192.168.50.0 255.255.255.0

Ce sera très simple, je n’aurais qu’à inverser le masque qui deviendra donc 0.0.0.255.

-Ou encore :

172.16.0.0 255.255.0.0

Le masque deviendra 0.0.255.255.

On comprend en fait que dans les ACL le masque pointe les bits d’hôtes, le masque de sous-réseau devient en qq sorte un masque d’hôte.

-Là où ça se complique légèrement, c’est si on veut bloquer des sous-réseaux contigus. Admettons que je veuille travailler une ACL sur les sous-réseaux :

192.168.50.0 à 192.168.75.0

Dans ce cas, je vais devoir faire un calcul, mais seulement sur les octets qui sont différents. Ici, 50 et 75.

->Je les traduis en binaires :

 

 

50 = 32+16+1 = 0 0 1 1 0 0 1 0
75 = 64+8+2+1 = 0 1 0 0 1 0 1 1

->ensuite, je fais la différence entre ces deux nombres binaires, et tout ce qui est identique devient un 0, et tout ce qui est différente devient un 1. Donc :

0 0 1 1 0 0 1 0
0 1 0 0 1 0 1 1

->Devient :

0 1 1 1 1 0 0 1

->Je retraduis ne décimal :

 

 

64 + 32 + 16 +8 + 1 = 121

->Mon masque deviendra donc 0.0.121.255

————————————-

-La règle implicite deny any :

Il y a une règle implicite à la fin de chaque liste ACL que l’on crée, cette règle c’est deny any, ce qui signifie refuser tout. Il faut donc y pallier si vous ne voulez pas tout bloquer dès que vous créez une ACL. Par exemple, si vous bloquez l’accès d’un PC vers un réseau, vous devrez spécifier explicitement que les autres PC ont accès.

————————————-

-Les opérandes :

-Il s’agit de paramètres de comparaison. Ils vont servir quand on voudra spécifier des ports à autoriser ou interdire. Par exemple, si j’ai besoin d’interdire la connexion à tous les ports supérieurs à 10000, j’utiliserais un opérande.

Lt = Lower than = plus petit que
Gt = greater than = plus grand que
Eq = equal = égal à
Neq = non equal = différent de
Established = permet d’agir sur les accusés de réception TCP (bit ACK)

————————————-

-Vérifier les ACL existantes :

R1#show access-lists

->Affichera les ACL déjà créées. Constatez l’identifiant au début de chaque ligne. Il permet de modifier l’ACL après création.

————————————-

-Modifier ACL existantes :

On peut entrer dans un mode de configuration d’une ACL. Par exemple, si j’ai créé une ACL standard, je peux aller la modifier.

-Par exemple, je créer mon ACL :

R1(config)#ip access-list 10 deny host 110.10.10.1

-J’affiche mes ACL :

R1#show access-lists

Standard IP access list 10
10 deny host 110.10.10.1

-Je retrouve bien mon ACL standard, j’accède à sa configuration :

R1(config)#ip access-list standard 10 : pour y entrer.

R1(config-std-nacl)# Je suis maintenant dans la config de l’ACL.

-Je peux ajouter une ligne, et même la placer au dessus de ma ligne 10 si je le souhaite :

R1(config-std-nacl)#5 permit 192.168.0.0 0.0.0.255 : le chiffre 5 indique cette règle sera placée avant la ligne 10.

-Voyons le résultat :

R1#show access-lists

Standard IP access list 10
5 permit 192.168.0.0 0.0.0.255
10 deny host 110.10.10.1

-Je peux aussi supprimer une ligne :

R1(config-std-nacl)#no 10 : La ligne 10 est supprimée.

——————————-

-Exemple N°1 / ACL étendues :

 

Télécharger le fichier Packet Tracer ici. Dans ce fichier, l’exemple numéro un est déjà appliqué et fonctionnel. Vous pouvez afficher les commandes utilisées dans les périphériques.

-Objectif : Empêcher PC0 de pouvoir envoyer des ping dans le réseau 180.0.0.0.

->Pour cela, on va créer une ACL étendue car on veut bloquer un protocole précis, l’ICMP, vu que les requêtes d’echo en font partie. De plus seules les étendues vont nous permettre de déclarer une adresse de destination.

-Étant donné que l’ACL dispose d’une destination, on pourra la placer au plus près de la source, c’est à dire à la plus proche interface de routeur. Sur le schéma, la plus proche de PC0 est G0/0 sur R1. De cette façon on sauvegarde une bande passante qui n’aurait été utilisée que par un paquet qui aurait fini rejeté à la fin de son trajet. Bande passante gaspillée donc.

———————————-

-Je vais donc m’attaquer à R1, créer la liste ACL étendue, et la dédier à l’interface G0/0.

———————————-

-Création de la liste :

 

R1(config)#ip access-list 100 deny icmp host 110.10.10.1 180.0.0.0 0.255.255.255

->Explication de la commande :

access-list 100 : indique que l’on créer l’ACL numéro 100, ce qui implique qu’il s’agit d’une ACL étendue (rappelez-vous, les numéros d’ACL).

deny icmp : indique que l’on refuse tout le protocole icmp (deny ou permit pour autoriser)

host 110.10.10.1 : indique que cette règle s’applique à l’IP source 110.10.10.1. En fait si on veut spécifier un hôte en particulier, je dois ajouter l’option host. Voyez la suite d’ailleurs :

180.0.0.0 0.255.255.255 : indique que la règle s’applique à destination du réseau 180.0.0.0 / 255.0.0.0 (n’oubliez pas que c’est un masque générique qu’il faut mettre dans la commande.)

*On verra un ou deux autres exemples plus tard pour varier un peu cette commande.

-Ne pas oublier que par défaut, la fin de cette ACL contient implicitement la commande deny any ! Il faut donc faire qq chose sinon notre règle va tout bloquer :

R1(config)#ip access-list 100 permit ip any any : voila, grâce à cette commande, tout le monde à accès à tout, sauf bien sûr l’hôte spécifié dans la commande précédente.

———————————-

La liste ACL est créée, il ne reste qu’à la dédier à une interface, et préciser s’il s’agit d’une règle d’entrée ou de sortie. Je considère bien sûr que le réseau est déjà configuré ici.

R1(config)#interface g0/0 : je sélectionne l’interface.

R1(config-if)#ip access-group 100 in : cette comme indique que l’on place l’ACL numéro 100 sur cette interface, et le paramètre in indique que tout le trafic entrant par cette interface sera contrôlé.

———————————-

–>Essayez maintenant de pinguer un PC du réseau 180.0.0.0 depuis le PC0 : impossible !

Si vous avez bien fait votre boulot, PC1 peut toujours le faire en revanche.

———————————-

-Exemple N°2 / ACL Nommée-étendue:

L’ACL nommée, permet de donner un nom a une ACL. On se réfère donc à l’ACL par son nom et plus par un numero. Cela implique que lors de sa création, on doit spécifier s’il s’agit d’une standard ou d’une étendue.

-Toujours sur la même topologie, on me demande une nouvelle règle :

 

 

Télécharger ici le fichier Packet Tracer déjà configuré. Cela peut être utile pour explorer la configuration des périphériques.

-Il ne faut pas que PC2 puisse accéder au serveur WEB. Petite subtilité, on en me demande pas de bloquer complètement l’accès au serveur, mais seulement au protocole HTTP.

-On aura donc une ACL qui devra contenir une ip d’hôte source, une ip d’hôte destination, et un protocole bien précis. Pas le choix, il faut utiliser une ACL étendue.

-Pour pousser le vice un peu, on va même utiliser une ACL nommée, et étendue. Les nommées se présentent un peu différemment, c’est donc important de le voir.

-Comme notre ACL disposera d’une destination, on pourra la placer au plus proche de la source, ici PC2. Sur le trajet de PC2 au Serveur, la plus proche interface de routeur est G0/0 sur R2.

———————————-

-Tout d’abord, on crée l’ACL avec un nom :

R2(config)#ip access-list extended PC2-HTTP

 

–>Ici on crée donc une ACL étendue (extended), nommée PC2-HTTP. Le nom est purement indicatif. Constatez qu’on ne spécifie pas de numero, c’est pourquoi on doit préciser si c’est une standard ou une étendue.

-On crée notre règle :

R2(config-ext-nacl)#deny tcp host 180.10.10.1 host 220.10.10.1 eq www

 

->Déjà constaté que le prompt à changé : R2(config-ext-nacl)# / On se trouve dans l’invite de configuration de l’ACL nommée.

–>Ici, on interdit (deny) un protocole porté par tcp, depuis l’adresse source 180.10.10.1 vers l’adresse de destination 220.10.10.1. Le paramètre eq est un opérande qui veut dire égal, et www vient en complément de eq. Donc toutes les requêtes tcp avec du http encapsulé, et sur le port 80 (www) seront interdites. En fait les paramaètre eq www viennent en complément du paramètre tcp. Aprés eq on aurait pu mettre un numéro de port.

-Maintenant, on a interdit les requêtes HTTP mais pas HTTPS, car le paramètre www ne concerne que HTTP sur le port 80, rien de plus. Il faut donc rajouter un paramètre dans l’ACL :

R2(config-ext-nacl)#deny tcp host 180.10.10.1 host 220.10.10.1 eq 443

 

->Le port 443 est le port HTTPS par défaut. Il faut s’assurer que le serveur est configuré de cette façon évidemment.

-Puis on autorise toutes les autres connexions, car n’oublions pas la directive implicite deny any à la fin de chaque ACL :

R2(config-ext-nacl)#permit ip any any

 

-Il n’y a plus qu’a dédier notre ACL à l’interface g0/0 de R2, et spécifier qu’on veut que ce soit le trafic entrant qui soit examiné :

R2(config)#interface g0/0

 

R2(config-if)#ip access-list extended PC2-HTTP in

 

–>PC2 ne peut plus accéder au serveur Web ! En revanche, il peut toujours accéder aux autres services proposés par le serveur, comme le FTP. Vous pouvez testez il est présent dans fichier Packet Tracer.

———————————-

-Exemple N°3 / ACL Standard :

 

Téléchargez le fichier Packet Tracer déjà configuré si vous voulez, vous pourrez explorer les commandes entrées pour cet exercice.

-Un nouveau réseau 192.168.0.0/24 à été installé, mais il ne doit pas accéder au réseau 220.0.0.0/8. Je pars du principe que les réseaux et routages sont déjà configurés puisque ce n’est pas le sujet ici.

-Comme on ne nous demande pas de spécifier de protocole, je peux utiliser une ACL standard. En réalité, vu que l’on a une destination spécifiée, on aurait mieux fait d’utiliser une étendue mais il faut qu’on voit l’ACL standard donc pourquoi pas, ça marchera quand même.

-L’ACL standard va se baser sur une IP source. Il faut donc la mettre au plus près de la destination. En effet je ne vais pas refuser les IP provenant du réseau 192.168.0.0 au niveau de R3 sinon ils ne pourraient accéder à aucun autre réseau ! Ni au niveau de R1 sinon le réseau 192.168.0.0 n’accèdera plus au réseau 180.0.0.0, ce qui n’est pas le but. Je suis donc bien obligé de poser ma règle au niveau de R2.

-J’entre donc sur R2 :

 

-J’ai peut-être déjà des ACL sur ce routeur, et je fais attention de ne pas mettre le bazar ! Je vérifie donc les ACL déjà existantes :

R2#show access-lists : Je demande d’afficher les ACL existantes puis j’analyse le résultat :

Extended IP access list PC2-HTTP
10 deny tcp host 180.10.10.1 host 220.10.10.1 eq www (11 match(es))
20 deny tcp host 180.10.10.1 host 220.10.10.1 eq 443 (34 match(es))
30 permit ip any any (22 match(es))

->Ok, Il y a une ACL étendue et nommée. Je veux créer une nouvelle ACL standard, elle aura le numero 1, elle s’ajoutera donc simplement à celle déjà existante. Et puis, rien ne se contredit entre les deux donc ça va.

-Je crée ma nouvelle ACL :

R2(config)#ip access-list 1 deny 192.168.0.0 0.0.0.255 : L’ACL numéro 1 (donc standard) rejettera tout ce qui vient du réseau 192.168.0.0/24.

*Pour agir sur un hôte et non sur un réseau, il faut ajouter le paramètre host juste avant l’IP, et dans ce cas, le masque n’est pas nécessaire.

 

-N’oublions pas le fameux deny any implicite en fin de chaque ACL. Oui, même si G0/0 possède une ACL qui contient permit ip any any, il faut quand même le re-spécifier sur chaque ACL :

R2(config)#ip access-list 1 permit any : vu que les ACL standards ne gèrent pas de protocole ni de destination, cette commande devient plus courte.

-Puis on associe notre ACL à l’interface G0/0 :

R2(config)#interface g0/0

 

R2(config-if)#ip access-group 1 in : On indique donc au routeur qu’il doit lire les paquets qui entrent (in) par G0/0, et appliquer l’ACL, donc filtrer les paquets.

*On aurait pu aussi mettre la règle sur G0/1 de R2, de cette façon :

R2(config)#interface g0/1

 

R2(config-if)#ip access-group 1 out : tout les paquet qui sortent par G0/1 seront filtrés.

*Mais il est plus intéressant dans ce cas précis de bloquer ces paquets à l’entrée de R2 pour optimiser son activité processeur.

–>C’est fait, le réseau 192.168.0.0/24 n’a plus accès au réseau 220.0.0.0/8, mais accède toujours aux autres.

MAIS ! Car il y a un mais…On aurait pu remplir la demande numéro 3 en utilisant une ACL étendue également. Et on va le faire pour voir la syntaxe d’une ACL avec Réseau de source et réseau de destination. RDV dans l’Exemple N°3bis

———————————-

-Exemple N°3bis / Étendue – Par IP réseau :

On va revoir le même exercice, mais le résoudre d’une autre façon. Comme je disais, pour l’exemple 3, on aurait pu, et même on aurait mieux fait d’utiliser une ACL étendue…

Je rappelle le principe : on veut empêcher le réseau 192.168.0.0/24 d’accéder au réseau 220.0.0.0/8.

 

 

Téléchargez le fichier Packet Tracer, avec les config déjà effectuée !

-Cette fois on va créer une ACL étendue et la dédier à l’interface G0/1 de R3. De cette façon, les paquets ne parcourront pas le réseau jusqu’à R2 avant d’être rejetés, ce qui économise de la bande passante.

-On entre sur R3, puis on crée l’ACL :

R3(config)#ip access-list 100 deny ip 192.168.0.0 0.0.0.255 220.0.0.0 0.255.255.255 : Je refuse donc tout trafic IP en provenance de 192.168.0.0/24 vers 220.0.0.0/8

R3(config)#ip access-list 100 permit ip any any : j’autorise le reste à passer.

-J’associe l’interface G0/1 à l’ACL 100 :

R3(config)#interface g0/1

 

R3(config-if)#ip access-group 100 in

 

–>A partir de là c’est bon le réseau 192.168.0.0/24 n’accède plus au réseau 220.0.0.0/8.

*Et pour encore plus de sécurité, il peut être intéressant d’interdire l’accès de 220.0.0.0/8 vers 192.168.0.0/24, au niveau de R2 ! Après tout mettre des ACL de bout en bout ne pose pas de problème.

 

———————————-

Je pense avoir bien fait le tour des bases pour commencer à bidouiller sérieusement les ACL et cloisonner votre réseau. Bien prendre note des manipulation effectuées sur son réseau car sinon bonne chance pour s’en rappeler ;D

You may also like...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *