Cyberbezpieczeństwo okiem programisty

CompTIA Security+ SY0-701 – ściąga

C

Data ostatniej aktualizacji: 2024-12-09.

1.0 General Security Concepts

1.1 Compare and contrast various types of security controls.

Porównaj ze sobą i wskaż różnice pomiędzy różnymi formami kontroli bezpieczeństwa, których zadaniem jest zapobieganie, wykrywanie oraz minimalizowanie skutków różnych typów zagrożeń.

Categories

  • W zależności od tego, do którego obszaru organizacji się odnosimy (dane i zasoby cyfrowe, personel, fizyczny dostęp do budynku), formy kontroli bezpieczeństwa można podzielić na stosunkowo szerokie kategorie, opisane poniżej.
Technical
  • Metody kontroli na poziomie ściśle technicznym, których zadaniem jest ochrona danych oraz systemów IT w organizacji (software oraz hardware).
  • Do tej kategorii zaliczamy m.in. firewalle, oprogramowanie antywirusowe, systemy wykrywania/zapobiegania włamań (IDS/IPS), rozwiązania DLP (Data Loss Prevention).
Managerial
  • managerial security controls (choć częściej można spotkać się z terminem administrative security controls) określa mechanizmy kontrolne na poziomie administracyjnym, czyli wyższym niż wspomniana wcześniej kategoria stricte techniczna.
  • W ramach tego zakresu możemy wymienić polityki (ang. policies), procedury (ang. procedures) oraz wytyczne (ang. guidelines), które powinny być dobrze udokumentowane oraz respektowane i stosowane przez personel organizacji, celem zapewnienia pożądanego poziomu bezpieczeństwa.
  • Przykład: spisany proces wdrażania nowego pracownika (onboarding) czy też dokument z zaleceniami bezpieczeństwa, z którym powinien zapoznać się każdy pracownik.
Operational
  • W tej kategorii security controls główną rolę odgrywa człowiek, zamiast zautomatyzowanych systemów (według słownika NIST).
  • Przykładem takich środków bezpieczeństwa są pracownicy ochrony, a także szkolenia bądź programy budowania świadomości wśród pracowników.
Physical
  • Jak sama nazwa wskazuje, ta kategoria obejmuje zabezpieczenia chroniące przed fizycznym dostępem przez osoby nieuprawnione do terenu, budynku, pojedynczego pokoju (np. serwerowni), sprzętu czy nawet dokumentów danej organizacji.
  • Przykład: budki wartownicze (ang. guard shack), ogrodzenia, zamki, czytniki kart dostępu, kamery, systemy alarmowe.

Control types

  • Innym rodzajem podziału środków bezpieczeństwa jest podział ze względu na pełnioną funkcję.
Preventive
  • Grupa środków prewencyjnych pełniących, zgodnie z swoją nazwą, funkcję zapobiegawczą. Ich zadaniem jest blokowanie wszelkich prób nieautoryzowanego dostępu, zarówno do zasobów cyfrowych, jak i fizycznych.
Deterrent
  • Rolą tych środków bezpieczeństwa jest zniechęcanie (ang. deter) i odstraszanie potencjalnego intruza poprzez dobitne wskazanie ewentualnych konsekwencji uzyskania nieautoryzowanego dostępu do strzeżonych zasobów
Detective
  • Formy kontroli bezpieczeństwa pełniące funkcję wykrywającą i ostrzegawczą.
  • Ich celem jest poinformowanie o incydencie bezpieczeństwa, który już miał miejsce.
Corrective
  • Środki naprawcze/korygujące stosowane po wystąpieniu incydentu.
  • Ich zadaniem jest minimalizacja lub całkowite usunięcie skutków zdarzenia, a także zapewnienie ciągłości działania organizacji oraz jej systemów.
Compensating
  • Środki kompensacyjne, które same w sobie nie rozwiązują pierwotnego problemu, ale pozawalają go obejść (nawet tymczasowo).
  • Są to alternatywne środki zastępcze, które stosujemy, jeśli nie jesteśmy w stanie zapobiec zagrożeniom lub naprawić skutków incydentu z użyciem standardowych i dedykowanych metod.
Directive
  • Głównym celem tego typu środków jest zachęcanie (a nawet wymuszanie) określonych czynności, dokładnie opisanych w ramach udokumentowanych wytycznych oraz przewodników.
  • Są to wszelkie strategie, których zadaniem jest egzekwowanie określonych zasad i zachowań.

1.2 Summarize fundamental security concepts.

Streść fundamentalne zagadnienia związane z bezpieczeństwem.

Confidentiality, Integrity, and Availability (CIA)

  • Triada CIA, często przedstawiana graficznie w formie trójkąta, opisuje fundamentalne cele bezpieczeństwa IT. Są to:
    • Poufność (ang. confidentiality) – ochrona przed nieautoryzowanym dostępem.
    • Nienaruszalność (ang. integrity) – ochrona przed niepożądaną modyfikacją danych.
    • Dostępność (ang. availability) – zapewnienie, że autoryzowani użytkownicy mają dostęp do danych, kiedy tylko tego potrzebują.
  • Zbieżność z akronimem amerykańskiej Centralnej Agencji Wywiadowczej (CIA = Central Intelligence Agency) jest przypadkowa, ale to skojarzenie pomaga zachować skrót na dłużej w pamięci.
  • Prawdziwym wyzwaniem dla zespołów dbających o bezpieczeństwo IT jest zapewnienie odpowiedniego poziomu dostępności do danych, przy jednoczesnym zachowaniu ich poufności.
  • Czasami można się jeszcze spotkać z terminem triady DAD (Disclosure, Alteration, Denial), która przedstawia trzy główne zagrożenia dla bezpieczeństwa IT i stanowi zupełne przeciwieństwo triady CIA:
    • Ujawnienie poufnych informacji nieupoważnionym osobom (ang. discolsure), czyli naruszenie zasady poufności.
    • Niepożądana i nieautoryzowana zmiana danych (ang. alteration), czyli naruszenie zasady nienaruszalności.
    • Odmowa dostępu do danych (ang. denial), czyli naruszenie zasady dostępności.
  • Zarówno triada CIA, jak i DAD są przydatnym punktem wyjściowym w procesie planowania i analizy ryzyka, podczas którego szacuje się prawdopodobieństwo wystąpienia ataków bądź zdarzeń losowych oraz ocenia się ich potencjalne skutki. Później, na podstawie wniosków, wdraża się stosowne środki bezpieczeństwa (ang. security controls).
  • Non-repudiation (niezaprzeczalność) nie wchodzi w skład triady CIA, ale jest również ważnym filarem bezpieczeństwa IT. Zapewnia, że osoba, która podjęła jakieś działanie (np. wysłała wiadomość) nie może się później tego wyprzeć. Dobrym przykładem środka dbającego o ten aspekt są podpisy cyfrowe.
  • W niektórych opracowaniach można spotkać z dodatkowym celem bezpieczeństwa IT, którym jest odpowiedzialność (ang. accountability). Chodzi tutaj o zbieranie informacji o aktywności użytkowników, żeby zawsze dało się wskazać osobę odpowiedzialną za dany incydent.
