Podstawy sieci z Cisco IOS. Moduł 3: ACL (Access Control List)
Listy kontroli dostępu mają wiele zastosowań na przełącznikach i routerach firmy Cisco Systems. Jednym z nich jest filtrowanie ruchu. Niemniej z ich użyciem możemy też m.in. kontrolować zdalny dostęp do linii wirtualnych oraz lokalnych usług urządzenia czy zawartość wysyłanych i otrzymywanych aktualizacji o trasach. Zastosowań tych jest więcej, stąd warto poznać je dobrze.
ACL (Access Control List) składa się z sekwencyjnej listy warunkowych zezwoleń i zakazów. Warunki na liście sprawdzane są sekwencyjnie, w kolejności ich ułożenia (od góry do dołu). Jeżeli warunek sprawdzenia pasuje, to wykonywana jest akcja zezwolenia (permit) lub zakazu (deny), a pozostałe warunki nie są już sprawdzane. Na końcu listy znajduje się niejawna akcja zakazu, do której pasuje wszystko to, co nie zostało dopasowane nigdzie wcześniej czy wyżej (deny any).
Wyróżniamy dwa główne typy list ACL - standardowe (Standard ACL) i rozszerzone (Extended ACL). Standardowe umożliwiają weryfikację tylko źródłowego adresu IP, stąd często stosowane są do kontrolowania dostępu do lokalnych usług urządzenia. Wskazują kto może, a kto nie może mieć do nich dostępu. Do tego potrzebny jest tylko sam adres źródłowy. Natomiast rozszerzone są bardziej złożone. Sprawdzają zarówno część źródłową, jak i docelową, jak również zarówno nagłówka warstwy trzeciej, jak i czwartej. Zatem w rozszerzonych mamy możliwość wskazania m.in. źródłowego i docelowego adresu IP oraz źródłowego i docelowego numeru portu TCP lub UDP. W listach rozszerzonych można też wskazywać inne pola z nagłówków protokołów warstwy trzeciej i czwartej. Służą one najczęściej do filtrowania ruchu przechodzącego przez interfejsy urządzenia.
Listy ACL filtrujące ruch określane są jako Port ACL lub Router ACL. Port ACL to lista działająca na portach L2 przełącznika. Da się ją przypiąć tylko na wejściu. Zatem sprawdza ona tylko ruch wchodzący do portów L2. Natomiast Router ACL działa na interfejsach L3, takich jak Routed Port czy SVI. Router ACL można przypiąć na wejściu lub wyjściu. Lista przypięta na wejściu sprawdza ruch wchodzący przez dany interfejs do urządzenia. Lista przypięta na wyjściu sprawdza ruch wychodzący z interfejsu urządzenia do sieci z wyjątkiem ruchu, którego źródłem jest to urządzenie. Na slajdzie Port ACL zostały oznaczone żółtymi strzałkami, a Router ACL zielonymi. Miejsce przypięcia ACL okreś to, czy jest ona potem określana jako Port ACL czy Router ACL.
Wszystkie reguły składające się na tę samą numerowaną ACL posiadają ten sam unikalny numer. Znajduje się on zaraz po poleceniu "access-list". W zależności od wartości tego numeru, mamy do czynienia z listą standardową lub z listą rozszerzoną. Najczęściej dla list będziemy korzystać z pierwszych zakresów ich identyfikatorów, to jest od 1 do 99 dla list standardowych i od 100 do 199 dla list rozszerzonych. Na naszym zrzucie ten unikalny numer czy identyfikator został oznaczony błękitnym obramowaniem.
Każda z części listy ACL, która stosowana jest do sprawdzania zgodności adresów, to jest część źródłowa w listach standardowych i rozszerzonych oraz część docelowa w listach rozszerzonych, składa się z dwóch elementów. Pierwszym jest wzorzec, a drugim maska blankietowa, która określa wymagane bity zgodności z zadanym czy podanym wzorcem.
Do tworzenia warunków sprawdzających listy ACL stosuje się maskę blankietową czy też z angielskiego wildcard mask. Maska ta nie musi być ciągła. Jednak jak pamiętamy, maska podsieci zawsze jest ciągła. Wynika to z tego, że maska sieciowa służy do wyznaczania granicy pomiędzy częścią sieci, a częścią hosta - jedynki to bity sieci, a zera to bity hosta. Natomiast maska blankietowa służy do dopasowań bitowych. Zera w masce blankietowej wymuszają dopasowanie, a jedynki nie.
Zatem patrząc z punktu widzenia dopasowania dla całej podsieci, maska blankietowa jest jakby odwrotnością bitową maski podsieci. Przykłady obrazujące to i pokazujące dopasowania dla całych podsieci znajdują się w pomarańczowych prostokątach, które widoczne są na slajdzie powyżej. W listach kontroli dostępu da się też stosować zapis z prefiksem, który określa ilość wymaganych bitów dopasowania z zadanym wzorcem od strony lewej do strony prawej. Działa on jak maska sieciowa.
Biorąc pod uwagę, że 0 (zera) w masce blankietowej wymuszają dopasowanie, a 1 (jedynki) go nie wymuszają, to zapis "0.0.0.0" będzie wymagał pełnego dopasowania w każdym oktecie i równoważny jest z parametrem "host", po którym podaje się wzorzec. Za to maska blankietowa "255.255.255.255" nie będzie wymuszała żadnego dopasowania. Najczęściej podaje się dla tej maski blankietowej wzorzec w postaci "0.0.0.0", co całościowo przyjmuje formę "0.0.0.0 255.255.255.255" i równoważne jest z "any".
Na naszym zrzucie (slajd powyżej) maska blankietowa została oznaczona czerwonym obramowaniem. W kilku regułach zapisaliśmy tę samą maskę blankietową na kilka sposobów, stąd warto porównać to, co zostało wpisane z tym, co widać później w bieżącej konfiguracji urządzenia. Tam, gdzie maska nie jest widoczna, wymagane jest pełne dopasowanie do wzorca.
Składnia polecenia do konfiguracji numerowanej listy ACL "access-list" zaczyna się od wspomnianego wcześniej identyfikatora, który dla wszystkich wierszy danej ACL jest wspólny. Następnie należy wskazać akcję, którą może być "permit" lub "deny". Dozwolone jest też w tym miejscu użycie parametru "remark", który służy do wstawiania komentarza. Po akcji trzeba wskazać warunki dopasowania, które będą miały różną składnię dla list standardowych i list rozszerzonych. Zatem dalsza część polecenia, w tym dostępne dla nas parametry, będą zależne od wartości wybranego identyfikatora.
Aby logować dopasowania do danej reguły, należy dodać na jej końcu parametr "log". Należy jednak wykazać rozsądek przy korzystaniu z tego parametru w środowisku produkcyjnym, gdzie ilość dopasowań do danego wiersza może być naprawdę duża.
Na slajdzie widocznym powyżej pokazany został sposób konfiguracji standardowej ACL. Widać, że po wybraniu akcji możemy jedynie wskazać część źródłową, która sprawdza zgodność wzorca ze źródłowym adresem odebranego pakietu IP.
Do usunięcia listy numerowanej służy polecenie "no access-list", po którym wskazujemy identyfikator listy. Polecenie to przydatne jest także, kiedy modyfikujemy zawartość listy numerowanej. Normalnie, da się dopisywać kolejne wiersze tylko na samym końcu listy numerowanej. Kiedy chcemy dodać coś na początku lub wstawić coś pomiędzy już istniejące wiersze, to pierw trzeba usunąć całą listę, a następnie wprowadzić wiersze w poprawnej kolejności. Jest to jeden z minusów list numerowanych. Niemniej nie przeszkadza on bardzo, kiedy taką listę na czas edycji skopiujemy do edytora tekstu. Wszelkie zmiany wprowadza się wtedy o wiele wygodniej. Dalej powiemy sobie, jak można to ograniczenie obejść poprzez mechanizmy służące do obsługi list nazwanych.
Skonfigurowane listy kontroli dostępu można wyświetlić z użyciem polecenia "show access-list" lub "show ip access-list" trybu EXEC. Polecenia te nie pokażą komentarzy, które widoczne są w konfiguracji bieżącej i startowej. Zostało to pokazane na zrzucie poleceń. Warto zwrócić uwagę na różnice pomiędzy tym co widoczne jest na żółtawym tle, a tym co na czerwonawym tle.
Na slajdzie widać też dwa zastosowania nieciągłej maski blankietowej. Znajdują się one w lewym dolnym rogu slajdu. Pierwsze pokazuje możliwość wyłapania nieparzystych adresów IP z danej podsieci, a drugie parzystych. Z użyciem tradycyjnej maski sieciowej lub długości prefiksu nie byłoby to możliwe. O ile zastosowania te są dość nietypowe, to kiedy w każdej z podsieci jakiś serwer czy usługa ma tę samą końcówkę adresu, a podsieci tych jest bardzo dużo, to zwykle przy zastosowaniu maski blankietowej można je wszystkie wyłapać jedną regułą. Dlatego tak ważna jest nomenklatura nazewnicza oraz plan adresacji i numeracji.
Składnia rozszerzonych list ACL jest bardziej złożona i zależna od protokołu jaki zostanie wskazany po akcji. W prawym dolnym rogu slajdu widać sposób weryfikacji protokołów dostępnych do użycia na danej platformie. W przypadku standardowych list ACL nie było tego wyboru. Tam jedynym i jednocześnie domyślnym protokołem był IP.
W prawej części slajdu (żółta ramka) widoczny jest przykład konfiguracji rozszerzonej ACL dla protokołu IP. Widać, że możemy wskazać zarówno część źródłową, jak i docelową. Ponadto, dostępne są dla nas także inne pola nagłówka IP.
Protokół UDP jest enkapsulowany czy też przenoszony w IP. Dlatego wskazując po akcji protokół UDP, będziemy mieli do wyboru zarówno wcześniej widoczne parametry dotyczące nagłówka protokołu IP, jak i nowe, powiązane typowo z nagłówkiem UDP.
W prawej części slajdu (żółta ramka) widoczny jest przykład konfiguracji rozszerzonej ACL dla protokołu UDP. Widać, że możemy wskazać zarówno część źródłową, jak i docelową, gdzie każda z tych części może zawierać zarówno adresy IP, jak i numery portów UDP, które można wskazać na wiele sposobów. Dostępne są dla nas także inne pola nagłówka IP.
Protokół TCP jest enkapsulowany czy też przenoszony w IP. Stąd wskazując po akcji protokół TCP, będziemy mieli do wyboru zarówno wcześniej widoczne parametry dotyczące nagłówka protokołu IP, jak i nowe, powiązane typowo z nagłówkiem TCP.
W prawej części slajdu (żółta ramka) widoczny jest przykład konfiguracji rozszerzonej ACL dla protokołu TCP. Widać, że możemy wskazać zarówno część źródłową, jak i docelową, gdzie każda z tych części może zawierać zarówno adresy IP, jak i numery portów TCP, które to można wskazać na wiele sposobów. Dostępne są dla nas także inne pola nagłówka IP oraz flagi z nagłówka TCP. Dzięki tym flagom możemy bardziej precyzyjnie filtrować ruch, w tym umożliwiać nawiązywanie połączenia tylko w wybranym kierunku.
W ramach jednej rozszerzonej listy ACL może być obsługiwane wiele różnych protokołów. Widać to w poniższym przykładzie (żółta ramka), gdzie jedna lista zawiera reguły dotyczące wielu protokołu, jak ICMP, OSPF, UDP, TCP czy IP. Tak też najczęściej wyglądają w praktyce listy kontroli dostępu, które służą do filtrowania ruchu.
Widoczne w lewym dolnym rogu slajdu protokoły (czarna ramka), które można wskazać po akcji, są enkapsulowane czy też przenoszone w protokole IP. Zatem reguła zezwalająca lub blokująca dany ruch IP, może mieć także wpływ na te protokoły.
Znajomość numerowanych list ACL bywa niezbędna. Wynika to z tego, że niektóre mechanizmy nie umożliwiają w danej wersji oprogramowania podpięcia listy nazwanej. Trzeba wtedy ratować się właśnie listą numerowaną. Natomiast obecnie tam gdzie się da, stosuje się już listy nazwane. Są one tak samo dostępne zarówno w formie standardowej, jak i rozszerzonej.
Listy nazwane dają możliwość stosowania intuicyjnych nazw. Zatem listę, która służy do wskazania stacji zarządzających możemy nazwać "MGMT-STATION-ACL", zamiast używać numerka z przedziału od 1 do 99. W ten sposób ktoś kto widzi taką listę od razu wie do czego ona służy, czy też czego dotyczy i konfiguracja staje się bardziej intuicyjna. W listach nazwanych nie mamy sztywnych limitów co do ich ilości, co było w listach numerowanych powiązane z konkretnymi przedziałami numerów. Dodatkowo mamy też możliwość edycji już istniejących list. A co fajne, poprzez ten mechanizm można także edytować listy numerowane.
Do konfiguracji list nazwanych służy polecenie trybu konfiguracji globalnej "ip access-list standard" lub "ip access-list extended", odpowiednio dla listy standardowej lub rozszerzonej. Zaraz po nim podaje się nazwę listy. Dobrze, jeśli nazwa ta jest przemyślana i zarówno określa zastosowanie czy zawartość listy, jak i umożliwia wygodne wyszukanie list o podobnym przeznaczeniu, z użyciem poznanego w module 1 mechanizmu potoków. Przekłada się to potem na łatwiejszą administrację i szybszą diagnozę.
Po wydaniu tego polecenia zostaniemy przeniesieni do trybu konfiguracji danej listy. Cała reszta składni jest bardzo podobna do tej poznanej wcześniej. Natomiast dzięki dodatkowemu trybowi konfiguracji, nie musimy już powtarzać początku polecenia, jak to miało miejsce w przypadku list numerowanych. Tam każda lista zaczynała się od "access-list" i unikalnego identyfikatora. Teraz jesteśmy w określonym trybie i wszystko co w nim wpisujemy dotyczy tej konkretnej listy nazwanej. Mamy tu też możliwość wskazania numeru wiersza, w jakim nasza reguła ma się pojawić czy usuwania wskazanych reguł. Na dodatek, poprzez ten mechanizm można także edytować listy numerowane. Wystarczy w miejsce nazwy wstawić identyfikator listy numerowanej.
W naszym przykładzie zostały stworzone dwie nazwane ACL. Dzięki intuicyjnym nazwom, ich zastosowania nie trzeba komentować. Pierwsza "MGMT-STATION-ACL" jest listą standardową, która zawiera listę adresów IP stacji zarządzających. Druga rozszerzona "TRAFFIC-to-WEB-SERVER-ACL" określa zezwolony ruch do serwera webowego. Widoczne są na niebieskawym i żółtawym tle.
Zaraz poniżej widać edycję listy nazwanej, gdzie zmieniamy wiersz numer 10 i dodajemy wiersz numer 15. Każdy wiersz listy ACL posiada numer. Numeracja zaczyna się od 10 i z każdym wierszem zwiększana jest o 10. Numerów tych nie widać ani w konfiguracji bieżącej, ani w konfiguracji startowej. Za to są one widoczne w wyniku wcześniej poznanego polecenia "show ip access-list".
Listy nazwane usuwa się z konfiguracji tak samo, jak listy numerowane. Należy standardowo użyć polecenia "no" przed poleceniem identyfikującym daną listę. Czyli tym, które przenosi nas do jej trybu konfiguracji. Usunie to listę z całą jej zawartością.
Zdarzyć się może, że pomiędzy dwie reguły będziemy musieli wstawić więcej niż 10 dodatkowych wpisów. W takim przypadku trzeba wcześniej przenumerować ACL z użyciem polecenia trybu konfiguracji globalnej "ip access-list resequence", gdzie najpierw wskazujemy nazwę lub numer listy, a następnie podajemy wartość początkową i krok. Sytuacje takie nie zdarzają się często.
Przenumerowanie to działa tylko jednorazowo w trakcie wpisania tego polecenia. Numery te przetrzymywane są w pamięci RAM, zatem po restarcie urządzenia, znowu pierwsza reguła będzie miała numer 10, a numery kolejnych będą rosły z krokiem 10. Przykład zastosowania tego polecenia widać na slajdzie powyżej.
Stworzone w ten sposób listy ACL nic jeszcze nie robią. Znajdują się w konfiguracji i czekają na użycie. My zajmiemy się w tym module dwoma zastosowaniami ACL. Jednym jest filtrowanie ruchu, a drugim ograniczanie dostępu do wirtualnych terminali.
Najlepiej jest, jeżeli filtrowanie odbywa się najbliżej źródła ruchu. Wtedy taki ruch nie przechodzi niepotrzebnie przez inne urządzenia w sieci. Niemniej, taka konfiguracja nie zawsze się skaluje czy jest wygodna w zarządzaniu. Trudno zarządza się konfiguracją list ACL, kiedy są one porozrzucane po bardzo dużej ilości urządzeń i portów czy interfejsów, chyba że mamy do tego jakiś SDN, jak dla przykładu Cisco ACI (Application Centric Infrastructure). Inna rzecz, że nie wszystkie urządzenia mogą takie funkcje udostępniać. Do filtrowania ruchu najczęściej stosuje się listy rozszerzone, jako że często jedna lista filtruje ruch skierowany do różnych miejsc docelowych, a ponadto jej reguły wskazują konkretne protokoły, numery portów, a czasem i inne parametry.
Aby przypisać listę do interfejsu trzeba w jego konfiguracji użyć polecenia "ip access-group", po którym podajemy numer lub nazwę listy ACL oraz określamy kierunek, w którym lista będzie realizowała filtrowanie. Tutaj warto przypomnieć sobie o Port ACL, gdzie mamy do wyboru tylko "in" i Router ACL, gdzie mamy do wyboru "in" lub "out". Warto też pamiętać, że filtrowanie na wyjściu z interfejsu nie obejmuje ruchu, którego źródłem jest urządzenie.
W przypadku Router ACL, da się przypiąć takie same lub różne listy na kierunku "in" i "out".
Warto pamiętać, że listy ACL mogą być także dynamicznie przypinane do portów przełącznika, kiedy korzystamy z IEEE 802.1X. Odbywa się to na podstawie decyzji podjętej przez Cisco ISE (Identity Services Engine) w trakcie uwierzytelnienia i autoryzacji. Tam, gdzie wymagany jest większy poziom bezpieczeństwa i duża wydajność powiązana z tym, że filtrowanie odbywa się sprzętowo bardzo blisko źródła, w tym chcemy pozbyć się problemów z tak zwanym lateral movement, warto rozważyć wykorzystanie w sieci LAN/WLAN rozwiązania SD-Access opartego o Cisco Catalyst Center, którego częścią jest właśnie Cisco ISE.
Listy przypięte na interfejsie można sprawdzić z użyciem polecenia "show ip interface". Widać to na niebieskawym tle.
Aby przypisać listę do wirtualnych linii, należy w wybranym zakresie linii użyć polecenia "access-class", po którym podajemy nazwę lub numer oraz określamy kierunek "in" lub "out". Filtrowanie na wejściu określa, kto do danych linii może się łączyć zdalnie, a filtrowanie na wyjściu określa dokąd można się dalej logować z lokalnego urządzenia.
Listy przypięte do linii wirtualnych da się sprawdzić z użyciem polecenia "show line" trybu EXEC, przy czym widoczne są tam tylko listy numerowane. Zostało to pokazane na żółtawym tle naszego zrzutu poleceń.
O ile konfiguracja list kontroli dostępu jest sama w sobie bardzo prosta, to niestety niezbędna jest tutaj znajomość działania konkretnych protokołów, usług czy aplikacji. Dlatego osoba odpowiedzialna za zarządzanie listami ACL powinna zarówno dobrze znać powszechne protokoły oraz usługi, jak i potrafić samodzielnie zweryfikować w dokumentacji czy z użyciem innych narzędzi to, co wymagane jest przez daną aplikację lub usługę do prawidłowego działania. I to w praktyce jest najczęściej jedyną trudnością przy konfiguracji list ACL i "otwieraniu portów". Cała reszta jest tak złożona, jak wpisywanie danych w formularz.
Zatem musimy umieć przełożyć zgłoszony problem lub zapotrzebowanie, które często zostanie sformułowane z użyciem bardziej wysokopoziomowych wymagań albo nietechnicznego języka na to, co faktycznie trzeba zablokować czy zezwolić. To z kolei często może wymagać dodatkowej weryfikacji, która pozwala powiązać to co jest blokowane z tym, co nie działa, a powinno.
Przed kolejną porcją wiedzy zachęcamy do przećwiczenia i utrwalenia tej poznanej tutaj. Skorzystaj z naszych ćwiczeń!
W zależności od wiedzy uczestników, przy wykonywaniu naszych ćwiczeń może być wymagane powtórzenie z nimi zagadnień dotyczących działania protokołu ICMP, UDP, TCP, nawiązywania połączenia przez protokół TCP oraz działania takich narzędzi, jak ping czy traceroute w różnych systemach operacyjnych (Microsoft Windows, Cisco IOS i GNU/Linux).
Zachęcamy do śledzenia nas w mediach społecznościowych Facebook i LinkedIn.
Zapraszamy do kontaktu drogą mailową