Wdrożenie 802.1x w oparciu o uwierzytelnienie EAP-TLS na access pointach marki Extreme

EAP-TLS jest najbezpieczniejszą metodą uwierzytelniania w sieciach komputerowych i niedawno miałem okazję takie rozwiązanie wdrożyć. Metoda ta jest oparta na certyfikatach i zakłada dwustronną weryfikację certyfikatów, czyli klient sprawdza certyfikat serwera RADIUS oraz serwer RADIUS sprawdza certyfikat klienta (wygenerowanego dla komputera lub użytkownika). Ta metoda nie wymaga żadnych haseł, więc jest najwygodniejszą metodą i najbezpieczniejszą (gdzie np. PEAP-MSCHAPv2 wykorzystuje szyfrowanie MD4 (złamane w 1995), czy EAP-TTLS/PAP nie szyfruje poświadczeń w ogóle). Minusem EAP-TLS jest wymóg posiadania urzędu certyfikacji i wdrożenia certyfikatów na serwery RADIUS oraz wszystkie urządzenia końcowe, które mają podpinać się do sieci Wi-Fi. To nie jest jednak tak trudne, jak mogłoby się wydawać. Ponadto, po wdrożeniu certyfikatów można je użyć w innym celu, na przykład do uwierzytelnienia w sieci przewodowej czy w ramach VPN (np. SSTP czy IKEv2). Róznice we wdrożeniu 802.1x dla sieci przewodowej są niewielkie i postaram się o nich wspomnieć w trakcie.

Poniżej postaram się opisać kroki potrzebne do wdrożenia certyfikatów dla użytkowników i komputerów.
W skrócie należy:

  • wdrożyć urząd certyfikacji, najlepiej na osobnej maszynie (tak, by to była jedyna rola serwera, najlepiej dwustopniowy, choć w małych firmach wystarczy jeden stopień) – ta część nie będzie opisywana w ramach tego poradnika
  • stworzyć szablony dla komputerów/użytkowników lub użyć istniejących oraz dać możliwość automatycznego żądania certyfikatów (auto-enrollment)
  • stworzyć politykę GPO, która definiuje konfigurację, dzięki której komputery będą automatycznie ządać certyfikatów o konkretnej nazwie szablonu z urzedu certyfikacji
  • zainstalować usługę serwera zasad sieciowych (Network Policy Server), czyli po prostu serwer RADIUS i skonfigurować odpowiednio reguły dla zapytań – opiszę w ramach poradnika samą konfigurację, bo instalacja roli sprowadza się do wybrania jej w Menedżerze serwera i klikanie dalej do momentu, aż się zainstaluje rolę
  • po stronie kontrolera access pointów Extreme dodać certyfikat głównego urzędu certyfikacji (i podrzędnych, jeśli są wdrożone w firmie)
  • skonfigurować w kontrolerze profil AAA wskazujący na serwer(y) RADIUS do zapytań
  • stworzyć profil Wi-Fi korzystający z wyżej wspomnianego profilu AAA
  • przypisać profile Wi-Fi
  • (opcjonalne) dodać ustawienie do GPO, które dodaje profil Wi-Fi dla wszystkich komputerów klienckich

Szablony certyfikatów dla komputerów/użytkowników

Microsoft dostarcza wytyczne, które wskazują nam jakie parametry certyfikaty dla komputerów i użytkowników powinny zawierać, by móc je wykorzystywać w EAP-TLS. Na początku wchodzimy do Certification Authority:

Następnie po rozwinięciu sekcji urzędu przechodzimy do Certificate Templates i wybieramy Manage:

Skopiuj szablon Computer i stwórz własny, np z nazwą RADIUS-Computer dla szablonu komputerów, w przypadku użytkowników skopiuj szablon User i nazwij go np. RADIUS-User. Następnie edytuj szablon klikając na niego prawym i na Properties:

Następnie zmieniamy nazwę do wyświetlania do szablonu oraz jego ogólną nazwę. Ja dodatkowo zwiększyłem czas ważności certyfikatu do 5 lat:

Poniżej wymagane parametry do certyfikatu komputera do zmiany:

I parametry dla certyfikatu użytkownika:

Po zapisaniu ustawień należy wyjść i w Certificate Templates kliknąć prawym i wybrać New -> Ceritifcate Template to Issue:

Następnie należy wybrać utworzony przez nasz szablon i wybrać OK.

Polityka GPO do auto-enrollmentu certyfikatów

Poniżej można zobaczyć ustawienia, obiektu GPO, które należy ustawić dla komputera…

…i dla użytkownika.

Konfiguracja serwera zasad sieciowych (NPS, który służy nam jako RADIUS)

Usługę można zainstalować one-linerem w PowerShellu z uprawnieniami administratora:

Install-WindowsFeature NPAS -IncludeManagementTools

Po instalacji należy:

  • dodać klienta lub klientów RADIUS,
  • dodać politykę w Connection Request Policies,
  • dodać politykę w Network Policies.

W zależności od tego, w jaki sposób będą wykonywane zapytania do RADIUSa należy dodać jednego lub więcej klientów. W przypadku, gdy switche czy access pointy mają kontroler, który umożliwia pełnienie rolę proxy dla zapytań, wystarczy dodać jednego klienta o adresie kontrolera. Gdy takiej możliwości nie ma, należy dodać klienty dla każdego access pointa/switcha. Na początek polecam sobie ustawić jakieś banalnie proste hasło we współdzielonym sekrecie, jak np. 1234567890. Nie ma znaków specjalnych i na początek nie ma co się obawiać o to. Jak wszystko będzie działać, wtedy można zmienić na coś silnego. Teraz nie chcemy się obawiać, że po którejś stronie zrobiliśmy babola.

Następnie w Connection Request Policies zrobiłem regułę z następującymi ustawieniami:

W zakładce Settings zostawiłem ustawienia domyślne. Następnie należy dodać politykę w Network Policies. Jedna jest dla komputerów, druga dla użytkowników.

Poniżej warunki dla polityki dla certyfikatów komputerów:

Poniżej warunki dla polityki dla certyfikatów użytkowników:

Jedyne, co zmieniamy w zakładce Constraints to Authentication methods. Należy wybrać tylko metodę: Microsoft: Smart Card or other certificate i edytować ustawienia tak, by wybrać certyfikat serwera z szablonu RADIUS-Computer. W moim przypadku NPS jest wdrożony na kontrolerze domeny, więc jest wybór i musi być właściwy.

W zakładce Settings zmiany są zależne od sprzętu, z którym pracujemy. Czasami, jeśli pakiety RADIUSa są za duże zmniejsza się MTU pakietów na 1344 (zależne od sprzętu), by rozwiązać problem. Można też ustawić w Vendor Specific parametry, które pozwalają kontrolerowi/access pointom/switchom na przykład wybrać VLAN, do którego mają być wrzuceni użytkownicy w ramach tej polityki. W naszym przypadku nie dodajemy tutaj nic.

Dobrą praktyką jest wdrożenie takich dwóch serwerów. W przypadku tego wdrożenia wdrożyłem NPS na dwóch kontrolerach domeny, dzięki czemu zawsze jeden jest dostępny w razie aktualizacji.

Dodanie certyfikatu CA do kontrolera Extreme WiNG

Całość zrobiłem przez SSH, dlatego, bo było najprościej.

Na początku stworzyłem plik tar z moim certyfikatem CA:

root@ubuntuapps:/var/www/static# tar -cvf serba-ca.tar serba-ca.crt
serba-ca.crt

Następnie wrzuciłem je na serwer WWW, bo to jest najprostsza opcja kopiowania plików do kontrolera.

vx9000-XXXXXX>en
vx9000-XXXXXX#file-sync load-file trustpoint serba-ca http://192.168.X.Y/serba-ca.tar
--------------------------------------------------------------------------------
       CONTROLLER           STATUS                     MESSAGE                  
--------------------------------------------------------------------------------
  vx9000-XXXXXX         Success         Successfully initiated load file        
