Trafił do mnie na jakiś czas firewall Fortigate 60E, więc postanowiłem skorzystać z okazji i zobaczyć co oferuje platforma od strony programowalnego zarządzania. Z urządzeniami Fortigate mam styczność co jakiś czas, wielu mniejszych klientów z nich korzysta. Nie miałem okazji jednak wykorzystywać ich interfejsu API czy programowalnych funkcjonalności. Opisane funkcje testowałem na najnowszym firmware 7.0.0.
Uwierzytelnianie wywołań API na Fortigate
Interfejs API na firewallu jest domyślnie aktywny na każdym interfejsie, na którym skonfigurowane jest zarządzanie po HTTP/HTTPS. Pierwsza rzecz jaka rzuciła mi się w oczy, i raczej nie przypadła do gustu, to uwierzytelnianie użytkowników. Aby wykonywać polecenia API co do zasady musimy stworzyć konto administracyjne do API z odpowiednimi uprawnieniami. W tym celu przechodzimy do System -> Administrators -> Create New -> REST API Admin. Następnie ustalamy nazwę użytkownika, potem wybieramy lub tworzymy grupę definiującą uprawnienia, i opcjonalnie włączamy uwierzytelnianie za pomocą certyfikatów. Poprawne utworzenie konta zakończone jest wyświetleniem wygenerowanego tokenu. Jest to jedyny moment, w którym możemy go pobrać i zapisać. Nie ma możliwości późniejszego jego podejrzenia. Jeżeli go zgubimy to musimy wygenerować nowy.
To podejście jest dość standardowe i zgodne z dobrą praktyką. Jednak okazuje się, że każde konto administratora ma także dostęp do API, jeżeli jego sesja jest uwierzytelniona w przeglądarce. Możecie sprawdzić to samodzielnie. W oknie przeglądarki spróbujcie połączyć się z URL https://fortigate.virl.lan/api/v2/cmdb/firewall/address. Nie uda się i jako odpowiedź wyświetli się informacja o nieuwierzytelnionej próbie wywołania tej metody. W tym samym oknie otwórzcie teraz nową zakładkę i zalogujcie się do panelu administracyjnego. Gdy odświeżycie zakładkę z wywołaniem API zobaczycie, że metoda została poprawnie wykonana. Moim zdaniem dostęp do API powinien być całkowicie oddzielony od uprawnień do GUI.
Podgląd wywołań API na Fortigate
Nie ukrywam, że ta funkcjonalność zdobyła moje serce. Wiele razy, gdy tworzyłem zapytania API, problematyczne było stworzenie odpowiedniej struktury JSON aby metodą POST zmienić konfigurację urządzenia. Oczywiście jest dokumentacja, często są przykłady, ale nasze pomyłki w typie danych czy literówki w podawanych wartościach mogą przyprawić o ból głowy. Tymczasem na firewallach Fortigate możemy wygenerować strukturę, którą w wywołaniu API musimy wysłać do wskazanej metody. Link do samej metody też podejrzymy. Jak to działa? Załóżmy, że w konfiguracji firewalla chcemy zmienić domyślne rekordy wskazujace na serwery DNS na własne. W tym celu w GUI przechodzimy do Network->DNS, wybieramy opcję Specify i wpisujemy adresy własnych serwerów.
Nie zapisujemy zmian. Po prawej stronie znajdziemy przycisk API Preview, którego kliknięcie spowoduje wygenerowanie wartości JSON-a, który musimy wysłać w wywołaniu API oraz metodę, którą musimy wywołać, aby wprowadzić programowalnie zmiany, które właśnie odklikaliśmy w GUI.
Świetna funkcja, szkoda, że nie do wszystkich operacji takie podpowiedzi są. Nie pogardziłbym podobnym rozwiązaniem na platformach innych wiodących dostawców sprzętu sieciowego!
Dokumentacja
Czy dokumentacja do API na Fortigate jest tajna? Tak. I jest to najdziwniejsza, i najbardziej nieracjonalna rzecz jaką ostatnio widziałem w IT. Utajnienie dokumentacji do komponentu, który ma służyć do programowalnego zarządzania, czyli de facto to integracji produktu z innymi produktami czy własnymi rozwiązaniami. Tymczasem by zobaczyć aktualną dokumentację trzeba być “sponsorowanym” przez dwóch pracowników Fortineta. Nie pracuję zbyt dużo z urządzeniami tej firmy i nie miałem świadomości, że ukrywanie wielu rzeczy to świadoma polityka tego producenta. Wyjaśnili mi to koledzy, którzy częściej pracują z tymi produktami. Niemniej ukrywanie dokumentacji do API to moim zdaniem czysta kpina z użytkownika końcowego.
W gwoli ścisłości dodam, że ostatnia publiczna dokumentacja do API odnosi się do wydania 6.0.5, wszystkie kolejne są utajnione. Zatem gdy sięgniecie pod bibliotekę Pythona do API Fortigate nie mając konta w Fortinet Developer Network nie sprawdzicie nawet czy metody zostały poprawnie zaimplementowane, o tworzeniu własnych skryptów wywołujących metody bezpośrednio nie wspominając. Ta jedna rzecz sprawia, że jeżeli będę miał projekt, w którym duży nacisk będzie kładziony na DevNet/DevOps to nie zarekomenduję do niego urządzeń Fortineta.
To jakie urządzenia wybierzesz?
Wszystko tak na prawdę zależy od projektu. Zazwyczaj widzę rozwiązania Cisco i Junipera albo natywne usługi chmurowe jak Azure Firewall. Ale oczywiście to nie jest reguła. Wszystko zależy od potrzeb i wielu innych czynników. W przypadku Fortigate-a brak dostępu do dokumentacji to w moim przekonaniu punkty ujemne przy ocenie.
Dostęp do dokumentacji API nie jest utajniony. Po prostu trzeba się zweryfikować w Fortinecie i dostaje się dostęp. Przy rejestracji trzeba podać emaile dwóch osób zatrudnionych w Forinet które mogą potwierdzić naszą tożsamość. Po prostu trzeba w to włożyć minimum wysiłku. Jak ktoś chce używać api to chyba nie jest przerażające 🙂
link do rejestracji: https://fndn.fortinet.net/index.php?/register/
Osobiście uważam o za utrudnianie ludziom życia, dobrze że skanu dowodu i próbki krwi nie żądają.