CISCO ISE 2.x monitoring REST API
Cisco ISE (Identity Services Engine) pozwala na bezpieczny dostęp urządzeń i użytkowników do sieci przewodowych, bezprzewodowych i do VPN. Więcej informacji na temat możliwości i zastosowań ISE można znaleźć na stronie Cisco.com. Ja skupię się na bardzo przydatnej funkcjonalności dostępnej w ISE a mianowicie REST API.
Po podniesieniu wersji ISE z 2.2 do 2.3 napotkałem następujący problem. Po wejściu do interfejsu webowego do głównego menu nie wyświetla się lista aktywnych Endpointów. Mimo iż stacje końcowe są uwierzytelnione do sieci przez ISE.
Problem można rozwiązać kontaktując się z supportem CISCO, albo skorzystać z dostępnego REST API.
Do sprawdzenia ilości sesji posłużymy się Monitoring REST API. W tym celu musimy najpierw stworzyć użytkownika w jednej z poniższych grup:
- Super Admin
- System Admin
- MnT Admin
Załóżmy że stworzymy sobie użytkownika mnt_admin w grupie MnT Admin, o haśle Cisco123!
TEST API
Teraz możemy przetestować Monitoring REST API wpisując w przeglądarce:
https://< ISE-Management-Node >/API/mnt/Session/ActiveList
Pojawi się ekran do logowania. W polu username wpisujemy stworzonego przez nas wcześniej usera: mnt_admin, w polu password hasło: Cisco123!. Po poprawnym uwierzytelnieniu powinniśmy zobaczyć plik xml o postaci:
<?xml version='1.0' encoding='UTF-8'?> <activeList noOfActiveSession="226"> <activeSession> <user_name>00:22:3C:0D:BA:26</user_name> <calling_station_id>00:22:3C:0D:BA:26</calling_station_id> <nas_ip_address>192.168.10.22</nas_ip_address> <acct_session_id>0000001F</acct_session_id> <audit_session_id>0A120A02000000D40135DECF</audit_session_id> <server>ISE01</server> <framed_ip_address>172.16.22.12</framed_ip_address> <framed_ipv6_address/> </activeSession> <activeSession> <user_name>00:F1:4C:47:B2:27</user_name> <calling_station_id>00:F1:4C:47:B2:27</calling_station_id> <nas_ip_address>192.168.10.22</nas_ip_address> <acct_session_id>00000011</acct_session_id> <audit_session_id>0A120A020000003B004E8945</audit_session_id> <server>ISE01</server> <framed_ip_address>172.16.22.16</framed_ip_address> <framed_ipv6_address/> </activeSession> … <activeSession> <user_name>00:14:38:28:A9:12</user_name> <calling_station_id>00:14:38:28:A9:12</calling_station_id> <nas_ip_address>192.168.10.22</nas_ip_address> <acct_session_id>000023B1</acct_session_id> <audit_session_id>0A0C0AED000019DF4879AACD</audit_session_id> <server>ISE01</server> <framed_ip_address>172.16.22.32</framed_ip_address> <framed_ipv6_address/> </activeSession> <activeSession> <user_name>corp.local/jan.kowalski</user_name> <calling_station_id>EC:F4:BA:17:AB:0D</calling_station_id> <nas_ip_address>192.168.10.22</nas_ip_address> <acct_session_id>00002BDD</acct_session_id> <audit_session_id>0A0B02E200000DA7DF251399</audit_session_id> <server>ISE01</server> <framed_ip_address>172.16.24.12</framed_ip_address> <framed_ipv6_address/> </activeSession> </activeList>
Wynikiem jest plik XML z kilkoma wartościami dla każdej aktywnej sesji: user_name (nazwa użytkownika), calling_station_id (adres MAC stacji końcowej), nas_ip_address (adres IP urządzenia sieciowego (NAD), do którego podięty jest użytkownik), acct_session_id, audit_session_id, server (instancja ISE do której należy dana sesja) i framed_ip_address (adres IP stacji końcowej)
Druga linijka wyniku zawiera informację o liczbie sesji:
<activeList noOfActiveSession=”226″>
Napiszmy teraz skrypt, który oprócz wyświetlenia listy sesji wyświetli też metodę uwierzytelnienia MAB, albo 802.1X.
Skrypt w Pythonie
Do stworzenia skryptu posłużymy się biblioteką requests, textfsm oraz lxml. Biblioteka requests umożliwi nam połączenie się z API.
Skrypt wygląda następująco:
#!/usr/bin/python import requests, textfsm from lxml import etree user='mnt_admin' password='Cisco123!' r = requests.get('https://<ISE-Management-Node>/admin/API/mnt/Session/ActiveList',auth=(user, password)) utf8_parser = etree.XMLParser(encoding='utf-8') node = etree.fromstring(r.text.encode('utf-8'), parser=utf8_parser) xmlstr = etree.tostring(node, xml_declaration=True, encoding="UTF-8", pretty_print=True) re_table = textfsm.TextFSM(open("ise_sessions.textfsm")) fsm_results = re_table.ParseText(xmlstr) total=mab=0 for i in fsm_results: total=total+1 if i[0] == i[1]: mab=mab+1 dot1x=total-mab print "---------------------------------" print "Sessions per Method" print "Active Sessions: "+str(total) print "802.1X Session Count: "+str(dot1x) print "MAB Session Count: "+str(mab) print "---------------------------------"
Plik z szablonem textfsm wygląda następująco:
Value user_name (\S+) Value calling_station (\S+) Value nas_ip_address (\S+) Start ^\s*<activeSession>\s* -> Session Session ^\s*<user_name>${user_name}<\/user_name> ^\s*<calling_station_id>${calling_station}<\/calling_station_id> ^\s*<nas_ip_address>${nas_ip_address}<\/nas_ip_address> -> Record
Wynik działania skryptu:
root@vm01:~# ./ise_api.py --------------------------------- Sessions per Method Active Sessions: 226 802.1X Session Count: 85 MAB Session Count: 141 ---------------------------------
Wyjaśnienie:
Skrypt wyciąga i zapisuje do tablicy fsm_results następujące informacje dla każdej sesji (username, adres MAC, adres IP). Następnie jest zliczana liczba pozycji w tabeli (total) a w przypadku gdy username = adres MAC, a następuje to w sytuacji gdy uwierzytelniono się do sieci używając MAB (MAC Authentication Bypass). Reszta wyników to uwierzytelnienia przy pomocy 802.1x.
Jak widać liczba aktywnych sesji to 226, a nie tak jak pokazywało WEB GUI 0.