Confidentiality
  • Jednym z podstawowych celów bezpieczeństwa IT jest ochrona poufnych informacji przed dostępem osób, które nie są do nich upoważnione.
  • Naruszenie poufności danych może być intencjonalne (np. atakujący uzyskał nieautoryzowany dostęp do bazy danych) bądź niezamierzone (np. nastąpił wyciek w wyniku błędu pracownika organizacji).
  • Wybrane środki bezpieczeństwa (ang. security controls), które pomagają osiągnąć cel poufności:
    • Szyfrowanie danych (ang. data encryption), zarówno tych w spoczynku (ang. at-rest), przechowywanych na nośnikach danych, jak i przesyłanych przez sieć (ang. in-transit). Dzięki temu, jedynie osoba posiadająca odpowiedni klucz będzie w stanie odczytać informacje w oryginalnej formie.
    • Kontrola dostępu do danych (ang. access control) i udzielanie go jedynie uprawnionym użytkownikom bądź urządzeniom. Można w tym celu wykorzystać m.in. firewalle, które filtrują ruch sieciowy, czy też listy kontroli dostępu ACL (Access-Control List). Najprostszym przykładem wykorzystania ACL jest konfigurowanie w systemie operacyjnym, kto ma dostęp do wybranych plików i katalogów.
    • Sprawdzone mechanizmy uwierzytelniające (ang. authentication), w tym uwierzytelniania wieloskładnikowe (MFA = Multi-Factor Authentication).
    • Czasami można spotkać się z wykorzystaniem steganografii, czyli mechanizmów, których zadaniem jest ukrycie faktu jakiejkolwiek komunikacji (w odróżnieniu od szyfrowania, gdzie wymiana informacji jest jawna). Teoretycznie, ukrycie samej komunikacji może zwiększyć poziom poufności, jednakże bez dodatkowego zaszyfrowania ukrytej wiadomości, nie jest to środek wystarczający.
Integrity
  • Drugim głównym celem obszaru IT security jest spójność/nienaruszalność danych, czyli pewność, że oryginalne danie nie zostały w żaden sposób zmodyfikowane, w wyniku niepożądanych działań. Przykładowo, jeśli nastąpiła transmisja danych między użytkownikami, chcemy mieć pewność, że odbiorca otrzymał identyczną wiadomość, jaka została wysłana przez nadawcę i nikt przy niej nie majstrował w międzyczasie.
  • Nawet jeśli dane zostały w jakiś sposób naruszone, powinniśmy móc to jak najszybciej wykryć.
  • Dane mogą zostać zmodyfikowane przez atakujących, ale naruszenie spójności może też nastąpić w efekcie nieoczekiwanego zdarzenia (np. problemy z siecią mogą skutkować gubieniem pakietów).
  • Przykładem intencjonalnego naruszenia spójności danych jest podmiana treści strony firmowej (ang. website defacement). Ciekawostka: w 1996 roku, w wyniku ataku, zmieniona została witryna internetowa agencji wywiadowczej CIA.
  • Środki bezpieczeństwa, które pomagają zweryfikować integralność danych:
    • Hashing to metoda polegająca na wyliczeniu tzw. skrótu (hash), czyli nieuporządkowanego ciągu znaków o stałej długości, na podstawie danych wejściowych. Hash charakteryzuje się tym, że powinien być niepowtarzalny (przynajmniej w teorii) dla różnych danych wejściowych – nawet niewielka zmiana w oryginalnym tekście (np. dostawienie przecinka) powinna skutkować wygenerowaniem zupełnie innego skrótu. Jeśli odbiorca otrzyma informacje wraz z skrótem i będzie w stanie uzyskać identyczny hash, za pomocą tej samej funkcji hashującej, to ma pewność, że wiadomość nie została po drodze zmieniona.
    • Podpis elektroniczny (ang. digital signature) z wykorzystaniem szyfrowania asymetrycznego (z użyciem klucza prywatnego i publicznego). W skrócie: na podstawie przesyłanych danych liczony jest hash, który zostaje zaszyfrowany kluczem prywatnym nadawcy i dołączony do wiadomości (hash, nie klucz). Odbiorca może później odszyfrować otrzymany hash za pomocą klucza publicznego nadawcy. Dzięki temu odbiorca ma dodatkową pewność, że wiadomość nie tylko nie została naruszona, ale też została wysłana przez właściciela klucza.
    • Certyfikat elektroniczny (ang. digital certificate) jest to (w dużym uproszczeniu) dodatkowe poświadczenie, które potwierdza, że klucze użyte do stworzenia i weryfikacji podpisu elektronicznego, rzeczywiście należą do spodziewanego nadawcy.
Availability
  • Trzecim filarem bezpieczeństwa IT jest zapewnienie, że dane są dostępne zweryfikowanym użytkownikom zawsze, kiedy tego potrzebują.
  • Zdarzenia naruszające regułę dostępności mogą być zamierzone (np. ataki typu odmowa usługi DoS/DDoS) lub przypadkowe (np. awaria serwera; katastrofa naturalna w regionie, gdzie znajduje się nasze centrum danych).
  • Systemy należy projektować i budować w taki sposób, żeby charakteryzowały się wysoką dostępnością (ang. high availability) i były odporne na awarie. Środki, które mogą w tym pomóc:
    • Stosowanie mechanizmów fault tolerance (w dosłownym tłumaczeniu: tolerowanie awarii), które zapewniają ciągłość działania systemu, pomimo niesprawności jego określonych elementów. Na przykład: łączenie serwerów w klastry; stosowanie macierzy RAID.
    • Systematyczne tworzenie kopii zapasowych (ang. backup), na podstawie których jesteśmy w stanie szybko odtworzyć stan systemu przed incydentem.
    • Monitorowanie działania systemu (sieci, serwerów, aplikacji) z ustawionymi powiadomieniami (ang. alerts) o ewentualnych anomaliach.
    • Regularne aktualizowanie oprogramowania celem utrzymania systemów w możliwie świeżym stanie (ang. up-to-date). Dzięki temu minimalizujemy szansę wystąpienia usterek przez błędy w oprogramowaniu.
    • Business Continuity Plan (BCP) – dokument określający środki i działania, jakie należy podjąć, żeby zapewnić ciągłość działania organizacji.