--------------------------------------------------------------------------------
vx9000-XXXXXX#show file-sync load-file-status                                                
Download of serba-ca trustpoint is in progress
vx9000-XXXXXX#show file-sync load-file-status
Download of serba-ca trustpoint is in progress
vx9000-XXXXXX#show file-sync load-file-status
Download of serba-ca trustpoint is in progress
vx9000-XXXXXX#show file-sync load-file-status
Download of serba-ca trustpoint is complete
vx9000-XXXXXX#config
Enter configuration commands, one per line.  End with CNTL/Z.
vx9000-XXXXXX(config)#vx9000 AA-BB-CC-DD-EE-FF
vx9000-XXXXXX(config-device-AA-BB-CC-DD-EE-FF)#trustpoint https wing      
vx9000-XXXXXX(config-device-AA-BB-CC-DD-EE-FF)#trustpoint radius-ca serba-ca
vx9000-XXXXXX(config-device-AA-BB-CC-DD-EE-FF)#commit
vx9000-XXXXXX(config-device-AA-BB-CC-DD-EE-FF)#end

Konfiguracja połączenia access pointów z RADIUS oraz konfiguracja profilu Wi-Fi na kontrolerze Extreme WiNG VX9000

Na początku należy stworzyć profil AAA, w którym wrzucimy nasze serwery RADIUS, więc wchodzimy w kontrolerze Extreme WiNG w Policies -> AAA i klikamy plusa, by stworzyć politykę:

Następnie w zakładce General dodajemy wpisy dla serwerów NPS. W tym przypadku dodaje drugi kontroler. Istotne jest to, by w polu secret hasło współdzielone zgadzało się z tym ustawionym w NPSie. W Request Proxy Mode wybieramy Through Wireless Controller, dzięki czemu zapytania są wysyłane tylko z jednego adresu IP.

Następnie w zakładce RADIUS upewniamy się, że mamy takie ustawienia, jak powyżej – w szczególności Authentication Protocol. Server Pooling można ustawić na dwa sposoby: Fail Over, czyli zawsze w kolejności listy będą wykonywane zapytania do serwerów RADIUS, lub Load-Balance, gdzie zapytania będą równomiernie rozrzucane w systemie round robin na wszystkie serwery RADIUS na liście.

Tworzenie profilu Wi-Fi i przypisanie do access pointów

W Wireless klikamy +, wypełniamy nazwę profilu SSID, po czym klikamy ADD.

Z najistotniejszych rzeczy, w przypadku WPA2-Enterprise PMF – Protected Management Frames są opcjonalne, lecz w przypadku WPA3-Enterprise pole musi być ustawione na mandatory. Ponadto zawsze warto zaznaczyć opcję Fast BSS Transition, bo dzięki temu roaming pomiędzy access pointami jest płynniejszy. Ponadto warto zaznaczyć Multi Band Operation. Tutaj opis, co ta funkcja robi.

Następnie, w zakładce Security wybieramy Select Authentication EAP, w AAA policy wskazujemy nasz stworzony profil. W sekcji Encryption wybieramy CCMP lub GCMP256 (wymagane do WPA3-Enterprise 192-bit, lecz wtedy trzeba wyłączyć Fast BSS Transition) i podajemy pre-shared key, który sobie generujemy. W EAP types zaznaczamy opcję Allow i wybieramy w Select EAP-Type TLS jako jedyna akceptowalna opcja.

W Client Load Balancing nie trzeba niczego zmieniać, ale chciałem pokazać jakie są dostępne ustawienia. Po tym można zapisać profil.

W WiNG można przypisywać profile Wi-Fi na podstawie profili lub na podstawie urządzeń. Po kliknięciu w urządzenie otwieramy ustawienia urządzenia, lecz przed tym widzimy też jaki profil dane urządzenie wykorzystuje. Ustawienia profilu i urządzenia wyglądają mniej więcej tak samo i dają dostęp do prawie wszystkich tych samych ustawień (z wyjątkiem unikalnych dla urządzenia, tych nie będzie w profilach). My dodamy SSID do profilu.

Załóżmy, że chcemy teraz ustawić profil dla modelu AP305C-1-WR. Wtedy musimy edytować profil default-ap305c-1. Wybieramy go.

Wybieramy Interface -> Radio, następnie klikamy na radio1.

W ustawieniach WLAN klikamy w sekcji WLAN/BSS Mappings przycisk Add i wybieramy nasz SSID, po czym zapisujemy.

Ten proces powtarzamy dla drugiego radia. Następnie ustawiamy te same ustawienia w innych profilach APków, które mamy do dyspozycji.

Na koniec należy odświeżyć ustawienia access pointów. Można to wyklikać, klikając Refresh przy każdym urządzeniu.

Drugą opcją jest połączenie się przez SSH do kontrolera Wi-Fi i wykonanie odpowiednich poleceń.

Cannot handle term 'xterm-256color'. Setting term to dumb.
vx9000-XXXXXX>en
vx9000-XXXXXX#reload on sitename exclude-controllers
//lub jeśli chcemy odświeżyć tylko wybrane apki, które np mają w nazwie "ap305c"
vx9000-XXXXXX#reload on sitename containing ap305c

Testy i tworzenie polityki GPO do przypisania profilu Wi-Fi komputerom

Najlepszym rozwiązaniem jest skonfigurowanie ręcznie profilu Wi-Fi na laptopie, który ma się do tej sieci łączyć, a potem wyeksportować profil ustawień do formatu XML i zaciągnąć go do ustawień Wi-Fi w GPO. W moim przypadku to było konieczne, ponieważ chciałem skorzystać z sieci WPA3-Enterprise (bez trybu 192-bit) i takiej opcji nie ma dostępnej do wyboru w ustawieniach przez Group Policy Management Editor.

Zaczynamy od dodania profilu ręcznie na laptopie:

Klikamy strzałkę, by wejść do szczegółów połączenia:

Następnie otwieramy ustawienia zaawansowane:

W nich ustawiamy następująco:

W Advanced settings wybieramy tryb uwierzytelniania komputera lub użytkownika, jak wolimy:

Zapisujemy i przechodzimy do ustawień Smart Card or other Certificate i wybieramy tutaj w sekcji Trusted Root Certification Authorities nasz urząd certyfikacji. Dzięki temu użytkownik nie będzie musiał zatwierdzać, że ufa temu urzędowi:

Przechodzimy do zaawansowanych ustawień certyfikatu klikając przycisk Advanced i wybieramy ponownie nasz urząd certyfikacji. To spowoduje, że komputer będzie próbował użyć certyfikatu komputera/użytkownika tylko takiego, który jest podpisany przez ten urząd:

Po tym wszystkim należy wyeksportować profil do XML:

PS C:\Users\radoslaw.serba\Desktop> netsh wlan export profile name="example_internal" folder="C:\"

Interface profile "example_internal" is saved in file "C:\WiFi-example_internal.xml" successfully.

Na końcu należy dodać następującą politykę GPO z ustawieniem w Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Wireless Network (IEEE 802.11) Policies. Dla sieci przewodowej to będzie Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Wired Network (IEEE 802.3) Policies. Klikamy prawym w puste pole i wybieramy Create A New Wireless Network Policy for Windows Vista and Later Releases:

W zakładce General w Policy Name nazywamy jakoś politykę i w sekcji z profilami klikamy Import… by zaimportować nasz plik XML:

W zakładce Network Permissions ustawienia pozostawiłem bez zmian:

Po przypisaniu obiektu GPO do OU tak, by klient go pobrał, w ustawieniach pojawi się profil tylko do odczytu:

Troubleshooting

W trakcie wdrażania napotkałem się na sporo problemów. Miejsca, które warto sprawdzać w trakcie wdrożenia to:

  • dziennik zdarzeń klienta: Applications and Services Logs -> Microsoft -> Windows -> WLAN-AutoConfig, dla połączeń przewodowych dziennik to Wired-AutoConfig
  • dziennik zdarzeń serwera NPS (jest gotowy widok stworzony automatycznie po wdrożeniu NPSa): Custom Views -> Network Policy and Access Services
  • Wireshark na serwerze NPS
  • Logi APków/kontrolera APków
  • Logi NPS (poniżej miejsce, gdzie można ustawić lokalizacje pliku)

