TACACS+

Instalace a konfigurace pro spolupráci s Cisco síťovými prvky

Lubomír Walder [wal056]
Tomáš Szkandera [szk018]

Úvod

Protokol TACACS+ [1,2], navržen firmou Cisco Systems, je síťový autentizační, autorizační a účtovací (AAA [3]) protokol umožňující řízení a kontrolu přístupu na síťové prvky pomocí jednoho nebo více centralizovaných serverů. Kontrola přístupu tedy nemusí být soustředěna v každém síťovém prvku, ke kterému se jeho správce připojuje, ale veškerá přístupová práva mohou být uložena právě na jednom centralizovaném serveru. Tento server pak může obsahovat kontrolu přístupu pro mnoho dalších síťových prvků, čímž se výrazně usnadňuje sledování a konfigurace přístupových práv pro všechna tato zařízení. Samozřejmě jednotlivá zařízení musí protokol TACACS+ podporovat.
Protokol TACACS+ je následovníkem protokolu TACACS. Na rozdíl od původního protokolu však například poskytuje detailnější účtovací informace, hesla přenáší s použitím otisku MD5 a umožňuje šifrování komunikace (v původní specifikaci TACACS se veškeré informace přenášely v „clear-text“ podobě) [4]. Před uvedením TACACS+ vznikla ještě verze XTACACS, bylo to však jen upravení původního protokolu s přidáním možnosti AAA přes více TACACS serverů a s podporou více různých protokolů (SLIP, PPP a dalších). TACACS+ obsahuje natolik významné změny, že není zpětně kompatibilní s původním TACACS protokolem ani s rozšířeným XTACACS.

Autentizace, autorizace, účtování
Tato trojice pojmů (v angličtině authentication, autorization, accounting) a její zkratka AAA vzešly z oblasti počítačové bezpečnosti a symbolizují základní skupinu „funkcí“ kterou poskytují protokoly pro správu přístupu v počítačových sítích. TACACS+ není jediný AAA protokol, existuje několik dalších podobných protokolů jako například Diameter, RADIUS nebo Kerberos [3]. Dnes velmi rozšířeným protokolem pro autorizaci v počítačových sítích je již zmíněný Radius, ten však, na rozdíl od TACACSu, pracuje nad méně spolehlivým protokolem UDP, nešifruje veškerou komunikaci, nemá příliš možností pro autorizaci apod. Oba protokoly však mohou běžet v síti současně a vhodně se tak doplňovat. Více informací a srovnání těchto protokolů lze nalézt na stránkách ciscopressu [9].
Při použití protokolu TACACS+ lze funkce AAA definovat konkrétně takto:
Autentizace (authentication) – znamená potvrzení, že uživatel požadující přístup na síťový prvek je platným uživatelem (administrátorem) tohoto prvku. Autentizace je dosažena pomocí představení jeho identity a hesla.
Autorizace (autorization) - znamená udělení specifického typu služby uživateli, na základě jeho autentizace, služeb, které požaduje a aktuálního stavu systému. Autorizace může být konkrétně založena na omezeních, například omezení provádět určité příkazy nebo přechod do privilegovaného režimu.
Účtování (accounting) - znamená sledování využívání síťových služeb uživateli. Tyto informace mohou být použity pro správu, plánování, účtování, nebo další účely. V případě TACACS+ lze například sledovat, kdo a v kolik hodin se přihlásil na síťový prvek, které příkazy spouštěl, lze sledovat i systémové události jako odchozí spojení apod.

Instalace TACACS+ serveru

Informace v této a dalších částech byly čerpány převážně ze zdrojů [5] a [6].
Cisco Systems poskytuje aktuální verze TACACS+ serveru pouze ve svém softwarovém balíku „Cisco Secure ACS“, který je ovšem licencovaný a není zdarma. Starší verze TACACS+ serveru, kdy ještě nebyly součástí CSACS, jsou volně k dispozici včetně zdrojových kódů, a tak existuje mnoho jejich modifikací. Na stránkách turecké Gazi Univerzity [7] jsme sice našli již modifikovanou verzi TACACS+ serveru, avšak stáhli jsme odtud pouze originální Cisco verzi (F4.0.3), která je na těchto stránkách také k dispozici.
Stažený balík jsme rozbalili příkazem:
>tar –xzvf tac_plus-F4.0.3.alpha.tar.Z
po jednoduché úpravě Makefile pro systém Linux jsme spustili kompilaci a instalaci
>make tac_plus
>make install