Non-repudiation

  • Zasada niezaprzeczalności (ang. non-repudiation), oprócz bycia jednym z fundamentalnych zasad bezpieczeństwa IT, jest również istotnym elementem kryptografii. Zapewnia, że otrzymana wiadomość, w niezmienionej formie, została wysłana przez domniemanego nadawcę, który teraz nie może tego faktu się wyprzeć.
  • Aby osiągnąć niezaprzeczalność w cyfrowym świecie, stosuje się m.in. podpis elektroniczny (ang. digital signature), który można traktować jako wirtualny odcisk palca (ang. fingerprint). Podpis cyfrowy jest w pewnym stopniu odpowiednikiem odręcznego podpisu na fizycznym dokumencie.
  • Mechanizmy kryptograficzne, wykorzystywane w podpisach elektronicznych, są w stanie dostarczyć nam dowód niezmienności (ang. proof of integrity) oraz dowód pochodzenia (ang. proof of origin), co przekłada się na zapewnienie wysokiego stopnia autentyczności.
  • Proof of integrity – dowód niezmienności, dzięki któremu jesteśmy w stanie zweryfikować, że otrzymane informacje są dokładnie takie same, jak te wysłane przez nadawcę. Dane są spójne i nic nie zostało w nich zmienione od chwili nadania, aż do momentu odczytania.
    • Osiągalny dzięki mechanizmowi hashowania, czyli obliczania skrótu (ang. hash), reprezentującego dane w postaci krótkiego ciągu znaków o stałej długości. Hash, dzięki swoim właściwościom, pomaga stwierdzić, czy treść wiadomości nie uległa zmianie.
    • Jeśli stwierdzimy, że hash dołączony do otrzymanych danych różni się od tego, który sami obliczyliśmy (zakładając, że używamy dokładnie tej samej funkcji hashującej), powinno to wzbudzić nasze podejrzenia. Oryginalna wiadomość mogła zostać uszkodzona lub celowo zmieniona.
    • Należy pamiętać, ze sam skrót nie daje możliwości weryfikacji źródła wiadomości.
  • Proof of origin – dowód pochodzenia daje możliwość weryfikacji, kto wysłał nam wiadomość i stanowi najważniejszy element zasady niezaprzeczalności. Do utworzenia podpisu cyfrowego przez nadawcę wykorzystywany jest jej/jego klucz prywatny (ang. private key), a do weryfikacji tegoż podpisu klucz publiczny (ang. public key).
  • Uwaga! Należy pamiętać, że przedstawiona zasada niezaprzeczalności opiera się na założeniu, że klucz prywatny jest w posiadaniu domniemanego nadawcy i jest dobrze chroniony.

Authentication, Authorization, and Accounting (AAA)

Framework (czyli ramy, które definiują strukturę oraz ogólny mechanizm działania) określany mianem AAA (Authentication, Authorization, Accounting) jest istotnym elementem bezpieczeństwa sieciowego, a jego zadaniem jest kontrola i rejestrowanie dostępu do chronionych zasobów. Mówiąc krótko: determinuje kto i do jakich elementów systemu ma dostęp, a także śledzi poczynania zalogowanych użytkowników.

Jak wygląda bardzo ogólny proces nadawania dostępu do wybranych zasobów, będący częścią frameworka AAA:

  1. Pierwszym krokiem jest identyfikacja (ang. identification). Jeśli chcemy uzyskać dostęp do systemu, musimy się przedstawić jako jego uprawniony użytkownik. W najczęstszym przypadku polega to na podaniu danych uwierzytelniających w postaci unikatowej nazwy użytkownika i hasła, ale mogą to być również inne czynniki uwierzytelniające, takie jak odcisk palca czy sprzętowy klucz USB.
  2. Kiedy już się kulturalnie przedstawiliśmy, przechodzimy do etapu uwierzytelnienia (ang. authentication). Teraz system weryfikuje podane przez nas informacje uwierzytelniające i próbuje potwierdzić na podstawie danych w swojej bazie, że na pewno jesteśmy tymi, za kogo się podajemy. Jeśli wszystko się zgadza, zostajemy uwierzytelnieni i otrzymujemy dostęp do systemu.
  3. Po potwierdzeniu naszej tożsamości, czas na autoryzację (ang. authorization). To, że umożliwiono nam wejście do systemu, nie oznacza automatycznie, że mamy dostęp do wszystkich jego zasobów. Proces autoryzacji polega na przyznawaniu użytkownikowi dostępu do określonych zasobów, w zależności od jego uprawnień. Na przykład, kiedy logujemy się do naszej do bankowości elektronicznej, mamy dostęp jedynie do naszego konta, a nie do kont innych klientów. Pracownicy banku również są użytkownikami systemu bankowego i mogą mieć szerszy zakres uprawnień (np. podgląd kont swoich klientów, ale bez możliwości wykonywania na nich operacji).
  4. Trzecim filarem frameworka AAA jest śledzenie i rejestrowanie działań użytkowników w systemie, czyli tzw. accounting (można to przetłumaczyć dosłownie jako rozliczanie bądź księgowanie). Monitorowanie aktywności użytkowników w systemie (czas logowania/wylogowania; operacje wykonywane na określonych zasobach itp.) jest bardzo istotnym elementem dbania o bezpieczeństwo. Dzięki temu administratorzy systemu mogą z powodzeniem przeprowadzać audyty bezpieczeństwa, wykrywać anomalie czy analizować skutki oraz przyczyny ewentualnych incydentów.

Pamiętajmy, że przedstawiony wyżej ogólny opis frameworka AAA jest jedynie abstrakcyjnym konceptem, którego implementacja może mocno różnić się od strony technicznej, w zależności od potrzeb. Inaczej wygląda mechanizm pilnowania dostępu do pojedynczego urządzenia (np. przez protokół SSH), gdzie cały proces AAA może odbywać się pod kontrolą systemu operacyjnego tego urządzenia, a jeszcze inaczej, gdy użytkownik próbuję uzyskać dostęp do całej sieci (np. przez VPN), w której funkcjonuje scentralizowany serwer AAA.