W przypadku dziennika zdarzeń po stronie klienta najpopularniejszy błąd to ten:

Błędy EAP, które tu mogą się pojawić można znaleźć tutaj.

Logi NPS

Poniżej przykład fragmentu logu NPSa:

<Event><Timestamp data_type="4">02/20/2025 15:19:31.063</Timestamp><Computer-Name data_type="1">DC1</Computer-Name><Event-Source data_type="1">IAS</Event-Source><Acct-Session-Id data_type="1">1C6E4240-FCB0DE5701FB-1740011611</Acct-Session-Id><Class data_type="1">311 1 192.168.X.2 02/20/2025 09:06:28 471</Class><EAP-Friendly-Name data_type="1">Microsoft: Smart Card or other certificate</EAP-Friendly-Name><Fully-Qualifed-User-Name data_type="1">X.local/OU/INNEOU/Marek Marecki</Fully-Qualifed-User-Name><MS-Link-Drop-Time-Limit data_type="0">120</MS-Link-Drop-Time-Limit><MS-Link-Utilization-Threshold data_type="0">50</MS-Link-Utilization-Threshold><Service-Type data_type="0">2</Service-Type><Framed-Protocol data_type="0">1</Framed-Protocol><Vendor-Specific data_type="2">00003A8C030666756C6C</Vendor-Specific><Client-IP-Address data_type="3">192.168.X.Y</Client-IP-Address><Client-Vendor data_type="0">0</Client-Vendor><Client-Friendly-Name data_type="1">extreme</Client-Friendly-Name><Proxy-Policy-Name data_type="1">EAP-TLS Wi-Fi</Proxy-Policy-Name><Provider-Type data_type="0">1</Provider-Type><SAM-Account-Name data_type="1">SERBA\marek.marecki</SAM-Account-Name><Authentication-Type data_type="0">5</Authentication-Type><NP-Policy-Name data_type="1">EAP-TLS Wi-Fi for users</NP-Policy-Name><Packet-Type data_type="0">2</Packet-Type><Reason-Code data_type="0">0</Reason-Code></Event>

Poprawmy formatowanie, by otrzymać czytelny szablon (XML):

<Event>
    <Timestamp data_type="4">02/20/2025 15:19:31.063</Timestamp>
    <Computer-Name data_type="1">DC1</Computer-Name>
    <Event-Source data_type="1">IAS</Event-Source>
    <Acct-Session-Id data_type="1">1C6E4240-FCB0DE5701FB-1740011611</Acct-Session-Id>
    <Class data_type="1">311 1 192.168.X.2 02/20/2025 09:06:28 471</Class>
    <EAP-Friendly-Name data_type="1">Microsoft: Smart Card or other certificate</EAP-Friendly-Name>
    <Fully-Qualifed-User-Name data_type="1">SERBA.local/OU/INNEOU/Marek Marecki</Fully-Qualifed-User-Name>
    <MS-Link-Drop-Time-Limit data_type="0">120</MS-Link-Drop-Time-Limit>
    <MS-Link-Utilization-Threshold data_type="0">50</MS-Link-Utilization-Threshold>
    <Service-Type data_type="0">2</Service-Type>
    <Framed-Protocol data_type="0">1</Framed-Protocol>
    <Vendor-Specific data_type="2">00003A8C030666756C6C</Vendor-Specific>
    <Client-IP-Address data_type="3">192.168.X.Y</Client-IP-Address>
    <Client-Vendor data_type="0">0</Client-Vendor>
    <Client-Friendly-Name data_type="1">extreme</Client-Friendly-Name>
    <Proxy-Policy-Name data_type="1">EAP-TLS Wi-Fi</Proxy-Policy-Name>
    <Provider-Type data_type="0">1</Provider-Type>
    <SAM-Account-Name data_type="1">SERBA\marek.marecki</SAM-Account-Name>
    <Authentication-Type data_type="0">5</Authentication-Type>
    <NP-Policy-Name data_type="1">EAP-TLS Wi-Fi for users</NP-Policy-Name>
    <Packet-Type data_type="0">2</Packet-Type>
    <Reason-Code data_type="0">0</Reason-Code>
</Event>

Istotne elementy:

  • Timestamp – samo za siebie tłumaczy
  • Computer-Name – nazwa komputera, który przetwarza zapytanie do NPS
  • EAP-Friendly-Name – tu zobaczymy metodę autoryzacji, w naszym przypadku jest to EAP-TLS
  • Fully-Qualified-User-Name – w tym przypadku jest no użytkownik, którego używamy do logowania, może być to też komputer (w pełnej formie)
  • Client-IP-Address – jest to to samo, co znajdziemy w pakiecie Access-Request jako NAS-IP-Address, czyli adres access pointa/kontrolera APków, który wysyła zapytanie do NPSa (na podstawie tego wiemy, że do nas wysyła zapytanie to, a nie na przykład brama VPN czy np. switch)
  • Client-Friendly-Name – nazwa, którą nazwaliśmy ten adres w NPS -> Radius Clients and Servers -> RADIUS Clients
  • SAM-Account-Name – w tym przypadku jest no użytkownik, którego używamy do logowania, może być to też komputer (w skróconej formie)
  • NP-Policy-Name – nazwa zasady, do której wpadło zapytanie
  • Reason-Code – odpowiedź od serwera RADIUS, 0 oznacza akceptację połączenia, inne wartości można sprawdzić na liście poniżej

Logi z kontrolera Wi-Fi

W trybie uprzywilejowanym możemy zobaczyć, co się dzieje na urządzeniach na żywo w bardzo granularny sposób, to znaczy możemy wybrać domenę w kontrolerze, konkretny AP czy eventy związane z konkretnym adresem MAC

//dzięki temu śledzimy dosłownie wszystko, co się dzieje związanego z logowaniem się po Wi-Fi z użyciem EAP
vx9000-XXXXXX#remote-debug wireless rf-domain mysite clients all max-events 999 duration 999 events eap radius wpa-wpa2 management
//to samo, lecz śledzimy jeden adres MAC
vx9000-XXXXXX#remote-debug wireless rf-domain mysite clients AA-BB-CC-DD-EE-FF max-events 999 duration 999 events eap radius wpa-wpa2 management

Przykładowe logi:

Printing upto 999 messages from each remote system for upto 999 seconds. Use Ctrl-C to abort
[ap305c-1-XXXXXX] %%%%>20:32:49.656: eap:no eap response from wireless client AA-BB-CC-DD-EE-FF after max-retries (eap.c:420)
[ap305c-1-XXXXXX] %%%%>20:32:49.657: radius:alarm num_eap_c_tout ++ 4 (eap.c:430)
[ap305c-1-XXXXXX] 20:32:49.657: mgmt:tx deauthentication [reason: eap handshake timeout (code:23)] to AA-BB-CC-DD-EE-FF (mgmt.c:2060)
[ap305c-1-XXXXXX] 20:32:52.182: mgmt:rx auth-req from AA-BB-CC-DD-EE-FF on radio 1 (mgmt.c:4576)
[ap305c-1-XXXXXX] 20:32:52.182: mgmt:tx auth-rsp to AA-BB-CC-DD-EE-FF on radio 1. status: success (mgmt.c:1427)
[ap305c-1-XXXXXX] 20:32:52.185: mgmt:rx association-req from AA-BB-CC-DD-EE-FF on radio ap305c-1-XXXXXX:R2 signal-strength is -90dBm (mgmt.c:4550)
[ap305c-1-XXXXXX] 20:32:52.185: mgmt:Client AA-BB-CC-DD-EE-FF negotiated FT-EAP with PMF on wlan (example_internal) (mgmt.c:4066)
[ap305c-1-XXXXXX] 20:32:52.186: mgmt:tx association-rsp success to FC-B0-DE-57-01-FB on wlan (example_internal) (ssid:example_internal) with ftie 0 (mgmt.c:4157)
[ap305c-1-XXXXXX] 20:32:52.187: eap:sending eap-code-request code 1, type 1 to AA-BB-CC-DD-EE-FF (eap.c:964)
[ap305c-1-XXXXXX] 20:32:52.187: eap:sending eap-id-req to AA-BB-CC-DD-EE-FF (eap.c:993)
[ap305c-1-XXXXXX] 20:32:52.210: eap:rx eap-start from AA-BB-CC-DD-EE-FF (eap.c:655)
[ap305c-1-XXXXXX] 20:32:52.210: eap:sending eap-code-request code 1, type 1 to AA-BB-CC-DD-EE-FF (eap.c:964)
[ap305c-1-XXXXXX] 20:32:52.210: eap:sending eap-id-req to AA-BB-CC-DD-EE-FF (eap.c:993)
[ap305c-1-XXXXXX] 20:32:52.214: eap:rx eap id-response from AA-BB-CC-DD-EE-FF (eap.c:697)
[ap305c-1-XXXXXX] 20:32:52.214: radius:aaa-policy sso user:host/komputer.serba.local mac:AA-BB-CC-DD-EE-FF server_is_candidate: 1 1 0 0 0 0 0 0 0 0 0 0
 (radius.c:4894)