Konfigurace TACACS+ serveru

Celou úlohu jsme testovali na následujícím zapojení:

Schema zapojeni

Srdcem PC1 i PC2 byl operační systém Linux, obě PC byly připojeny k routeru klasickým ethernetovým kabelem. PC1 sloužilo jako klient, tedy počítač, ze kterého se administrátor připojoval na router pomocí telnetu. Na PC2 byl nainstalován a nakonfigurován server TACACS+. Pro jistotu uvádíme konfiguraci sítě na obou PC:
PC1:PC2:
>ifconfig eth0 1.0.0.2/24 up
>route add default gw 1.0.0.1
>ifconfig eth0 2.0.0.2/24 up
>route add default gw 2.0.0.1

Konfigurace TACACS+ serveru je uložena v jediném souboru tac_plus.conf, na jehož jméně ani umístění však prakticky nezáleží, jelikož cesta k tomuto souboru se předává jako parametr při spouštění serveru.
Konfigurační soubor má vcelku jednoduchou a srozumitelnou podobu, uvedeme zde ale jen příkazy, které jsme sami využili, případně některé jiné důležité či zajímavé. Spolupráci s TACACS+ serverem umožňují síťové prvky, jejichž IOS tuto možnost podporuje. My jsme možnosti TACACSu testovali na Cisco routeru série 2800 (IOS v12.3(14)T7), pro zjednodušení budeme dále uvádět jen „router“.
Celý námi použitý konfigurační soubor je k dispozici zde.

Vybrané příkazy konfiguračního souboru TACACS+ serveru (tac_plus.conf):
Pokud chceme aby komunikace mezi routerem a serverem byla šifrována, musíme v konfiguračním souboru nastavit heslo pro šifrování příkazem:

key = heslo

Stejné heslo se samozřejmě musí nastavit i na routeru (viz Konfigurace routeru). My jsme tuto možnost však nevyužili neboť bychom nebyli schopni číst přenášené pakety pomocí Etherealu.
Dále bychom měli definovat cestu k souboru, do kterého se budou ukládat účtovací informace. Tato volba je účinná pouze při povoleném accountingu na routeru.

accounting file = /home/cnap/wal056/tac.log

Pokud je na routeru povoleno, aby se heslo pro vstup do enable režimu získávalo také z tacacs+ serveru, pak následujícím způsobem toto heslo nadefinujeme:

user = $enable$ { login = cleartext "heslo" }


Kontrola přístupu na router je založena na systému uživatelů a skupin. Skupiny musí být definovány jako první. Definice uživatelů i skupin může obsahovat prakticky stejné příkazy. Při použití autorizace jsou veškeré příkazy na routeru implicitně zakázány a musí se jednotlivě povolovat.
Následující příklad zobrazuje definici skupiny uživatelů a jejich omezení:

group = testers {
 login = cleartext "tester"
 expires = "Dec 31 2007"
 cmd = show {
  permit .*
 }
 cmd = ping {
  permit 2\.0\.0\.[0-9]+
 }
}

Tato skupina má heslo „tester“ uloženo v cleartextové podobě, heslo lze uložit i šifrovaně v DES formátu a to příkazem login = des XXXXX. Heslo vyprší 31.12.2007. Povolené příkazy jsou show a všechny jeho tvary (např. show runnig-config, show ip route, atd.) a příkaz ping na adresy 2.0.0.X. Pro definici povolených IP adres se používají regulární výrazy.
Jednotlivé uživatele přiřazujeme skupinám následovně:

user = wal056 {
 member = testers
}

Uživatel wal056 je členem skupiny testers, jeho přístupové parametry a povolení jsou tedy definovány uvnitř této skupiny.
Jednotlivé uživatele lze však definovat i samostatně, není nutné je vůbec přiřazovat skupině a pro jejich specifikaci se používají stéjné příkazy jako v definici skupin:

user = superuser {
 default service = permit
 login = cleartext "superuser"
}

Uživatel superuser má povoleny veškeré příkazy na routeru. Toho jsme dosáhli vložením příkazu default service = permit. Pokud má takto uživatel všechny příkazy povoleny, lze je nyní jednotlivě zakazovat příkazem deny, který se zapisuje úplně stejně jako příkaz permit.