Ogólny proces kontroli dostępu do chronionych zasobów, z wykorzystaniem scentralizowanego serwera AAA (na przykładzie protokołu RADIUS), mógłby wyglądać następująco:

Framework AAA na przykładzie scentralizowanego serwera RADIUS.
Źródło: opracowanie własne.

Dodatkowe materiały:

1.4 Explain the importance of using appropriate cryptographic solutions.

Wyjaśnij istotę i wagę stosowania odpowiednich rozwiązań kryptograficznych.

Hashing

  • Skrót (ang. hash; hash-code; fingerprint) jest to nieuporządkowany ciąg znaków o stałej długości, wygenerowany za pomocą specjalnej funkcji matematycznej na podstawie wejściowego ciągu znaków o dowolnej długości.
  • Proces obliczania skrótu (ang. hashing): dane wejściowe dowolnej długości -> funkcja hashująca -> tekstowy łańcuch znaków (ang. string) o stałej długości, zależnej od rodzaju zastosowanej funkcji.
  • Hash – cechy charakterystyczne:
    • Stała długość – niezależnie od rozmiaru danych wejściowych, wynik funkcji hashującej jest stałej długości. Na przykład, dla algorytmu SHA256, wynik zawsze będzie miał rozmiar 256 bitów (32 bajty).
    • Nieodwracalność – w przeciwieństwie do szyfrowania (ang. encryption), odzyskanie danych wejściowych na podstawie skrótu jest (a przynajmniej powinno być) obliczeniowo trudne.
    • Odporność na kolizje – kolizją (ang. collision) nazywamy sytuację, w której dwie różne wartości na wejściu spowodują wygenerowanie identycznego hasha i jest to zjawisko niepożądane. Pamiętajmy, że funkcje hashujące zwracają ciąg znaków o stałej długości, więc zakres wartości tych funkcji będzie zawsze mniejszy od zbioru danych wejściowych. Oznacza to, że hipotetycznie kiedyś do kolizji dojść musi. Istnieją jednak algorytmy (np. funkcje z rodziny SHA2 i SHA3), które mają tak duży zakres danych wyjściowych, że jeszcze nie odnaleziono dla nich przykładów kolizji. Natomiast dla algorytmu MD5 odnotowano kolizje już w 1996 roku, dlatego nie powinno się go wykorzystywać do krytycznych funkcjonalności, takich jak np. przechowywanie haseł.
  • Przykład: skrót SHA256 dla tekstu admin123, to 240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9.
  • Nawet niewielka zmiana w danych wejściowych spowoduje wygenerowanie zupełnie innego skrótu. Na przykład, jeśli do tekstu wejściowego z powyższego przykładu dodamy jedynie wykrzyknik (admin123!), to hash będzie wyglądał już całkowicie inaczej: 5c06eb3d5a05a19f49476d694ca81a36344660e9d5b98e3d6a6630f31c2422e7.
  • Przykładowe zastosowania hashingu:
    • Gwarancja niezmienności danych – możemy wykorzystać unikatowy charakter skrótu do wygenerowania sygnatury dla określonych danych. Jeśli nie mamy pewności, czy ściągnięty plik nie został zmodyfikowany gdzieś po drodze, możemy dla pewności porównać sygnaturę ściągniętego pliku (jego hash), uzyskaną za pomocą wskazanego algorytmu, z tą udostępnioną dla oryginalnego pliku.
    • Przechowywanie haseł – trzymanie haseł użytkowników w postaci czystego tekstu jest bardzo złym pomysłem ze względu na potencjalne wycieki danych. Dlatego w bazach danych, zamiast jawnych haseł, przechowuje się wyniki kryptograficznych funkcji skrótu, charakteryzujące się nieodwracalnością i silną odpornością na kolizje. Kiedy użytkownik podaje hasło w ramach procesu uwierzytelniania, zostaje wyliczony skrót z użyciem identycznej funkcji i jest on porównywany z tym zapisanym w bazie.
    • Podpisy elektroniczne – dzięki nim wiemy, że dane zostały przesłane przez zaufanego nadawcę. Hash pełni tutaj funkcję pomocniczą, jako sygnatura oryginalnych danych, która później jest jeszcze szyfrowana za pomocą algorytmu szyfrowania asymetrycznego. Dzięki temu sam podpis elektroniczny nie generuje ogromnego narzutu dodatkowy bajtów do wysłania.
    • Łatwe porównywanie zawartości plików – jeśli chcemy szybko porównać zawartość plików tekstowych, to zamiast całych plików, w bazie możemy przechowywać tylko skrót wyliczony na podstawie tejże zawartości. Wiedząc, że nawet niewielka zmiana powoduje wygenerowanie zupełnie innego skrótu, możemy wykorzystać tę właściwość do szybkiego porównywania i zidentyfikowania ewentualnych duplikatów.
    • Technologia blockchain – w dużym uproszczeniu: blockchain to nic innego jak rozproszona baza danych z zapisanym łańcuchem transakcji, do którego stale dodawane są nowe transakcje. Transakcją może być np. informacja o tym, że ktoś zakupił bądź sprzedał określoną ilość Bitcoinów. Zastosowanie skrótów pozwala na zweryfikowanie czy nowa transakcja jest prawdziwa i dozwolona, zanim zostanie dodana do łańcucha.
  • W przypadku weryfikacji ściągniętych plików możemy spotkać się z pojęciem sumy kontrolnej (ang. checksum). Należy zaznaczyć, że choć hash może być wykorzystany jako suma kontrolna, to jednak jest to zupełnie inny mechanizm. Celem stosowania sum kontrolnych jest sprawdzenie, czy nie wystąpiły przypadkowe błędy w czasie transmisji danych (np. podczas wysyłania przez sieć lub zapisu na nośniku danych). W związku z tym, używają one prostszych i szybszych algorytmów, ale przez to nie są odporne na kolizje i można w łatwy sposób je sfałszować.