[ap305c-1-XXXXXX] 20:32:52.215: radius:access-req sent to wireless controller to be proxied to dc1.serba.local:1812. (attempt 1) for AA-BB-CC-DD-EE-FF (user:host/komputer.serba.local) (radius.c:3078)
[ap305c-1-XXXXXX] 20:32:52.215: eap:rx eap id-response from AA-BB-CC-DD-EE-FF (eap.c:697)
[ap305c-1-XXXXXX] 20:32:52.215: eap:rx eap-id-response from AA-BB-CC-DD-EE-FF in state 162!=EAP_ID_SENT. Ignoring (eap.c:700)
[ap305c-1-6BCE40] 20:32:52.220: radius:RAD_MSG_AUTHENTICATOR (radius.c:1192)

Wireshark

Wireshark na NPSie to świetne rozwiązanie do wykrywania potencjalnych problemów, ze względu na to, że możemy podejrzeć pakiety RADIUSa i zobaczyć jakie parametry są podawane w zapytaniach oraz czy serwer na nie odpowiada i jeśli tak to jak. Brak odpowiedzi serwera RADIUS na zapytanie od kontrolera oznacza, że klucz współdzielony się nie zgadza po obu stronach i najlepiej go ustawić jeszcze raz na obu.

W tym zapytaniu widzimy:

  • User-Name to naż użytkownik, lecz jeśli zaczyna się na host/ to jest to konto komputera
  • Calling-Station-Id – adres MAC karty sieciowej laptopa
  • Called-Station-Id – adres MAC karty sieciowej APka + SSID, do którego się łączy laptop
  • NAS-Port-Type – typ połączenia, w naszym przypadku bezprewodówka
  • Framed-MTU – wielkość pakietu
  • NAS-Identifier – w tym polu jest nazwa hosta naszego access pointa, do którego się łączy klient
  • NAS-Port-Id – nazwa interfejsu, do którego łączy się klient w access poincie
  • Connect-Info – szczegóły jakości połączenia, którą może używać klient
  • NAS-IP-Address – adres IP, z którego przychodzi zapytanie (w naszym przypadku kontroler Wi-Fi)

Co prawda, nie mam tutaj dobrego przykładu wykrycia problemu, aczkolwiek trzeba w pierwszej kolejności wypatrywać, czy pojawiają się pakiety Access-Reject, bo to oznacza, że NPS odrzucił zapytanie od klienta.

Tymczasowe wyłączenie weryfikacji CRL

W trakcie mojego wdrożenia miałem problem z tym, że serwery nie były w stanie się połączyć z adresem, na którym była lista odwołań certyfikatów, efektywnie blokując wszystkim możliwość połączenia się z siecią.

Tutaj można znaleźć jakie wpisy należy dodać do rejestru, by wyłączyć weryfikację. W moim przypadku pomogło to zweryfikować problem, a tutaj znajdziemy więcej informacji, jak NPS sprawdza te listy.

Kody błędów NPSa

Kopiuję je z innej stronki, ponieważ nie byłem w stanie znaleźć żadnej stronki Microsoftu, która ma wszystkie wylistowane. Blogi mają to do siebie, że jednego dnia istnieją, potem znikają, więc wolę je zachować.