TACACS+ server, při rozhodování o povolení či zakázu provedení příkazu, prochází definovaná omezení směrem od shora dolů. To znamená, že jakmile je nalezena shoda, je odeslán kód PERMIT. Pokud po průchodu celé definice uživatele (resp. skupiny) shoda není nalezena, pak je návratový kód vždy DENY. To znamená, že definice omezení lze psát například i takto:

cmd = ping {
 deny 2\.0\.0\.[0-9]+
 permit .*
}

V tomto případě má uživatel zakáz pingu pouze na adresy 2.0.0.X, ostatní má povoleny.


Dále musíme uvést, že výše uvedený „accounting file“ se nám při spuštění TACACS+ serveru nevytvořil automaticky, takže je vhodné jej ručně vytvořit a nastavit přístupová práva:

>touch tac.log
>chmod +777 tac.log


Daemona TACACS+ spustíme následujícím příkazem:

>tac_plus –C /home/cnap/wal056/tac_plus.conf -d 16

kde –C udává cestu ke konfiguračnímu souboru a –d 16 úroveň podrobnosti zápisu do log souboru. Více o spouštěcích parametrech v manuálových stránkách (>man tac_plus).

Spuštění TACACSu ověříme kontrolou logu (/var/log/tac_plus.log), kde by se měl objevit podobný záznam:

Wed Dec 20 12:40:54 2006 [1986]: Reading config
Wed Dec 20 12:40:54 2006 [1986]: Version F4.0.4.alpha Initialized 1
Wed Dec 20 12:40:54 2006 [1986]: tac_plus server F4.0.4.alpha starting
Wed Dec 20 12:40:54 2006 [1986]: Backgrounded

Pro jistotu prohledáme seznam spuštěných procesů a ujistíme se, že TACACS+ server opravdu běží:

>ps –A | grep tac_plus
 1986 pts/2 00:00:00 tac_plus

Zde uvedená konfigurace TACACSu je velmi jednoduchá, my jsme se spíše zaměřili na konfiguraci routeru, jelikož ta je mnohem složitější. Navíc jsme, bohužel, nikde nenašli nějakou obsáhlejší dokumentaci, jaké další příkazy lze v konfiguračním souboru použít. Nepřišli jsme ani na to, jak například povolit určitému uživateli konfiguraci jen některých rozhraní, protože k tomu je již třeba sekvence příkazů configure terminal -> interface FastEthernet X/Y -> ip-address X.X.X.X a na způsob, jak tuto sekvenci dostat do konfiguračního souboru, jsme opravdu nepřišli.

Konfigurace routeru pro spolupráci s TACACS+ serverem

Konfigurace routeru musí být provedena tak, aby i při výpadku TACACS+ serveru byla stále zajištěna alespoň určitá kontrola přístupu na router pomocí jeho vlastních prostředků.
Nejdříve v konfiguračním režimu globálně povolíme autentizaci, autorizaci a účtování příkazem:

aaa new-model
(funkci AAA lze jednoduše vypnout klasickým způsobem: no aaa new-model)

Dále nastavíme heslo do enable režimu. Toto heslo bude použito v případě poruchy TACACS+ serveru jako přihlašovací heslo (viz níže):

enable password cisco

Nyní můžeme přistoupit k nastavení autentizace.

Nastavení autentizace
Pro aktivaci autentizace je nejprve nutné vytvořit seznamy zkoušených metod k zíkání hesla pro přístup na router. Pro každý způsob připojení na router můžeme definovat seznam zvlášť:

aaa authentication login VTYMETHOD group tacacs+ enable
aaa authentication login CONMETHOD group tacacs+ enable

Takto jsme nastavili seznamy jménem VTYMETHOD a CONMETHOD, které později přiřadíme pro daný typ připojení. Na základě těchto seznamů se heslo pro přístup na router bude získávat z TACACS+ serveru a pokud server neodpoví, pak se pro přístup použije heslo z enable režimu (lokální heslo, definované výše).
Pokud při výpadku TACACSu chceme pro autentizaci použít jiné heslo než do enable režimu, stačí klíčové slovo enable nahradit slovem local. Pak se pro připojení na router použije přihlašovací jméno a heslo z lokálního seznamu uživatelů.
Lokální uživatele pak nastavíme následovně:

username uzivatel privilege 15 password heslo

Nesmíme zapomenout nastavit router tak, aby i heslo do enable režimu bylo pokud možno vzato z TACACS+ serveru, v případě výpadku TACACSu bude použito lokálně nastavené enable heslo:

aaa authentication enable default group tacacs+ enable

Nyní je na řadě zadat adresu TACACS+ serveru a případně klíč, jímž se bude komunikace šifrovat. Tento klíč musí být shodný zde na routeru i v konfiguračním souboru TACACS+ serveru (viz výše). My jsme ale šifrování nepoužili, příkaz je zde uveden jen pro úplnost.

tacacs-server host 2.0.0.2
tacacs-server key heslo

V konfiguračním režimu nyní nastavíme metody přístupu na router a přiřadíme jim výše definované seznamy. Nejprve metoda přístupu na router přes konzoli 0:

line console 0
login authentication CONMETHOD
exec-timeout 0 0
exit

Při přístupu přes konzoli se použije heslo získané metodou definovanou v seznamu CONMETHOD, příkazem exec-timeout <m> <s> určujeme dobu nečinosti, po které bude uživatel odpojen. Hodnoty 0 0 znamenají, že uživatel nebude opojen ani při dlouhé nečinosti.

Podobně jako konzoli nyní nastavíme metodu pro připojení přes telnet. Příkaz line vty 0 2 znamená, že toto nastavení bude přiřazeno virtuálním terminálům 0, 1 a 2.

line vty 0 2
login authentication VTYMETHOD
exec-timeout 0 0
exit

Teď, když máme nastavenu autentizaci pomocí TACACS+ serveru, můžeme si toto nastavení ověřit. Pokud jsme pozměnili konfigurační soubor TACACSu, je dobré daemona restartovat:

>ps –A | grep tac_plus
 1986 pts/2 00:00:00 tac_plus
>kill 1986
>tac_plus –C /home/cnap/wal056/tac_plus.conf -d 16


Nyní se připojíme k routeru přes konzoli (pomocí minicom):
Press RETURN to get started.
User Access Verification
Username: wal056
Password: tester
Router>enable
Password: neznamheslo
% Error in authentication
Router>enable
Password: enable
Router#

Vyzkoušíme totéž z počítače PC1 přes telnet:
Ws:/home/cnap# telnet 1.0.0.1
Trying 1.0.0.1...
Connected to 1.0.0.1
Escape character is ‘^]’
Username: wal056
Password: tester
Router>enable
Password: enable
Router#

Pokud je na routeru spuštěn debug autentizace (debug aaa authentication) pak můžeme vidět komunikaci mezi routerem a TACACS+ serverem.
Server příjímá pakety protokolu TACACS+ na TCP portu 49. Pakety se přenášejí v binární podobě. My jsme je sledovali pomocí programu Ethereal.
V hlavičce paketů protokolu TACACS+ jsme zaznamenali tyto informace:

Major version: TACACS+
Minor version: 0
Type: Authentication (1)
Sequence number: 1
Flags: 0x01 (Unencrypted payload, Multiple Connections)
Session ID: 1372289594
Packet length: 21

Z těchto informací snad stojí za zmínku parametr type který udává obsah paketu: Authentication (1), Authorization (2), Accounting (3) a parametr flags určující, zda je obsah šifrovaný či nikoli.
Veškeré důležité informace se pak přenášejí v částech "request" (směr router->tacacs) a "reply" (směr tacacs->router):

Uživatel se přihlašuje na router, ten zasílá TACACSu oznámení o připojení uživatele:
 Request
  Action: Inbound Login
  Privilege Level: 1
  Authentication type: ASCII
  Service: Login
  User len: 0
  Port len: 6
  Port: tty194
  Remaddr len: 7
  Remote Address: 1.0.0.2
  Data: 0 (not used)

Odpověd TACACS+ serveru - požadavek na uživatelské jméno:
 Reply
  Status: 0x4 (Send Username)
  Flags: 0x00
  Server message length: 37
  Server message:

Router odpovídá a připojuje username:
 Request
  Flags: 0x00
  User length: 6
  User: wal056
  Data length: 0

TACACAS+ server požaduje heslo pro daný username:
 Reply
  Status: 0x5 (Send Password)
  Flags: 0x01 (NoEcho)
  Server message length: 10
  Server message: Password:
  Data length: 0

Router zasílá heslo:
 Request
  Flags: 0x00
  User length: 6
  User: tester
  Data length: 0

TACACAS+ server na základě přijatých údajů odesílá povolení pro přístup:
 Reply
  Status: 0x1 (Authentication Passed)
  Flags: 0x00
  Server message length: 0
  Data length: 0

Kompletní soubor zachycených paketů ve tvaru pro program Ethereal je zde. Textová verze zde.

V tomto případě jsme tedy dostali přístup na router přes přihlašovací údaje z TACACS+ serveru. Proč tedy nevyzkoušet zastavit TACACS+ server a ověřit, jak se autorizace bude chovat při jeho výpadku:

Zastavíme daemona tac_plus:
>ps –A | grep tac_plus
 2025 pts/2 00:00:00 tac_plus
>kill 2025

Připojení přes konzoli:
Press RETURN to get started.
Password: cisco
Router>enable
Password: cisco
Router#

Připojení z PC1 přes telnet:
>Ws:/home/cnap# telnet 1.0.0.1
Trying 1.0.0.1…
Connected to 1.0.0.1
Escape character is ‘^]’
Password: cisco
Router>enable
Password: cisco

Při výpadku TACACS+ serveru se tedy pro přístup na router použije heslo do enable režimu, tak jak bylo definováno v seznamech CONMETHOD a VTYMETHOD.

Nastavení autorizace
Teď, když máme na routeru zajištěnu autentizaci, můžeme přistoupit k nastavení autorizace, tedy filtrování příkazů pro jednotlivé uživatele.
Příkazy systému IOS v Cisco routerech jsou rozděleny do tzv. „privilegovaných úrovní“ (privilege level). V každé úrovni lze používat jen některé příkazy. Platí, že v čím vyšší úrovni se administrátor nachází, tím má větší možnost konfigurace routeru. Implicitní privilegované úrovně jsou:
Autorizaci povolujeme pro jednotlivé privilegované režimy. My jsme aktivovali autorizaci příkazů pomocí serveru TACACS+ pro režimy 1 a 15, pokud bude TACACS nedostupný, nebude se autorizace provádět vůbec a připojený uživatel bude mít k dispozici všechny příkazy:

aaa authorization commands 1 default group tacacs+ none
aaa authorization commands 15 default group tacacs+ none

Teď, když je autorizace aktivována, můžeme ji ověřit. Připojíme se k routeru z PC1 přes telnet jako uživatel „wal056“, ten má povoleny pouze příkazy show a příkaz ping pouze na určité adresy:

>ws:/home/cnap# telnet 1.0.0.1
Trying 1.0.0.1…
Connected to 1.0.0.1
Escape character is ‘^]’
Username: wal056
Password: tester
Router>enable
Password: enable
Router# configure terminal
Command authorization failed
Router#show ip route
(příkaz byl proveden)
Router# ping 2.0.1.2
Command authorization failed
Router# ping 2.0.0.2
(příkaz byl proveden)

Pokud je na routeru spuštěn debug autorizace (debug aaa authorization) pak můžeme vidět komunikaci mezi routerem a TACACS+ serverem.

Příklad autorizačních paketů zachycených programem Ethereal:
 Request
  Auth Method: NONE
  Privilege Level: 1
  Authentication type: ASCII
  Service: TAC_PLUS_AUTHEN_SVC_NONE
  User len: 6
  User: wal056
  Port len: 6
  Port: tty194
  Remaddr len: 7
  Remote Address: 1.0.0.2
  Arg count: 5
  Arg[0] length: 13
  Arg[0] value: service=shell
  Arg[1] length: 8
  Arg[1] value: cmd=show
  Arg[2] length: 10
  Arg[2] value: cmd-arg=ip
  Arg[3] length: 13
  Arg[3] value: cmd-arg=route
  Arg[4] length: 12
  Arg[4] value: cmd-arg=<cr>

Odpověď TACACS+ serveru - povolení příkazu:
 Reply
  Auth Status: 0x1 (PASS_ADD)
  Server Msg length: 0
  Data length: 0
  Arg count: 0

Parametr Service: TAC_PLUS_AUTHEN_SVC_NONE určuje přes jakou službu je uživatel autentizován (ARAP, PPP, ...) [10]. Parametr Auth status v odpovědi znamená udělení (PASS_ADD) či neudělení (FAIL) autorizace pro daný požadavek [11]. Kompletní soubor zachycených paketů ve tvaru pro program Ethereal je zde. Textová verze zde.


Nastavení účtování
Účtování lze na routeru nastavit pro tyto události [8]:
command – budou účtovány (zaznamenávány) příkazy v dané privilegované úrovni
connection – budou účtovány všechny odchozí spojení
exec – budou účtovány uživatelské EXEC příkazy
network – účtování síťově zaměřených požadavků na služby jako PPP nebo ARAP
system – budou účtovány systémové události
Zasílání účtovacích informací serveru TACACS může být aktivováno ve třech režimech:
start-stop – jeden účtovací záznam je odeslán hned na počátku relace (například při přihlášení uživatele, při počátku odchozího spojení apod.), další záznam, včetně statistik, je zaslán na konci této relace.
stop-only – celý účtovácí záznam je odeslán až při ukončení relace.
wait-start – účtovací záznam je odeslán jakmile je od TACACS+ serveru přijato potvrzení o oznámení započetí session. Další záznam včetně statistik je odeslán na konci realce.


My jsme povolili účtování pro všechny události a příkazy:
aaa accounting exec default start-stop group tacacs+
aaa accounting connection default start-stop group tacacs+
aaa accounting network default start-stop group tacacs+
aaa accounting system default start-stop group tacacs+
aaa accounting commands 0 default start-stop group tacacs+
aaa accounting commands 1 default start-stop group tacacs+
aaa accounting commands 15 default start-stop group tacacs+

Zde je příklad komunikace mezi routerem a TACACS+ serverem při přenosu účtovacích informací při zapnutém debugingu účtování (debug aaa accounting).

Soubor s účtovacími záznamy má v celku přehlednou strukturu, takže případně není problém si jej pomocí vlastního skriptu převést do HTML podoby, vytvářet statistiky, grafy a podobně.
Pro příklad uvedeme několik řádků vyjmutých z účtovacího souboru:

Wed Dec 20 14:16:13 2006 2.0.0.1 superuser tty0 async stop task_id=32 timezone=UTC service=shell priv-lvl=0 cmd=enable <cr>
Wed Dec 20 14:16:42 2006 2.0.0.1 superuser tty0 async stop task_id=32 timezone=UTC service=shell disc-cause=1 disc-cause-ext=9 pre-session-time=6 elapsed_time=31

V tomto případě přišel účtovací záznam z adresy 2.0.0.1, k routeru se připojoval uživatel superuser a v privilegované úrovni 0 spouštěl příkaz enable.
Druhý řádek obsahuje informace o odpojení uživatele superuser a statistické informace o jeho relaci.

Accounting file, který se vytvořil za dobu našeho testování si lze prohlédnout zde.



Seznam zkratek

AAA – Authentication, Autorization, Accounting – autentizace, autorizace a účtování přístupu v počítačových sítích
ARAP - Apple Remote Access Protocol
DES – Data Encryption Standard
HTML - HyperText Transfer Protocol
IOS - Internetwork Operating System
IP – Internet Protocol
RADIUS - Remote Authentication Dial In User Service
SLIP – Serial Line Internet Protocol
TACACS - Terminal Access Controller Access-Control System
PPP – Point to Point Protocol

Zdroje

[1] http://en.wikipedia.org/wiki/TACACS+
[2] http://www.cisco.com/warp/public/614/7.html
[3] http://en.wikipedia.org/wiki/AAA_protocol
[4] http://www.unix.org.ua/orelly/networking_2ndEd/fire/ch21_08.htm
[5] http://www.root.cz/clanky/tacacs/
[6] http://www.cisco.com/warp/public/480/tacplus.shtml
[7] http://www.gazi.edu.tr/tacacs/index.php?page=download
[8] http://www.ciscopress.com/articles/article.asp?p=24605&seqNum=6&rl=1
[9] http://www.ciscopress.com/articles/article.asp?p=422947&seqNum=4&rl=1
[10] http://www.xperiencetech.com/online/tac_authorparams.html
[11] http://book.itzero.com/read/cisco/0501/Cisco.Press.Network.Security.Principles.and.Practices.iNT.eBook-DDU_html/1587050250/ch17lev1sec6.html