Salting

  • Uzyskanie oryginalnej wartości na podstawie hasha jest praktycznie niemożliwe, jednakże realne jest jej odgadnięcie metodą siłową (ang. brute force): obliczamy skróty dla kolejnych wartości, aż otrzymamy hash identyczny z tym, który próbujemy złamać.
    • W przypadku bardzo prostych (uznawanych za słabe) haseł może nastąpić to bardzo szybko.
    • Techniką przyspieszającą ataki siłowe są tęczowe tablice (ang. rainbow table), czyli przygotowane wcześniej bazy wyrażeń wraz z ich wstępnie wyliczonymi skrótami. Taka baza przypomina trochę skompresowaną strukturę lookup table, gdzie możemy szybko odnaleźć interesującą nas parę hash-hasło.
  • Aby utrudnić ataki siłowe prowadzące do złamania hasha, stosuje się tzw. solenie (ang. salting). Proces ten polega na dodaniu losowego łańcucha znaków, zwanego solą (ang. salt), do oryginalnej wartości, jeszcze przed obliczeniem skrótu. Na przykład: do hasła admin123 dodajemy sól o losowej wartości c56Tfrcb5, więc ostatecznie funkcja hashująca otrzyma na wejściu wyrażenie admin123c56Tfrcb5.
  • Do każdego użytkownika przeważnie jest przypisana inna sól, dzięki czemu, nawet jeśli pojawią się powtórzone hasła, ich skróty będą znacząco się różnić. Podczas procesu uwierzytelniania, kiedy użytkownik podaje swoje hasło, przed obliczeniem skrótu celem porównania, dodawana jest odpowiednia sól.
  • Istnieje ryzyko, że wartość soli, która jest przechowywana w bazie danych, może również zostać wykradziona wraz z skrótami haseł – w takim przypadku atak siłowy ciągle jest możliwy, ale utrudniony.

Digital signatures

Podpis cyfrowy (ang. digital signature) to mechanizm bazujący na szyfrowaniu asymetrycznym, wykorzystujący matematyczną relację pomiędzy kluczem publicznym (ang. public key) i prywatnym (ang. private key), a jego celem jest zagwarantowanie niezmienności (integrity) oraz niezaprzeczalności (non-repudiation) podczas komunikacji. Innymi słowy: zapewnia, że wiadomość pochodzi od domniemanego nadawcy i nie została w żaden sposób naruszona (intencjonalnie bądź przypadkowo) podczas transmisji danych.

Podpis cyfrowy nie gwarantuje poufności (ang. confidentiality). Jeśli nadawca chce wysłać tajny komunikat, używa publicznego klucza odbiorcy do zaszyfrowania całej wiadomości. Odbiorca, po jej otrzymaniu, może odszyfrować treść za pomocą swojego klucza prywatnego.

W przypadku podpisów cyfrowych działa to trochę inaczej: nadawca używa swojego klucza prywatnego do zaszyfrowania skrótu (digest; hash) oryginalnej wiadomości. Jest to nic innego jak podpis cyfrowy, dołączany do przesyłanego komunikatu, który może być wysłany w postaci jawnej. Odbiorca najpierw uzyskuje skrót poprzez odszyfrowanie otrzymanego podpisu za pomocą klucza publicznego nadawcy. Następnie sam generuje skrót otrzymanej wiadomości, używając tego samego algorytmu hashującego i sprawdza, czy dwa skróty są identyczne.

Uproszczony przykład:

  1. Nadawca chce wysłać ważny komunikat o treści: Do kogo należy czarna Alfa Romeo, która blokuje wjazd dla mojej fury?
  2. Najpierw liczony jest hash (można spotkać się również z terminem: digest) powyższej wiadomości, który może wyglądać następująco: 202143dc887c251745bd7e8a5677b8603b52eb40b729192a86ed9dd3425c19bf (SHA256).
  3. Hash jest następnie szyfrowany z użyciem klucza prywatnego nadawcy.
  4. Do odbiorcy wysyłana jest oryginalna wiadomość wraz z dołączonym podpisem (zaszyfrowanym skrótem).
  5. Odbiorca odszyfrowuje dołączony podpis za pomocą klucza publicznego nadawcy, który (jak sama nazwa wskazuje) jest ogólnodostępny. W wyniku powinien otrzymać hash: 202143dc887c251745bd7e8a5677b8603b52eb40b729192a86ed9dd3425c19bf.
  6. Aby stwierdzić autentyczność otrzymanego komunikatu, odbiorca powinien ponownie wyliczyć skrót z otrzymanej wiadomości, używając tego samego algorytmu (w przykładzie jest to SHA256). Jeśli wartości obu skrótów są identyczne, mamy pewność, że wiadomość nie została w żaden sposób naruszona i pochodzi od właściciela klucza publicznego.

Podpisy cyfrowe znajdują zastosowanie nie tylko w komunikacji pomiędzy stronami, ale również do podpisywania kodu. Dzięki temu mamy pewność, że aktualizacja oprogramowania (patch), którą chcemy zainstalować, pochodzi z zaufanego źródła.

Do potwierdzenia spójności oraz uwierzytelnienia (ang. authentication) wiadomości można jeszcze wykorzystać mechanizm MAC (Message Authentication Code), który, w odróżnieniu od pełnoprawnych podpisów, używa współdzielonego klucza prywatnego (ang. shared private key) do utworzenia znacznika MAC. Mechanizm ten jest trochę wydajniejszy ze względu na wykorzystanie szyfrowania symetrycznego, jednakże nie gwarantuje niezaprzeczalności. ponieważ każdy, kto jest w posiadaniu klucz prywatnego może wygenerować prawidłowy kod MAC.

HMAC (Hash-Based Message Authentication Code) jest wyspecjalizowaną techniką nadawania sygnatury MAC. Działa na podobnej zasadzie, jednakże może różnić się sposobem obliczania znacznika. Jak sama nazwa wskazuje, mechanizm HMAC używa w tym celu tylko kryptograficznej funkcji skrótu, gdzie w przypadku MAC można wykorzystać jeszcze m.in. symetryczne szyfrowanie blokowe (w skrócie: MAC jest bardziej ogólnym terminem).

Dodatkowe materiały:

Key stretching

Hasła nigdy nie powinny być przechowywane w jawnej postaci (ang. plain text), więc przeważnie zapisuje się je w formie skrótów obliczonych za pomocą kryptograficznych funkcji skrótu.

Obliczenie takiego skrótu jest operacją, która zajmuje trochę czasu. Z perspektywy użytkownika są dzieje się to przeważnie w mgnieniu oka, jednakże dla procesora czynność, która trwa nawet kilka milisekund jest już uznawana za czasochłonną. Może się wydawać, że pożądane jest błyskawiczne obliczanie skrótów, jednakże należy mieć na uwadze, że szybkie funkcje hashujące to także skuteczniejsze ataki siłowe (można sprawdzić więcej skrótów w krótszym czasie).

Aby utrudnić ataki typu brute-force, oprócz dodawania soli do haseł, stosuje się również technikę o nazwie key stretching. Jest to celowe wydłużenie czasu obliczeń wykonywanych przez funkcję skrótu. Implementacja tej techniki polega zazwyczaj na kilkukrotnym wywołaniu funkcji hashującej odpornej na kolizje – czyli z hasła jest liczony skrót, potem z tego skrótu liczony jest kolejny skrót i tak dalej. Okazuje się bowiem, że w przypadku funkcji silnie odpornych na kolizje, wielokrotne wyliczanie skrótu nie zwiększa prawdopodobieństwa znalezienia kolizji.

Użytkownikowi logującemu się do systemu nie robi tak naprawdę różnicy, czy weryfikacja jego danych potrwa 5 czy 200 milisekund, ale dla atakującego, który jest zmuszony sprawdzić miliony kombinacji, jest to już bardzo znaczące utrudnienie, bo całkowity czas potrzebny na złamanie hasła mocno się wydłuża.

W związku z powyższym, aktualnie zaleca się stosowanie funkcji z rodziny PBKDF (Password-Based Key Derivation Function). Są to specjalne funkcje, dedykowane dla systemów kryptograficznych, które łączą w sobie zalety funkcji skrótu wraz z dodatkowymi technikami zabezpieczeń, takimi jak np. key stretching czy wspomniane wcześniej solenie haseł.

Dodatkowe materiały:

  • SY0-601: Metody łamania haseł – opracowanie dotyczy starszej edycji egzaminu CompTIA Security+ SY0-601, ale zawiera dodatkowe informacje o różnych technikach ochrony haseł.

2.0 Threats, Vulnerabilities, and Mitigations

2.2 Explain common threat vectors and attack surfaces.

Na egzaminie należy wykazać się znajomością i zrozumieniem przedstawionych poniżej zagrożeń i wektorów ataku.

Human vectors/social engineering

  • Bardzo często najsłabszym ogniwem całego systemu bezpieczeństwa jest jego użytkownik, czyli człowiek.
  • Właśnie dlatego ataki wykorzystujące inżynierię społeczną (lub inaczej socjotechnikę) są bardzo często stosowane – ponieważ są skuteczne.
Phishing
  • Jedna z najpopularniejszych metod oszustwa polegająca na podszywaniu się pod zaufaną instytucję lub osobę (np. bank, firmę kurierską czy osobę publiczną) celem nakłonienia ofiary do wykonania jakiejś czynności z korzyścią dla atakującego.
  • Przykład: wiadomość email, która wygląda jakby była wysłana przez naszego usługodawcę z prośbą o pilne zalogowanie się do systemu. Jednakże link umieszczony w mailu, zamiast do prawdziwej strony logowania, kieruje nas do strony spreparowanej przez oszustów.
Vishing
  • Skrót od voice phishing, czyli phishing za pośrednictwem komunikacji głosowej (telefonicznej oraz VoIP).
Smishing
  • Skrót od SMS phishing, czyli rodzaj oszustwa wykorzystujący wiadomości SMS (Short Message Service).
  • Zasady są podobne do pozostałych form phishingu, z tą różnicą, że fałszywe wiadomości są przesyłane za pośrednictwem protokołu SMS.
Impersonation
  • Jeden z fundamentów inżynierii społecznej.
  • W dosłownym tłumaczeniu jest to udawanie kogoś innego niż się jest w rzeczywistości i stanowi absolutną podstawę udanego ataku socjotechnicznego.
  • Często atakujący podszywa się pod personę, która stoi wyżej w hierarchii organizacji niż osoba atakowana.
  • Jest to czynnik psychologiczny, który może wywierać dodatkową presję na ofiarę i przez to będzie łatwiej nakłonić ją do zrobienia tego czego chce oszust.
Pretexting
  • Kolejny z filarów udanego ataku socjotechnicznego, polegający na zbudowaniu zmyślonej, ale brzmiącej wiarygodnie historii, która ma na celu przekonanie ofiary do wykonania określonych działań.
  • Mówiąc krótko: atakujący musi mieć dobry pretekst, żeby ofiara dała się przekonać.
Watering hole
  • Jeśli organizacja jest bardzo dobrze chroniona, atakujący ma bardzo nikłe szanse powodzenia w bezpośrednim ataku. W takim przypadku jest zmuszony zmienić strategię i zastosować technikę, którą można przetłumaczyć jako zatruty wodopój bądź atak u wodopoju.
  • Ta strategia polega na określeniu miejsca, poza atakowaną organizacją, gdzie zazwyczaj gromadzą się i przebywają jej członkowie. Może to być miejsce fizyczne, takie jak kawiarnia chociaż częściej jest to zewnętrzny serwis internetowy (third party).
  • Kolejnym krokiem jest atak na zidentyfikowany cel pośredni, który jest słabiej chroniony. Polega zazwyczaj na zainfekowaniu strony złośliwym oprogramowaniem, dzięki czemu istnieje duże prawdopodobieństwo, że członkowie organizacji również zostaną zainfekowani i da to atakującemu upragniony dostęp do instytucji docelowej.
Typosquatting
  • Metoda oszukiwania użytkowników wykorzystująca typowe błędy literowe w adresach URL.
  • Innym określeniem tej metody jest URL hijacking.
  • Technika wykorzystuje nieuwagę użytkownika i fakt, że podstawiony adres z literówką wygląda bardzo podobnie do oryginalnego.

2.3 Explain various types of vulnerabilities.

Wyjaśnij różne typy podatności.

Application

Buffer overflow
  • Swego czasu, bardzo popularne było wykorzystywanie podatności związanych z niewłaściwym zarządzaniem pamięci poprzez tzw. przepełnienie bufora (ang. buffer overflow).
  • Atakujący był w stanie wprowadzić więcej danych do aplikacji (input) niż przewidział to jej twórca. Jeśli program otrzymał na wejściu większą liczbę bajtów niż zarezerwowany obszar pamięci (bufor), to mówiąc w przenośni, nadmiarowe bajty wylewały się poza zarezerwowany bufor, nadpisując sąsiadujące komórki pamięci.
  • W większości przypadków, powodowało to błąd naruszenia pamięci (segmentation fault) i zakończenie działania programu. Jednakże okazało się, że w niektórych przypadkach można przepełnić bufor i nadpisać pamięć w taki sposób, żeby program, zamiast się wykrzaczyć, wykonał przekazany na wejściu, specjalnie spreparowany kod. Przeważnie był to tzw. kod wywołania powłoki (shellcode), dający atakującemu dostęp do skompromitowanego systemu (zakładając, że zaatakowany program działał z uprawnieniami administratora systemu).

2.4 Given a scenario, analyze indicators of malicious activity.

Na podstawie podanego scenariusza, zidentyfikuj i przeanalizuj czynniki wskazujące na złośliwe działania.

Malware attacks

  • Malicious software (w skrócie malware), czyli złośliwe/szkodliwe oprogramowanie, definiuje ogół programów komputerowych, których celem jest zazwyczaj wyrządzenie szkód w systemie komputerowym oraz działanie na niekorzyść jego użytkowników.
  • Niezamierzone błędy w aplikacjach, popełnione przez programistów, nie klasyfikują się jako złośliwe oprogramowanie.
  • Granica między poszczególnymi typami malware jest płynna i wiele z nich ma wspólne cechy.
  • Infekcja jednym rodzajem oprogramowania może skutkować instalacją kolejnych typów. Na przykład, koń trojański zainstalowany w skompromitowanym systemie może posłużyć do ściągnięcia i uruchomienia aplikacji typu ransomware w tymże systemie.
Ransomware
  • Złośliwe oprogramowanie blokujące użytkownikowi dostęp do jego danych i żądające zapłaty w zamian za odblokowanie tych danych. Innymi słowy, jest to żądanie okupu (ang. ransom) w zamian za odzyskanie dostępu do swoich zasobów.
  • Oprócz odpowiedniej techniki uniemożliwienia dostępu do danych, bardzo istotnym elementem jest bezpieczny dla atakującego oraz trudny do namierzenia system płatności
  • To w jaki sposób użytkownik zostaje odcięty od swoich plików zależy od rodzaju ransomware’u. Najprostszą formą jest założenie prostej blokady na system i wyświetlenie użytkownikowi odpowiedniej informacji o konieczności zapłaty. Jednakże dużo skuteczniejszą metodą ataku jest szyfrowanie danych ofiary i żądanie opłaty za ich odszyfrowanie (tzw. cryptomalware).
Trojan
  • Złośliwe oprogramowanie, które podszywa się pod użyteczne bądź ciekawe aplikacje, ukrywając przed użytkownikiem swoje szkodliwe funkcje.
  • Często pełni funkcję tylnej furtki (ang. backdoor) w systemie, która umożliwia bezpośredni dostęp do zainfekowanej maszyny nieuprawnionej osobie bądź aplikacji. Dzięki takiej furtce atakujący jest w stanie uzyskać dostęp do systemu bez procesu uwierzytelnienia.
  • RAT (Remote Access Trojan) to rodzaj trojana umożliwiający zdalny dostęp do skompromitowanego systemu. Skrót RAT może również oznaczać Remote Administration Tool, czyli narzędzie do zdalnej administracji systemem. Jedno i drugie daje osobom trzecim zdalny dostęp do systemu, na którym jest zainstalowany oraz zapewnia prawie pełną kontrolę nad tym systemem.
Worm
  • W odróżnieniu od standardowych wirusów, robak (ang. worm) jest w stanie sam się replikować, bez ingerencji użytkownika.
  • Robaki wykorzystują różne niezałatane luki bezpieczeństwa w systemach operacyjnych, usługach sieciowych lub aplikacjach. Dzięki temu są w stanie samodzielnie rozprzestrzeniać przez sieć, od komputera do komputera.
Spyware
  • Programy szpiegujące zbierające dane użytkownika, bez jego wiedzy.
  • Może to być zwyczajne śledzenie poczynań (np. poprzez rejestrowanie naciśniętych klawiszy) celem zbudowania profilu, który później zostanie sprzedany nieuczciwym reklamodawcom, a w ekstremalnych przypadkach kradzież poufnych informacji, takich jak dane logowania.
Virus
  • Wirus komputerowy (ang. virus) jest rodzajem złośliwego oprogramowania, które jest w stanie samodzielnie się powielać poprzez infekowanie innych plików, ale do zainicjowania procesu replikacji i wykonania pozostałych wpisanych procedur wymagane jest działanie użytkownika, takie jak np. uruchomienie zainfekowanego pliku.
  • To do czego wirus jest zdolny (oprócz replikacji) zależy od intencji, umiejętności i wyobraźni jego autora. Niektóre wirusy cechują się bardzo małą szkodliwością, ponieważ zostały napisane tylko dla zabawy, a inne mogą spowodować nieodwracalne szkody.
Keylogger
  • Keylogger jest oprogramowaniem lub urządzeniem, które przechwytuje i zapisuje klawisze naciśnięte przez użytkownika.
  • W przypadku programowego keyloggera jest on najczęściej zaimplementowany jako część innego złośliwego oprogramowania, takiego jak trojan, RAT (Remote Access Trojan) czy spyware.
  • Keyloggery sprzętowe przyjmują postać niewielkiego urządzenia USB w formie przejściówki, którą wpina się między klawiaturę i port USB. Takie urządzenie zapisuje później wciskane klawisze w swojej pamięci i/lub wysyła zapisane informacje drogą radiową.
Logic bomb
  • Bomba logiczna (ang. logic bomb) to kawałek złośliwego kodu, który wykonuje się jeśli zostanie spełniony warunek określony przez jego twórcę.
  • Najczęściej spotyka się bomby z zapalnikiem czasowym, tj. kod wykonuje się po określonym czasie lub danego dnia (np. w Prima Aprilis), ale nie jest to regułą.
Rootkit
  • Definicja obowiązująca na egzaminie: zestaw narzędzi (ang. kit) umożliwiający uzyskanie i utrzymanie dostępu do systemu, z pełnymi prawami administracyjnymi (ang. root).
  • Inna definicja, którą można znaleźć w internecie: narzędzie programistyczne (bądź zestaw narzędzi), które umożliwia skuteczne ukrycie obecności złośliwego oprogramowania w systemie wraz z jego działalnością. W tym celu stosuje wyrafinowane techniki nadpisywania niskopoziomowych funkcji systemowych, dzięki czemu zainstalowany malware staje się fundamentalnie niewidzialny dla aplikacji, które polegają na tych funkcjach.

2.5 Explain the purpose of mitigation techniques used to secure the enterprise.

Wyjaśnij przeznaczenie technik zapobiegawczych, stosowanych do ochrony organizacji.

Hardening techniques

  • Hardening (w dosłownym tłumaczeniu: hartowanie, utwardzanie) to proces wprowadzania zmian konfiguracyjnych aplikacji, systemu bądź urządzenia celem zwiększenia poziomu ich bezpieczeństwa oraz ograniczenia obszaru podatności na ewentualne ataki.
  • Przed przystąpieniem do procesu utwardzania konfiguracji, istotna jest identyfikacja obszarów, które wymagają poprawy. Poza tym bardzo ważne jest dostosowanie całego procesu do potrzeb naszych i/lub naszej organizacji.
  • Pierwszym krokiem powinno być opracowanie planu operacji hardeningu, który mógłby być wynikiem rzetelnej analizy ryzyka. Posiadanie takiego planu jest bardzo pomocne, ponieważ możemy wtedy skupić się tylko na tych obszarach, które są istotne dla nas.
  • Wielu dostawców (ang. vendors) udostępnia szczegółowe instrukcje, które w klarowny sposób opisują, krok po kroku, w jaki sposób można zabezpieczyć dany produkt. Są to tzw. secure baselines.
  • Oprócz instrukcji udostępnianych przez twórców rozwiązań, w Internecie można znaleźć dedykowane przewodniki opracowane przez firmy trzecie (ang. third parties), społeczności zainteresowane danym produktem, a nawet organizacje rządowe. Na przykład:
  • Starajmy się automatyzować proces weryfikacji naszej aktualnej konfiguracji pod kątem bezpieczeństwa, jeśli tylko jest to możliwe. Przykładowe narzędzia, które mogą nam w tym pomóc:
    • OpenSCAP – zestaw narzędzi open source, opartych o protokół SCAP (Security Content Automation Protocol), których zadaniem jest automatyzacja audytów zgodności z politykami bezpieczeństwa. Do działania wymaga bazy danych z regułami zdefiniowanymi w standardzie SCAP. Umożliwia skanowanie lokalne oraz zdalne.
    • CIS-CAT Lite – kolejne darmowe narzędzie, utworzone przez organizację CIS (Center for Internet Security) do oceny zgodności badanego systemu z zdefiniowanymi wytycznymi bezpieczeństwa. Dostępna jest również wersja płatna (CIS-CAT Pro), która posiada trochę bardziej rozbudowane możliwości.
  • Każdy produkt może wymagać indywidualnego podejścia, ale da się wyodrębnić pewien uniwersalny zestaw dobrych praktyk (ang. best practices):
    1. Regularnie instaluj aktualizacje i poprawki bezpieczeństwa (ang. security patches), kiedy tylko zostaną opublikowane.
    2. Zmień domyślne hasła.
    3. Wyłącz nieużywane usługi.
    4. Zablokuj i wyłącz porty sieciowe oraz protokoły, które są nieużywane.
    5. Odinstaluj zbędne oprogramowanie.
    6. Chroń punkty krańcowe (ang. endpoints) sieci poprzez ich monitorowanie oraz zabezpieczanie za pomocą odpowiedniego oprogramowania.
    7. Szyfruj dane w spoczynku (ang. at-rest) oraz te transmitowane (ang. in-transit) przez sieć.
    8. Ogranicz dostęp do wrażliwych obszarów swojej sieci poprzez jej segmentację.
    9. Jeśli to możliwe, nie pozwalaj na dostęp do swojej sieci przypadkowym urządzeniom.

4.0 Security Operations

4.1 Given a scenario, apply common security techniques to computing resources.

Na podstawie podanego scenariusza, zastosuj odpowiednie techniki zabezpieczające dla wybranych zasobów.

Secure baselines

  • Aby wdrożyć i użytkować nową aplikację lub system w sposób bezpieczny, należy postępować zgodnie z ustalonymi wcześniej, podstawowymi wytycznymi dotyczącymi bezpieczeństwa (secure/security baseline).
  • Jest to przeważnie dokument w postaci przewodnika lub listy kontrolnej (ang. checklist), zawierający informację o sposobie konfiguracji samego rozwiązania oraz środowiska w taki sposób, żeby zapewnić akceptowalny poziom bezpieczeństwa, dostosowany do potrzeb organizacji.
Establish
  • Pierwszym krokiem jest ustalenie i zebranie wszystkich istotnych zaleceń dotyczących bezpieczeństwa, które posłużą jako nasz punkty wyjściowy (ang. baseline).
Deploy
  • Kiedy zebraliśmy już wszystkie istotne dla nas wytyczne, możemy przystąpić do ich wdrażania (ang. deploy).
  • Proces ten polega na dokładnym sprawdzeniu konfiguracji (rozwiązania i środowiska) oraz dostosowaniu ustawień w taki sposób, żeby zgadzały się z przygotowaną wcześniej listą wytycznych.
Maintain
  • Kiedy wszystkie, istotne dla naszej organizacji, wytyczne dotyczące bezpieczeństwa zostały już wdrożone i działają jaka należy, musimy jeszcze pamiętać o ich utrzymywaniu (ang. maintain).
  • Utrzymywanie polega na regularnym sprawdzaniu czy aktualne ustawienia aplikacji/systemu w dalszym ciągu są zgodne z podstawowymi wytycznymi oraz wprowadzaniu ewentualnych poprawek, jeśli coś się rozjeżdża.

Materiały źródłowe

  1. Professor Messer’s CompTIA SY0-701 Security+ Training Course
  2. CompTIA Security+ Study Guide SY0-701 (Mike Chapple, David Seidl)
  3. PushSec: Brak znajomości CIA wstrzymywał moją karierę
  4. Hash vs. Checksum: Understanding the Difference and Their Role in Cybersecurity
  5. Hardening od podstaw, czyli jak ze swojej organizacji zrobić twierdzę nie do zdobycia? (Michał Krauzowicz)
Cyberbezpieczeństwo okiem programisty

Łukasz Mieczkowski

Programista, który zainteresował się cyberbezpieczeństwem.

Kontakt

Zapraszam do kontaktu za pośrednictwem mediów społecznościowych.