00: IAS_SUCCESS
01: IAS_INTERNAL_ERROR
02: IAS_ACCESS_DENIED
03: IAS_MALFORMED_REQUEST
04: IAS_GLOBAL_CATALOG_UNAVAILABLE
05: IAS_DOMAIN_UNAVAILABLE
06: IAS_SERVER_UNAVAILABLE
07: IAS_NO_SUCH_DOMAIN
08: IAS_NO_SUCH_USER
09: The request was discarded by a third-party extension DLL file.
10: A third-party extension DLL has failed and cannot perform its function.
16: IAS_AUTH_FAILURE
17: IAS_CHANGE_PASSWORD_FAILURE
18: IAS_UNSUPPORTED_AUTH_TYPE
19: No reversibly encrypted password is stored for the user account
20: Lan Manager Authentication is not enabled.
21: An IAS extension dynamic link library (DLL) that is installed on the NPS server rejected the connection request.
22: The client could not be authenticated because the EAP type cannot be processed by the server.
23: Unexpected error. Possible error in server or client configuration.
32: IAS_LOCAL_USERS_ONLY
33: IAS_PASSWORD_MUST_CHANGE
34: IAS_ACCOUNT_DISABLED
35: IAS_ACCOUNT_EXPIRED
36: IAS_ACCOUNT_LOCKED_OUT
37: IAS_INVALID_LOGON_HOURS
38: IAS_ACCOUNT_RESTRICTION
48: IAS_NO_POLICY_MATCH
49: Did not match connection request policy
64: IAS_DIALIN_LOCKED_OUT
65: IAS_DIALIN_DISABLED
66: IAS_INVALID_AUTH_TYPE
67: IAS_INVALID_CALLING_STATION
68: IAS_INVALID_DIALIN_HOURS
69: IAS_INVALID_CALLED_STATION
70: IAS_INVALID_PORT_TYPE
71: IAS_INVALID_RESTRICTION
72: The user cannot change his or her password because the change password option is not enabled for the matching remote access policy
73: The Enhanced Key Usage (EKU) extensions, section of the user or computer certificate are not valid or are missing.
80: IAS_NO_RECORD
96: IAS_SESSION_TIMEOUT
97: IAS_UNEXPECTED_REQUEST
112: The remote RADIUS server did not process the authentication request.
113: The local NPS proxy attempted to forward a connection request to a member of a remote RADIUS server group that does not exist.
115: The local NPS proxy did not forward a RADIUS message because it is not an accounting request or a connection request.
116: The local NPS proxy server cannot forward the connection request to the remote RADIUS server because either the proxy cannot open a Windows socket over which to send the connection request, or the proxy server attempted to send the connection request but received Windows sockets errors that prevented successful completion of the send operation.
117: The remote RADIUS (Remote Authentication Dial-In User Service) server did not respond.
118: The local NPS proxy server received a RADIUS message that is malformed from a remote RADIUS server, and the message is unreadable.
256: The certificate provided by the user or computer as proof of their identity is a revoked certificate. Because of this, the user or computer was not authenticated, and NPS rejected the connection request.
257: Due to a missing dynamic link library (DLL) or exported function, NPS cannot access the certificate revocation list to verify whether the user or client computer certificate is valid or is revoked.
258: The revocation function was unable to check revocation for the certificate.
259: The certification authority that manages the certificate revocation list is not available. NPS cannot verify whether the certificate is valid or is revoked. Because of this, authentication failed.
260: The message supplied for verification has been altered.
261: NPS cannot contact Active Directory Domain Services (AD DS) or the local user accounts database to perform authentication and authorization. The connection request is denied for this reason.
262: The supplied message is incomplete. The signature was not verified.
263: NPS did not receive complete credentials from the user or computer. The connection request is denied for this reason.
264: The Security Support Provider Interface (SSPI) called by EAP reports that the system clocks on the NPS server and the access client are not synchronized.
265: The certificate that the user or client computer provided to NPS as proof of identity chains to an enterprise root certification authority that is not trusted by the NPS server.
266: The message received was unexpected or badly formatted.
267: The certificate provided by the connecting user or computer is not valid because it is not configured with the Client Authentication purpose in Application Policies or Enhanced Key Usage (EKU) extensions. NPS rejected the connection request for this reason.
268: The certificate provided by the connecting user or computer is expired. NPS rejected the connection request for this reason.
269: The Security Support Provider Interface (SSPI) called by EAP reports that the NPS server and the access client cannot communicate because they do not possess a common algorithm.
270: Based on the matching NPS network policy, the user is required to log on with a smart card, but they have attempted to log on by using other credentials. NPS rejected the connection request for this reason.
271: The connection request was not processed because the NPS server was in the process of shutting down or restarting when it received the request.
272: The certificate that the user or client computer provided to NPS as proof of identity maps to multiple user or computer accounts rather than one account. NPS rejected the connection request for this reason.
273: Authentication failed. NPS called Windows Trust Verification Services, and the trust provider is not recognized on this computer. A trust provider is a software module that implements the algorithm for application-specific policies regarding trust.
274: Authentication failed. NPS called Windows Trust Verification Services, and the trust provider does not support the specified action. Each trust provider provides its own unique set of action identifiers. For information about the action identifiers supported by a trust provider, see the documentation for that trust provider.
275: Authentication failed. NPS called Windows Trust Verification Services, and the trust provider does not support the specified form. A trust provider is a software module that implements the algorithm for application-specific policies regarding trust. Trust providers support subject forms that describe where the trust information is located and what trust actions to take regarding the subject.
276: Authentication failed. NPS called Windows Trust Verification Services, but the binary file that calls EAP cannot be verified and is not trusted.
277: Authentication failed. NPS called Windows Trust Verification Services, but the binary file that calls EAP is not signed, or the signer certificate cannot be found.
278: Authentication failed. The certificate that was provided by the connecting user or computer is expired.
279: Authentication failed. The certificate is not valid because the validity periods of certificates in the chain do not match. For example, the following End Certificate and Issuer Certificate validity periods do not match: End Certificate validity period: 2007-2010; Issuer Certificate validity period: 2006-2008.
280: Authentication failed. The certificate is not valid and was not issued by a valid certification authority (CA).
281: Authentication failed. The path length constraint in the certification chain has been exceeded. This constraint restricts the maximum number of CA certificates that can follow this certificate in the certificate chain.
282: Authentication failed. The certificate contains a critical extension that is unrecognized by NPS.
283: Authentication failed. The certificate does not contain the Client Authentication purpose in Application Policies extensions, and cannot be used for authentication.
284: Authentication failed. The certificate is not valid because the certificate issuer and the parent of the certificate in the certificate chain are required to match but do not match.
285: Authentication failed. NPS cannot locate the certificate, or the certificate is incorrectly formed and is missing important information.
286: Authentication failed. The certificate provided by the connecting user or computer is issued by a certification authority (CA) that is not trusted by the NPS server.
287: Authentication failed. The certificate provided by the connecting user or computer does not chain to an enterprise root CA that NPS trusts.
288: Authentication failed due to an unspecified trust failure.
289: Authentication failed. The certificate provided by the connecting user or computer is revoked and is not valid.
290: Authentication failed. A test or trial certificate is in use, however the test root CA is not trusted, according to local or domain policy settings.
291: Authentication failed because NPS cannot locate and access the certificate revocation list to verify whether the certificate has or has not been revoked. This issue can occur if the revocation server is not available or if the certificate revocation list cannot be located in the revocation server database.
292: Authentication failed. The value of the User-Name attribute in the connection request does not match the value of the common name (CN) property in the certificate.
293: Authentication failed. The certificate provided by the connecting user or computer is not valid because it is not configured with the Client Authentication purpose in Application Policies or Enhanced Key Usage (EKU) extensions. NPS rejected the connection request for this reason.
294: Authentication failed because the certificate was explicitly marked as untrusted by the Administrator. Certificates are designated as untrusted when they are imported into the Untrusted Certificates folder in the certificate store for the Current User or Local Computer in the Certificates Microsoft Management Console (MMC) snap-in.
295: Authentication failed. The certificate provided by the connecting user or computer is issued by a CA that is not trusted by the NPS server.
296: Authentication failed. The certificate provided by the connecting user or computer is not valid because it is not configured with the Client Authentication purpose in Application Policies or Enhanced Key Usage (EKU) extensions. NPS rejected the connection request for this reason.
297: Authentication failed. The certificate provided by the connecting user or computer is not valid because it does not have a valid name.
298: Authentication failed. Either the certificate does not contain a valid user principal name (UPN) or the value of the User-Name attribute in the connection request does not match the certificate.
299: Authentication failed. The sequence of information provided by internal components or protocols during message verification is incorrect.
300: Authentication failed. The certificate is malformed and Extensible Authentication Protocl (EAP) cannot locate credential information in the certificate.
301: NPS terminated the authentication process. NPS received a cryptobinding type length value (TLV) from the access client that is not valid. This issue occurs when an attempt to breach your network security has occurred and a man-in-the-middle (MITM) attack is in progress. During MITM attacks on your network, attackers use unauthorized computers to intercept traffic between your legitimate hosts while posing as one of the legitimate hosts. The attacker’s computer attempts to gain data from your other network resources. This enables the attacker to use the unauthorized computer to intercept, decrypt, and access all network traffic that would otherwise go to one of your legitimate network resources.
302: NPS terminated the authentication process. NPS did not receive a required cryptobinding type length value (TLV) from the access client during the authentication process.

Do poczytania/obejrzenia dodatkowo:

https://community.fortinet.com/t5/FortiGate/Technical-Tip-RADIUS-error-codes/ta-p/270026

https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/sec_usr_radatt/configuration/xe-16/sec-usr-radatt-xe-16-book/sec-rad-ov-ietf-attr.html

https://documentation.extremenetworks.com/WiNG%20Controller%207.9.5.1%20CLI%20Reference%20Guide/downloads/WiNG_Controller_Access_Point_7_9_5_1_CLI_Reference_Guide.pdf

https://extreme-networks.my.site.com/ExtrArticleDetail?an=000082369

https://mywlannotes.blogspot.com/2021/05/ccmp-vs-gcmp.html

Stormshield jako podrzędny urząd certyfikacji dla AD CS w filtrze SSL i dodawanie certyfikatu SSL dla strony

Okej, ten sam temat przerabialiśmy wcześniej z FortiGate i teraz robimy to na Stormshieldzie. Nie chce mi się instalować przez GPO wbudowanego certyfikatu ze Stormshielda na każdym komputerze. Łatwiej jest podpisać certyfikat dla podrzędnego CA, którym byłby Stormshield i temat załatwiony, bo główne CA i tak mają wszyscy w komputerach po instalacji AD CS. Druga rzecz to jest to, by stronka wyświetlała stronkę Stormshielda jako bezpieczną. Zaczniemy najpierw od tego. Przykłady są bazowane na SNS 4.0.3, ale równie dobrze to będzie działało zarówno na starszych jak i nowszych wersjach.

Instalowanie certyfikatu SSL dla strony

To, jak uzyskać taki certyfikat z AD CSa opisałem tutaj, więc zapraszam do lekturki. Po tym, gdy certyfikat już mamy wyeksportowany należy przejść do strony Stormshielda, zalogować się i przejść do zakładki Konfiguracja, następnie z lewej strony wybrać Obiekty > Certyfikaty – PKI, a następnie kliknąć Dodaj > Importuj plik.

Następnie należy wskazać ścieżkę do plików certyfikatu (certyfikat musi mieć zintegrowany klucz prywatny, więc musimy skorzystać z P12 (PKCS #12). Jeśli to jest potrzebne – podajemy hasło i klikamy Importuj.

Poniżej coś, na co się naciąłem przy generowaniu certyfikatów z Windowsa: jeśli nie zaimportujemy podpisanego certyfikatu do naszego lokalnego magazynu certyfikatów z komputera, na którym generowaliśmy CSR to nie będzie widać drzewka z urzędu certyfikacji (przykład po lewej). Po prawej jest przykład tego, jak to powinno wyglądać.

Potem należy przejść do Użytkownicy > Portal uwierzytelnienia, wybrać zakładkę Portal uwierzytelnienia i w sekcji Serwer SSL wybrać nasz nowy certyfikat, a po tym zatwierdzić ustawienia.

Po otwarciu na nowo przeglądarki strona powinna być jako bezpieczna…

Nawet po adresie IP, jeśli wykorzystaliście mój przykład z generowaniem CSR z CLI z tego posta.

Na wypadek fuck-upu

Jeśli zrobicie tak jak ja i odwołacie certyfikat, który aktualnie jest używany na Stormshieldzie to jesteście w czarnej D. W takiej sytuacji jedyne, co pozostaje do podpięcie się przez PuTTY po SSH do Stormshielda i usunięcie certyfikatu z CLI. Należy otworzyć plik konfiguracyjny za pomocą polecenia:

joe ConfigFiles/auth

Następnie należy w pliku wyczyścić w sekcji [Config] wartość pola SslCertificate=:

Po tym wystarczy zapisać skrótem Ctrl+K+X i wykonać polecenie enauth. To zrestartuje portal i znowu będziemy mieć samopodpisany certyfikat SSL.

Certyfikat SSL dla podrzędnego CA w celu filtrowania SSL

Generowanie certyfikatu i import wygląda podobnie. Szablon w pliku tekstowym wygląda tak:

[Version]
Signature="$Windows NT$"
 
[NewRequest]
;w tym polu określamy dane certyfikatu
Subject = "C=PL, O=it.supra.tf, CN=stormshield.stormshield.local, L=Tychy, S=śląskie, [email protected], OU=IT"
KeySpec = 1
KeyLength = 2048
Exportable = TRUE
MachineKeySet = TRUE
SMIME = False
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
KeySpec = AT_KEYEXCHANGE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = CERT_CRL_SIGN_KEY_USAGE
HashAlgorithm = SHA256

[RequestAttributes]
CertificateTemplate=SubCA

Równie dobrze można to zrobić z GUI. W praktyce działa tak samo. Sposób wystawiania takiego certyfikatu i eksportowania go opisałem tutaj. Tutaj część o robieniu tego przez CLI. Certyfikat dla podrzędnego CA importuje się tak samo, jak ten do stronki:

Następnie w Kontrola aplikacji > Analiza protokołów > SSL należy wybrać Pokaż ustawienia wspólne dla wszystkich profili i wybrać w Główny urząd certyfikacyjny (CA) nasz urząd certyfikacji:

Na koniec wystarczy dodać hasło do certyfikatu i zapisać.

Tak wygląda efekt końcowy:

Masowe dodawanie obiektów w DHCP w Stormshield

Przenoszenie się z jednego rozwiązania na drugie zwykle jest uciążliwe, w szczególności, gdy ma się pod sobą dużo hostów…na przykład 200. Często firmy stosują statyczne przydziały DHCP i przepisywanie ich byłoby katorgą w miejscu, gdzie mamy kilka razy coś wyklikać, więc prostszym rozwiązaniem jest masowy import konfiguracji i to postaram się pokazać jak się robi w Stormshieldzie.

NIESUPPORTOWANE ROZWIĄZANIE

Tak, to jest nie supportowane rozwiązanie i robisz je na własną odpowiedzialność. Pamiętaj o zrobieniu kopii zapasowej urządzenia zanim będzie płacz i zgrzytanie zębów, a co najważniejsze nie wytykaj mnie palcem za swoje błędy w konfiguracji.

Tak poza tym – jeśli stosujesz się do instrukcji poniżej to wszystko powinno działać.

Na samym początku należy sobie wyeksportować listę obiektów, którą mamy w Stormshield. Robi się to w zakładce Konfiguracja, Obiekty > Obiekty sieciowe kilkając przycisk Eksportuj nad listą obiektów.

W efekcie dostaniemy plik tekstowy, który wygląda mniej więcej tak:

Nieprzypadkowo wrzucam ten fragment w postaci zrzutu ekranu. Polecam Visual Studio Code do edycji w takiej sytuacji, bo ten program naprawdę dobrze podkreśla segmenty pliku CSV, z którym mamy do czynienia. W tym wszystkim da się zauważyć strukturę obiektów. Nas interesują obiekty hosta, więc to, co zaczyna się od linijki

#type,#name,#begin,#end,#beginipv6,#endipv6,#comment

można usunąć, bo nie będzie nam potrzebne. Składnia obiektów hosta w tym pliku jest w pierwszej linijce:

#type,#name,#ip,#ipv6,#resolve,#mac,#comment

Następnie do tej listy po prostu musimy dopisać wedle schematu nasze komputery, które chcemy dodać do statycznych dzierżaw w DHCP. Poniżej mój przykład:

host,mojkomp,192.168.40.12,,static,11:11:11:11:11:11,""
host,mojkomp-1,192.168.40.13,,static,11:11:11:11:11:12,""
host,mojkomp-2,192.168.40.14,,static,11:11:11:11:11:13,""
host,mojkomp-3,192.168.40.15,,static,11:11:11:11:11:14,""
host,mojkomp-4,192.168.40.16,,static,11:11:11:11:11:15,""
host,mojkomp-5,192.168.40.17,,static,11:11:11:11:11:16,""
host,mojkomp-6,192.168.40.18,,static,11:11:11:11:11:17,""
host,mojkomp-7,192.168.40.19,,static,11:11:11:11:11:18,""
host,mojkomp-8,192.168.40.20,,static,11:11:11:11:11:19,""
host,mojkomp-9,192.168.40.21,,static,11:11:11:11:11:1A,""
host,mojkomp-10,192.168.40.22,,static,11:11:11:11:11:1B,""
host,mojkomp-11,192.168.40.23,,static,11:11:11:11:11:1C,""
host,mojkomp-12,192.168.40.24,,static,11:11:11:11:11:1D,""
host,mojkomp-13,192.168.40.25,,static,11:11:11:11:11:1E,""
host,mojkomp-14,192.168.40.26,,static,11:11:11:11:11:1F,""
host,mojkomp-15,192.168.40.27,,static,11:11:11:11:11:20,""
host,mojkomp-16,192.168.40.28,,static,11:11:11:11:11:21,""
host,mojkomp-17,192.168.40.29,,static,11:11:11:11:11:22,""
host,mojkomp-18,192.168.40.30,,static,11:11:11:11:11:23,""
host,mojkomp-19,192.168.40.31,,static,11:11:11:11:11:24,""
host,mojkomp-20,192.168.40.32,,static,11:11:11:11:11:25,""
host,mojkomp-21,192.168.40.33,,static,11:11:11:11:11:26,""
host,mojkomp-22,192.168.40.34,,static,11:11:11:11:11:27,""

Mając takie obiekty dopisane do listy zapisujemy zmiany i efekt końcowy powinien wyglądać tak:

Następnie należy wrócić do interfejsu, wybrać przycisk Zaimportuj oraz wskazać zmodyfikowany plik z obiektami.

Po tym należy kliknąć Zaimportuj i efekty widać niżej.

Tutaj też.

Mamy obiekty w bazie, ale trzeba jeszcze je dopisać do listy dzierżaw w DHCP. To się robi z poziomu SSH. Takie SSH należy sobie wcześniej włączyć w zakładce Konfiguracja, Ustawienia systemowe > Konfiguracja urzadzenia, w zakładce Dostęp administracyjny, w sekcji Ustawienia dostępu SSH. Po prostu trzeba zaznaczyć oba checkboxy.

Następnie należy się podpiąć poprzez dowolnego klienta SSH i po zalogowaniu wykonać polecenie:

joe ConfigFiles/dhcp

To otworzy edytora tekstu. Następnie musimy odnaleźć sekcję [Hosts] i pod nią dopisać nazwy obiektów, które stworzyliśmy, w moim przypadku były to mojkomp, mojkomp-1, mojkomp-2 itd. Najlepiej nie zostawiać przerw pomiędzy nowymi liniami, ponadto jedna nazwa obiektu = jedna linia. Na zakończenie listy powinna być jedna pusta linia odstępu od kolejnej sekcji.

Mając to gotowe należy zapisać wykonując na klawiaturze skrót Ctrl+K+X. Po tym należy wykonać polecenie endhcp, by zrestartować usługę serwera DHCP. Jeśli nie ma żadnych błędów o niepoprawności obiektów – to oznacza, że wszystko jest w porządku. Efekt wygląda tak:

Odpalanie FortiGate z zapasowej partycji po nieudanej aktualizacji

Jakiś czas zrobiłem update FortiOS u klienta do z 6.4.0 do 6.4.2 na FortiGate 100F i efekt był taki, że urządzenie się co chwile restartowało. Byłem zdziwiony, w końcu na moim urządzeniu nie było takiego problemu. W takiej sytuacji należy się podłączyć poprzez port CONSOLE w urządzeniu przez taki kabel:

Takie kable (konwerter RS-232 na USB + kabel RS-232 <-> RJ-45) z można dostać na Allegro. Na Windowsie 10 sterowniki zainstalują się same. Potem należy sprawdzić numer portu COM dla interfejsu szeregowego:

Potem należy wskazać ten port w PuTTY (ja korzystam akurat z KiTTY):

Po połączeniu widzimy konsolę i od razu widać w czym jest problem:

FortiGate-100F (23:49-05.21.2019)
Ver:05000008
Serial number: FG100FTK69696969
CPU: 1400MHz
Total RAM: 4 GB
Initializing boot device...
Initializing MAC... nplite#0
Please wait for OS to boot, or press any key to display configuration menu......

Booting OS...
Initializing firewall...

System is starting...
Starting system maintenance...
Scanning /dev/mmcblk0p2... (100%)
Scanning /dev/mmcblk0p3... (100%)
Unable to handle kernel NULL pointer dereference at virtual address 00000038
pgd = ffffffc0d9df0000
[00000038] *pgd=00000000c57b4003, *pud=00000000c57b4003, *pmd=0000000000000000
Internal error: Oops: 96000006 [#1] SMP

Modules linked in:
 linux_user_bde(P)
 linux_kernel_bde(P)
 filter4

task: ffffffc01c824080 ti: ffffffc0c6ccc000 task.ti: ffffffc0c6ccc000
PC is at vs_update+0x50/0x208
LR is at vs_update+0x3c/0x208
pc : [&lt;ffffffc000474918>] lr : [&lt;ffffffc000474904>] pstate: 60000145
sp : ffffffc0c6ccf9d0
x29: ffffffc0c6ccf9d0 x28: 0000000000000026
x27: ffffffc00048a000 x26: 0000000000000000
x25: ffffffc0cd87c000 x24: 0000000000000000
x23: ffffffc0cd87d170 x22: ffffffc0c6ccfab8
x21: ffffffc0d81e5000 x20: 0000000000000000
x19: ffffffc0c6ccfb0c x18: 0000000000000320
x17: 0000007f817c3610 x16: ffffffc00013e238
x15: ffffffffffffffff x14: ffffffffffffffff
x13: ffffffffffffffff x12: 0000000000000008
x11: 0101010101010101 x10: ff3073716e6efeff
x9 : 7f7f7f7f7f7f7f7f x8 : fefefefefefeff6a
x7 : 0080808080808080 x6 : 0000000000000000
x5 : 8080808080808000 x4 : 00000000e9120000
x3 : ffffffc0c6ccfb0c x2 : 0000000000001170
x1 : 0000000000000000 x0 : 0000000080000000

BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH

Exception stack(0xffffffc0c6ccf7f0 to 0xffffffc0c6ccf910)
f7e0:                                     c6ccfb0c ffffffc0 00000000 00000000
f800: c6ccf9d0 ffffffc0 00474918 ffffffc0 60000145 00000000 0009d4d0 ffffffc0
f820: c6ccf880 ffffffc0 00020020 ffffffbf 00000038 00000000 00000010 00000000
f840: c28f5c29 8f5c28f5 00000001 00000000 006bd6d0 00000001 00000000 00000000
f860: c6ccf960 ffffffc0 000fed78 ffffffc0 000000d0 00000000 00000002 00000000
f880: 006a4280 ffffffc0 00000000 00000000 00000000 00000000 006bd4d0 ffffffc0
f8a0: e1c00800 ffffffc0 271ae705 1b75b31a 80000000 00000000 00000000 00000000
f8c0: 00001170 00000000 c6ccfb0c ffffffc0 e9120000 00000000 80808000 80808080
f8e0: 00000000 00000000 80808080 00808080 fefeff6a fefefefe 7f7f7f7f 7f7f7f7f
f900: 6e6efeff ff307371 01010101 01010101
[&lt;ffffffc000083374>] el1_da+0x24/0x78
[&lt;ffffffc0004731a4>] sw_aggerate_d_netdevice.isra.2+0x5fc/0x638
[&lt;ffffffc000473834>] __sw_net_ioctl+0x3e4/0x5d0
[&lt;ffffffc000473a54>] sw_net_ioctl+0x34/0x58
[&lt;ffffffc0004005d0>] inet_ioctl+0x228/0x268
[&lt;ffffffc000391be8>] sock_ioctl+0x1e8/0x250
[&lt;ffffffc00013df6c>] do_vfs_ioctl+0x2dc/0x5a8
[&lt;ffffffc00013e290>] sys_ioctl+0x58/0xa8
Rebooting in 5 seconds..

Rozwiązanie jest dosyć proste: należy zrestartować urządzenie i po restarcie na samym starcie firmware nacisnąć szybko jakiś przycisk, a następnie wybrać opcję [B]: Boot with backup firmware and set as default. To spowoduje start poprzedniej wersji FortiOS z zapasowej partycji:

[&lt;ffffffc000391be8>] sock_ioctl+0x1e8/0x250
[&lt;ffffffc00013df6c>] do_vfs_ioctl+0x2dc/0x5a8
[&lt;ffffffc00013e290>] sys_ioctl+0x58/0xa8
Rebooting in 5 seconds..

FortiGate-100F (23:49-05.21.2019)
Ver:05000008
Serial number: FG100FTK69696969
CPU: 1400MHz
Total RAM: 4 GB
Initializing boot device...
Initializing MAC... nplite#0
Please wait for OS to boot, or press any key to display configuration menu...

[C]: Configure TFTP parameters.
[R]: Review TFTP parameters.
[T]: Initiate TFTP firmware transfer.
[F]: Format boot device.
[I]: System information.
[B]: Boot with backup firmware and set as default.
[Q]: Quit menu and continue to boot.
[H]: Display this list of options.

Enter C,R,T,F,I,B,Q,or H:

Loading backup firmware from boot device...


Booting OS...
.Initializing firewall...

System is starting...
Starting system maintenance...
Scanning /dev/mmcblk0p1... (100%)
Scanning /dev/mmcblk0p3... (100%)


FortiGate-100F login: admin
Password:
Welcome !

FortiGate-100F #

Dodawanie nowych domen do FortiGuarda

Jeśli nasza strona jest nowa to często może być problem, że ta nie będzie kategoryzowana w FortiGate. Możemy to bardzo szybko zmienić w kilku krokach, ponieważ mamy możliwość zgłoszenia kategorii klikając please click here na tej stronie. Po kliknięciu zobaczymy to:

Tutaj wystarczy kliknąć Click Here.

Następnie trzeba podać dane kontaktowe i zasugerować kategorię (polecam to zrobić, z reguły dostaje się to, co się wskaże).

Następnie trzeba poczekać kilka minut. Jak widać, to co dostałem mi akurat nie pasuje, bo ta strona, którą chciałem kategoryzować dotyczyła konfiguracji maila, a nie IT ogólnie. Kliknąłem oczywiście Click here, by podjąć ponowną próbę zmiany kategorii.

Jak widać, poszło.

Nieco ponad półtorej godziny później dostałem odpowiedź mailową o zmianie kategorii. Tym razem jest prawidłowa.

FortiGate jako podrzędny urząd certyfikacji dla AD CS w SSL/SSH Inspection

Często we wdrożeniach SSL deep inspection jest pomijane, bo wdrażanie go jest upierdliwe. Osobiście uważam, że pomijanie wdrażania tej funkcjonalności to głupota. Aktualnie w sieci prawie 80% ruchu jest szyfrowana SSLem, więc bez takiego wdrożenia nie jesteśmy w stanie filtrować tego całego ruchu pod kątem potencjalnych zagrożeń, bo po prostu nie jesteśmy w stanie zaglądać bezinwazyjnie do ruchu użytkownika. Problem nie dotyczy stricte FortiGate, lecz dowolnego urządzenia, które takie filtrowanie robi (dzisiaj robi to każdy normalny UTM na rynku).

Dlaczego wdrożenie tego jest upierdliwe? FortiGate w ramach tej techniki rozszyfrowuje ruch pomiędzy klientem i serwerem, a następnie przed dotarciem do klienta ten ruch musi ponownie zaszyfrować, więc strony, które otwiera klient będą miały podpisane certyfikaty SSL przez FortiGate’a. To powoduje, że musimy mieć certyfikat CA FortiGate’a mieć zainstalowany na każdym komputerze wpadającym w regułę deep inspection.

W przypadku grupy roboczej rzeczywiście to może być piekło, ale w takiej sytuacji raczej większym zmartwieniem jest po prostu brak domeny Active Directory w organizacji. Teoretycznie można taki certyfikat CA FortiGate wysłać użytkownikom przez GPO, ale jest ogólnie lepsze rozwiązanie (można je zastosować tylko w przypadku posiadania wdrożonej domeny Active Directory) – użycie usług certyfikatów Active Directory. Można podpisać certyfikat dla podrzędnego urzędu certyfikacji, dzięki czemu ten z góry jest zaufany w naszych komputerach domenowych, bo główny urząd certyfikacji automatycznie jest dodawany po wdrożeniu do każdego komputera będącego w AD. W ten sposób nie trzeba dogrywać na komputerach klienckich żadnych dodatkowych certyfikatów.

Standardowo nie przedstawiam tutaj sposobu jak wdrażać AD CS, bo zakładam, że to już jest wdrożone (z dodatkową funkcją Rejestracja w sieci Web dla urzędu certyfikacji). Skupiam się tutaj nad samą częścią związaną z certyfikatem dla FortiGate’a. Na początku należy sobie wygenerować klucz prywatny oraz przygotować żądanie podpisania certyfikatu dla naszego nowego urzędu. Opisałem to tutaj, więc zalecam przejrzeć jak to się robi. W stosunku do tej stronki różnica w naszej konfiguracji jest taka, że tutaj moje pole CN i DNS.1 posiada wartość fortigate.serba.local, ponieważ tak się nazywa FQDN mojego urządzenia.

Po utworzeniu CSRki dostaniemy plik z podobną zawartością jak ta:

-----BEGIN CERTIFICATE REQUEST-----
MIIDDjCCAfYCAQAwgZUxCzAJBgNVBAYTAlBMMRAwDgYDVQQIDAdzbGFza2llMQ4w
DAYDVQQHDAVUeWNoeTEUMBIGA1UECgwLaXQuc3VwcmEudGYxCzAJBgNVBAsMAklU
MSEwHwYJKoZIhvcNAQkBFhJyYWRvc2xhd0BzZXJiYS5vdmgxHjAcBgNVBAMMFWZv
cnRpZ2F0ZS5zZXJiYS5sb2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALjPgatD84GPdQlt5GytCUSjs7Mr4k3yn7mUW2QbEr9zAQ5/uRWo/rep6ptr
N2HBP4vFzCTGA4c1OGwg0yzzkz3uGEVUiJ0qdudutHGYEfDpr2Hd0kH6eH7MIqGx
GBqhe9+XRugtSojE2jDPGL3UU2eDhx8fzzovbbi+IyuOsOEtCwGl2FvPP9AnT2/s
owTOxlU2ZqaAauL+72pa0ciSdDfWh9Lat2FeWIPD34qAt/n9yK4fXpSWgWm0y+zB
ackruljZxd6gw4x0KBKdUq+a8vPdz6RK2ODBnQEG02DkxvdjfgzkzX2aNbR9QWAC
HuPGB6FdzidIf+UoBUaUKrFabhMCAwEAAaAzMDEGCSqGSIb3DQEJDjEkMCIwIAYD
VR0RBBkwF4IVZm9ydGlnYXRlLnNlcmJhLmxvY2FsMA0GCSqGSIb3DQEBCwUAA4IB
AQB/qzvsPSpFyZtqsdbBKBOZb6aHjUfFFynnI2XKIi0bjUSy0mo7O2BcHJxM2Om2
TN+52pxI7HerHSqCj2RaC7SW9NWf10s1gHxNvDMS3fK1thX2QdrssbX5oRNUQRHU
I+kUfJ4xSGUogqw8ARaxreNe99qBjClzITuGGnjMLVtDXAJYQHG4CpXGHF+TwHbW
FHnYcuCm/BtS+sNKmadpWh2ZUCQQM8nkgQXJwJLk64d4FJbIBTuyetmQ+GnqY8eo
PUSwjIPDKFIG8p1hRzUhUjr1WL7Qx0SXAg8hEJj/3/z6RxRCq8N1qRXxhEzXLjBz
AHlsjMlPW5GC21jkDCXbxcq8
-----END CERTIFICATE REQUEST-----

To jest nasze żądanie i te musimy przesłać do urzędu certyfikacji, by podpisać certyfikat. Wchodzimy na adres http://<adres-ca>/certsrv, w moim przypadku https://dc1.serba.local/certsrv:

Następnie należy wybrać Żądanie certyfikatu.

Następnie wybieramy zaawansowane żądanie certyfikatu.

Na tym etapie musimy otworzyć nasz plik CSR w jakimś edytorze tekstu, skopiować zawartość i wkleić w pole żądania. Ponadto, musimy wybrać szablon certyfikatu, dzięki czemu określamy przeznaczenie certyfikatu, który generujemy. To, co nasz interesuje to Podrzędny urząd certyfikacji. Po tym klikamy Prześlij >.

Na końcu pobieramy plik w formacie Base-64.

Ponadto, musimy pobrać certyfikat urzędu certyfikacji, co możemy zrobić na stronie głównej urzędu poprzez opcję Pobierz certyfikat urzędu certyfikacji, łańcuch certyfikatów lub listę CRL, a następnie mając zaznaczoną metodę kodowania Base 64, następnie klikając Pobierz certyfikat urzędu certyfikacji.

Mając oba certyfikaty, należy je dodać w FortiGate. Po zalogowaniu się do urządzenia należy przejść do sekcji System > Certificates i tam kliknąć Import > CA Certificate:

Po prawej stronie otworzy nam się menu, w Type wybieramy File i w Upload wskazujemy plik, a następnie zatwierdzamy:

W ten sposób CA jest dodane, więc dodatkowo warto też zmienić nazwę certyfikatu w FortiGate, by móc ją łatwiej w ustawieniach odnajdywać, co opisałem tutaj. Następnie dla certyfikatu podrzędnego CA należy zamiast Import > CA Certificate wybrać Import > Local Certificate. W Type wybieramy Certificate, następnie w Certificate file wybieramy plik certyfikatu, potem w Key file wybieramy klucz prywatny, który był wykorzystywany przy tworzeniu CSR i ewentualnie podajemy hasło do klucza. Ponadto można w Certificate Name z góry przypisać nazwę certyfikatu. Finalnie wygląda to tak:

Jak widać CA zostało dodane:

Dzięki temu możemy wykorzystywać nowy certyfikat podrzędny CA w SSL deep inspection: