e-ogloszenia.info

Etykiety

poniedziałek, 1 maja 2017

Alternatywne oprogramowanie routera: OpenWRT

Na większości dostępnych na rynku urządzeń sieciowych, takich jak routery bądź punkty dostępowe Wi-Fi, można w prosty sposób zainstalować alternatywny system operacyjny. Na podstawie mojego doświadczenia w tym zakresie, mogę śmiało stwierdzić, iż pomysł ten jest bardzo dobry, a jego realizacja przeważnie otwiera zupełnie nowe horyzonty jeśli chodzi o funkcjonalność i bezpieczeństwo sprzętu, pod warunkiem umiejętnego podejścia do tego zagadnienia oraz doboru odpowiedniego rozwiązania.

Trudny wybór alternatywy


W sieci można dziś znaleźć bardzo dużo rozwiązań programistycznych, które stanowią alternatywę dla fabrycznego oprogramowania routerów i tym podobnych urządzeń. W śród tak szerokiego zakresu oprogramowania może być dość ciężko podjąć właściwą decyzję odnośnie najlepszego rozwiązania dla danego urządzenia i jego docelowego przeznaczenia.

OpenWRT


W niniejszym artykule mam zamiar wstępnie przedstawić czytelnikom darmowy system operacyjny OpenWRT, przeznaczony dla routerów i podobnych urządzeń sieciowych oraz zaprezentować jego przykładową instalację na punkcie dostępowym Wi-Fi TP-LINK TL-WA701ND. Celem takiej instalacji ma być znaczne poszerzenie możliwości urządzenia oraz zwiększenie poziomu bezpieczeństwa obsługiwanej przez niego sieci Wi-Fi.

Nowe urządzenie TP-LINK TL-WA701ND V2.2
Nowe urządzenie TP-LINK TL-WA701ND V2.2

W przeciwieństwie do większości innych dystrybucji tego typu oprogramowania, OpenWRT jest zbudowany całkowicie od podstaw w sposób taki, aby spełniać rolę w pełni funkcjonalnego i łatwego do modyfikowania systemu operacyjnego, przeznaczonego dla szerokiej gamy aktywnych urządzeń sieciowych. W praktyce oznacza to, że system może zawierać tylko te składniki, które są w danej chwili użytkownikowi potrzebne, bez zbędnego nadmiaru kodu i bez niepotrzebnych modułów obciążających jego działanie. OpenWRT umożliwia bowiem dodawanie i usuwanie pakietów oprogramowania wedle potrzeb użytkownika, który - wbrew sytuacji jaka ma miejsce w przypadku fabrycznego oprogramowania sieciowych urządzeń - może w ten sposób wpływać na przewidywany przez producenta zakres funkcjonalności sprzętu, programowo personalizując i poszerzając jego sposób działania.

OpenWRT: ponad 2000 dostępnych pakietów oprogramowania!


Na chwilę obecną oficjalne repozytorium OpenWRT udostępnia ponad 2000 pakietów oprogramowania, które mogą być obsługiwane przez zainstalowany na urządzeniu system operacyjny. Użytkownik może więc dowolnie instalować lub usuwać te pakiety, które go w danej chwili interesują lub nie są już mu potrzebne.

OpenWRT: wyższy poziom ochrony sieci


OpenWRT ponadto umożliwia korzystanie z zaawansowanych funkcji związanych z bezpieczeństwem IT, takich jak inspekcja pakietów danych, bądź funkcji związanych z detekcją włamań do sieci. Tego typu możliwości były dotychczas przeważnie fabrycznie dostępne wyłącznie w bardzo drogich aktywnych urządzeniach sieciowych, a czytelnik raczej nie natknie się na nie w fabrycznym oprogramowaniu domowych routerów bądź punktów dostępowych Wi-Fi.

Uwagi wstępne do instalacji OpenWRT


Oprogramowanie OpenWRT działa na rozmaitych routerach, punktach dostępowych Wi-Fi i tym podobnych aktywnych zarządzalnych urządzeniach sieciowych, lecz niestety nie na wszystkich. Muszę tutaj koniecznie czytelników ostrzec, iż flaszowanie binarnego pliku systemu OpenWRT na urządzeniu, które nie jest wpierane przez jego twórców, a nawet próba instalacji niewłaściwej dla danego sprzętu wersji oprogramowania, to czynności które mogą definitywnie zniszczyć urządzenie. Dlatego przed przystąpieniem do ewentualnego zakupu sprzętu w celu instalacji na nim systemu OpenWRT, warto sprawdzić czy urządzenie sieciowe widnieje na oficjalnej liście sprzętu OpenWRT i czy w ogóle jego wsparcie jest przewidziane przez twórców systemu. Warto także zapoznać się z informacją dotyczącą aktualnej wersji oprogramowania dla danego urządzenia. Istotny jest nie tylko model, ale także jego wersja. Dokładne informacje o modelu, a także o wersji sprzętu można przeważnie znaleźć na opakowaniu produktu.

Informacje o modelu i wersji urządzenia
Informacje o modelu i wersji urządzenia

Przed przystąpieniem do instalacji oprogramowania OpenWRT należy uważnie przeczytać wszelkie instrukcje, zalecenia, a szczególnie ostrzeżenia opublikowane w witrynie jego twórców. Należy również pamiętać o tym, że nikt nie daje jakiejkolwiek gwarancji na to, iż dana instalacja się powiedzie, a sprzęt nie zostanie definitywnie zniszczony w skutek jej przeprowadzenia. Pamiętajmy, że jeśli decydujemy się na instalację na naszym sprzęcie sieciowym jakiegokolwiek oprogramowania alternatywnego, robimy to tylko i wyłącznie na własne ryzyko. Gwarancja producenta nie uwzględnia możliwości naprawy sprzętu uszkodzonego w skutek instalacji alternatywnego oprogramowania.


Pobieranie i instalacja OpenWRT


Po zapoznaniu się z informacjami wstępnymi możemy rozpocząć procedurą zdobywania właściwego dla naszego urządzenia oprogramowania.

Istotną kwestią jest to, iż procedura instalacji systemu OpenWRT może się nieco różnić w zależności od urządzenia. Opisany tutaj sposób podejścia do tej kwestii odnosi się do konkretnego produktu oraz do konkretnej wersji oprogramowania.

Aby w prosty sposób znaleźć właściwą dla interesującego nas sprzętu wersję oprogramowania OpenWRT, należy przejść na stronę https://wiki.openwrt.org/toh/views/toh_extended_all. W tym miejscu znajduje się tabela zawierająca listę rozmaitych urządzeń sieciowych różnych producentów.

Aby uzyskać większą ilość szczegółów dotyczących danego urządzenia, a w tym ewentualnie odnośnik do pobierania obsługiwanej przez urządzenie wersji oprogramowania, należy ograniczyć ilość wpisów w tabeli, wprowadzając w okienku nagłówka kolumny dotyczącej modelu informacje o modelu urządzenia.

Przykładowo, w przypadku opisywanej w niniejszym artykule procedury dotyczącej punktu dostępowego TP-LINK Tl-WA701ND, wystarczy wpisać 701ND, aby uzyskać bardziej szczegółowe informacje o tym modelu oraz wyświetlić odnośnik do pobierania odpowiedniej wersji oprogramowania dla tego sprzętu.

Wersja systemu OpenWRT dla danego urządzenia
Należy upewnić się, że pobieramy odpowiednią dla urządzenia wersję systemu

Instalacja OpenWRT na urządzeniu TP-LINK TL-WA701ND


Po pobraniu oprogramowania OpenWRT, w celu rozpoczęcia procedury instalacyjnej należy się ze sprzętem połączyć za pomocą przeglądarki internetowej, korzystając w tym celu koniecznie z sieci przewodowej, a nie z Wi-Fi. Zalecam w tym celu korzystać z przeglądarki Mozilla FireFox. Jeśli urządzenie nie było jeszcze używane, wówczas w celu połączenia się z nim i zalogowania do systemu producenta należy skorzystać z informacji widniejących na spodzie obudowy. W pasku adresów przeglądarki należy zatem wpisać adres 192.168.0.254. Po pojawieniu się okienka z monitem o nazwę użytkownika i hasło należy wpisać admin i admin. To są bowiem standardowe wartości dla tego sprzętu.

Informacje na spodzie urządzenia
Informacje na spodzie urządzenia

Po nawiązaniu połączenia z punktem dostępowym oraz pomyślnym zalogowaniu się do fabrycznego systemu producenta, należy z dostępnego w prawej części widoku menu wybrać opcję System Tools a następnie przejść do Firmware Upgrade.

Wybór i załadowanie pliku binarnego
Wybór i załadowanie pliku binarnego OpenWRT

Korzystając z widniejącej w głównej części widoku kontrolki plików należy wybrać poprzednio pobrane oprogramowanie oraz kliknąć w przycisk Upgrade w celu rozpoczęcia procedury instalacji nowego systemu.

Podmiana fabrycznego oprogramowania na OpenWRT
Podmiana fabrycznego oprogramowania na OpenWRT

Po udanej instalacji nowego systemu należy poczekać kilkadziesiąt sekund aż router się zrestartuje. Wówczas można rozpocząć konfigurację.

Konfiguracja OpenWRT na urządzeniu TP-LINK TL-WA701ND


Po restarcie router powinien posiadać adres IP 192.168.1.1, a więc aby się do niego ponownie dostać interfejs sieciowy komputera powinien być ustawiony na tę samą podsieć.

Tym razem nazwa użytkownika to root, a hasło jest puste.

Logowanie się do OpenWRT
Logowanie się do OpenWRT

Po zalogowaniu się do OpenWRT, pierwsze co się pojawia to informacje o statusie sprzętu i systemu.

OpenWRT - status systemu
OpenWRT - status systemu

Ze względów bezpieczeństwa hasło należy oczywiście ustawić natychmiast po pierwszym zalogowaniu się do systemu. W tym celu, aby przejść do związanych z tą czynnością ustawień, z sekcji System menu znajdującego się w górnej części widoku należy wybrać Administration. W sekcji Router Password należy wpisać i potwierdzić nowe hasło.

OpenWRT - ustawianie hasła do routera
OpenWRT - ustawianie hasła do routera

Aby korzystanie z podstawowej funkcji urządzenia było teraz możliwe, należy z sekcji Network górnego menu wybrać Wi-Fi.

OpenWRT - ustawienia sieci Wi-Fi
OpenWRT - ustawienia sieci Wi-Fi

Po pojawieniu się widoku Network Overview należy kliknąć w przycisk Edit aby przejść do ustawień interfejsu Wi-Fi.

OpenWRT - ustawienia sieci Wi-Fi
OpenWRT - ustawienia sieci Wi-Fi

Ze względów bezpieczeństwa ważne jest aby po przejściu do zakładki Wireless Security, ustawić szyfrowanie WPA2-PSK lub WPA-PSK/WPA2-PSK Mixed Mode i wprowadzić długą i skomplikowaną frazę szyfrującą. To jest podstawą bezpieczeństwa każdej sieci Wi-Fi. Pamiętajmy, że żadne filtrowanie adresów MAC w jakimkolwiek stopniu nie uchroni pred hakerami naszej sieci Wi-Fi, gdyż metoda ta stanowi jedynie lekkie utrudnienie, które haker jest w stanie ominąć w kilkadziesiąt sekund lub kilku minut.


Zabezpieczenia Wi-Fi
Zabezpieczenia Wi-Fi

Kolejną podstawową czynnością jest dostosowanie parametrów interfejsu sieciowego LAN urządzenia, tak aby sprzęt mógł prawidłowo działać w docelowej sieci. W tym celu należy z sekcji menu Network wybrać Interfaces, a następnie kliknąć w przycisk Edit. W widoku ustawień interfejsu LAN należy wprowadzić odpowiednie dla sieci docelowej wartości.

Ustawienia interfejsu LAN
Ustawienia interfejsu LAN


Polska wersja językowa interfejsu


Osoby zainteresowane polską wersją językową interfejsu www OpenWRT powinny zainstalować odpowiedni pakiet językowy. Czynność tą powinno się jednak wykonać dopiero po zakończeniu podstawowej konfiguracji urządzenia, którą opisałem powyżej. Najprostszy sposób instalacji polskiego pakietu językowego polega na przejściu do System / Software, a następnie do zakładki Available Packages. W okienku Download and Install Packages należy wprowadzić nazwę pakietu luci-i18n-ahcp-pl oraz potwierdzić instalację przyciskiem OK.



Można także instalować różnego rodzaju pakiety oprogramowania, w tym oczywiście pakiety językowe, z poziomu shell'a systemu OpenWRT, po uprzednim połączeniu się z urządzeniem i zalogowaniu do systemu poprzez SSH. W takim przypadku, aby zainstalować polski pakiet językowy, należy w wierszu poleceń wpisać:
root@OpenWrt:~# opkg install luci-i18n-ahcp-pl

Dalsze instrukcje związane z ustawieniami systemu OpenWRT można znaleźć pod adresem https://wiki.openwrt.org.

Bezpieczeństwo i funkcjonalność


System OpenWRT jest naprawdę bardzo elastyczny w konfiguracji, a opcji związanych z różnego rodzaju ustawieniami jest w nim naprawdę wiele. Na szczęście nawigacja po różnych sekcjach interfejsu jest bardzo intuicyjna i nie powinna sprawiać problemów nawet mniej doświadczonym użytkownikom.

Wspomnę jeszcze tutaj o kilku ciekawostkach. Po pierwsze istotną sprawą jest to, że po wybraniu opcji Software z sekcji System górnego menu, pojawiają się narzędzia umożliwiające zarządzanie pakietami oprogramowania, które - jak już wspominałem - można dowolnie instalować i usuwać według potrzeb, personalizując zakres funkcji urządzenia.

OpenWRT - zarządzanie pakietami oprogramowania
OpenWRT - zarządzanie pakietami oprogramowania

Drugą ciekawostką jest to, że po kliknięciu w Interfaces z sekcji menu Network pojawia się narzędzie zarządzania interfejsami sieciowymi. W odróżnieniu od fabrycznie instalowanego oprogramowania producenta, mnogość możliwości różnego rodzaju ustawień jest tutaj naprawdę imponująca.

Kolejną fajną sprawą jest narzędzie tworzące różnego rodzaju wykresy w czasie rzeczywistym. Aby się do niego dostać należy wybrać Realtime Graphs z sekcji menu Status.

OpenWRT - Wykresy w czasie rzeczywistym
OpenWRT - Wykresy w czasie rzeczywistym

Podsumowanie


Zdecydowałem się przygotować ten artykuł głównie w celu przedstawienia czytelnikom możliwości korzystania z alternatywnego oprogramowania routerów i tym podobnych urządzeń. Chciałem również wstępnie zaprezentować ogólny zakres możliwości systemu OpenWRT oraz udokumentować generalną prostotę jego instalacji na urządzeniach sieciowych, na przykładzie popularnego punktu dostępowego Wi-Fi. Mam nadzieję, że mój zamiar się spełnił. Gdyby coś okazało nie jasne, a także w przypadku jakichkolwiek pytań dotyczących tego tematu, bądź chęci wymiany doświadczeń, bardzo proszę o komentarze.

piątek, 28 kwietnia 2017

Ataki hakerskie. Jak się chronić?

Bezpieczeństwo IT jest dziś pojęciem bardzo ogólnym, odnoszącym się do metod stosowanych w celu zapewnienia ochrony przed nieautoryzowanym dostępem zarówno do mediów sieciowych jak i urządzeń należących do danej infrastruktury informatycznej.

Chciałbym już na wstępie tego artykułu zaznaczyć, że w praktyce żaden produkcyjny system informatyczny nie jest dziś zupełnie bezpieczny. Pełne bezpieczeństwo nie jest w tej dziedzinie możliwe do osiągnięcia. Nawet najwyższej klasy sprzętowe firewalle i inne podobne urządzenia, jakie są dziś stosowane w bankach i podobnych instytucjach, nie są w stanie zapewnić pełnego bezpieczeństwa. Dlaczego? Otóż dlatego, że całkowicie bezpieczny system nie był by funkcjonalny, a ochrona systemów informatycznych to dynamiczny proces, w którym ma miejsce nie tylko wdrażanie zabezpieczeń, lecz także ciągły nadzór zdarzeń oraz podejmowanie odpowiednich kroków w przypadku wystąpienia zagrożeń.

Fundamentalne znaczenie ma zrozumienie iż przejęcie kontroli przez hakera nad jakimkolwiek z elementów będących częścią danej infrastruktury IT, oznacza w praktyce utratę kontroli nad całym systemem, co wymaga podjęcia natychmiastowych, przewidywanych przez politykę bezpieczeństwa informacji środków.

Polityka bezpieczeństwa informacji


Polityka bezpieczeństwa informacji jest podstawowym elementem bezpieczeństwa IT w instytucjach rządowych i prywatnych. Powinna ona zarówno uwzględniać wszystkie możliwe cele ataków, obecne w danej infrastrukturze IT, jak również przedstawiać metody ochrony przed uwzględnionymi w niej zagrożeniami. Polityka bezpieczeństwa powinna również zawierać wykaz procedur stosowanych w różnego rodzaju sytuacjach podwyższonego ryzyka. Polityka ta jest dziś owszem powszechnie stosowana w różnego rodzaju organizacjach, lecz w praktyce mała jest z niej korzyść, ponieważ użytkownicy na ogół jej nie przestrzegają. I tu mamy duży problem, ponieważ w kwestiach bezpieczeństwa IT na ogół nawala najsłabsze ogniwo, czyli człowiek. Dlatego właśnie tak bardzo skuteczne bywają hakerskie ataki socjotechniczne, czyli te, w których czynnik ludzki odgrywa kluczową rolę.

Hakerski framework Metasploit zawiera cały zestaw narzędzi, za pomocą których można w bardzo prosty sposób przeprowadzić złożone i bardzo efektowne ataki socjotechniczne, bez posiadania dogłębnej wiedzy w tej dziedzinie.

Metasploit
Metasploit

Jak się skutecznie chronić przed atakami hakerskimi? W tym zakresie mam zamiar udzielić czytelnikom kilka ważnych wskazówek. Ponieważ temat jest bardzo rozległy, w tym artykule ograniczę się dosłownie do kilku prostych porad, ponieważ w przeciwnym przypadku musiałbym napisać całą książkę, a na to wyzwanie nie jestem jeszcze gotowy.

Ponieważ najpopularniejszym dziś systemem operacyjnym jest rodzina produktów Windows, dla poniższych zaleceń zakładam taki właśnie scenariusz.

Bezpieczeństwo komputera


Zupełnie bezpieczny komputer do niczego by się nam nie przydał gdyż nie mógł by on przechowywać jakichkolwiek informacji, czy być częścią jakiejkolwiek sieci. Taki komputer musiałby być odpięty od sieci, wyłączony, a na dodatek zamknięty w sejfie, do którego nikt nie zna możliwości dostępu. Wówczas można by uznać taki komputer za zupełnie bezpieczny. Bezpieczny, ale oczywiście bezużyteczny.

Skoro w praktyce nie da się zapewnić stu procentowego bezpieczeństwa komputera, to jak w takim razie należy chronić tego typu sprzęt? W tym zakresie mogę udzielić kilku przydatnych wskazówek.

Bezpieczeństwo komputera – ochrona przed atakami z dostępem fizycznym


Komputer do którego haker może uzyskać dostęp fizyczny nie jest bezpieczny. Dlaczego? Otóż dlatego, że nawet jeśli system jest chroniony hasłem, to w dużej części przypadków można w prosty sposób takie hasło złamać, korzystając w tym celu z powszechnie dostępnego oprogramowania, takiego jak przykładowo Ophcrack. Haker, który uzyskał fizyczny dostęp do komputera, może uruchomić atakowaną maszynę z płyty CDROM lub z urządzenia USB z systemem Ophcrack bądź podobnym, pomijając wszelkie zabezpieczenia systemu Windows.

Łamanie haseł Windows - Ophcrack
Łamanie haseł Windows - Ophcrack

Ophcrack to oprogramowanie hakerskie, które umożliwia pozyskanie nazw użytkowników systemu Windows oraz skrótów NT ich haseł. Ponadto Ophcrack, na podstawie tęczowych tablic, jest w stanie odszyfrować skróty haseł i wyświetlić hakerowi ich postać jawną, która jest niezbędna do lokalnego zalogowania się do atakowanej maszyny. Jeśli hasło jest dość złożone, wówczas istnieje duże prawdopodobieństwo, że Opcrack nie poradzi sobie z nim tak szybko, a nawet w ogóle nie będzie w stanie wyliczyć jego postaci jawnej. Podczas gdy rozszyfrowanie prostych haseł zajmuje kilka-kilkanaście minut, to z bardziej złożonymi hasłami Ophcrack może sobie dość ciężko radzić, a niekiedy próba ich rozszyfrowania może zająć wiele godzin i dni, czasami nawet bez efektu. Pamiętajmy jednak, że nawet jeśli haker nie będzie w stanie zdobyć jawnej postaci pożądanego hasła, to aby zalogować się do atakowanej maszyny zdalnie, wystarczy mu informacja o nazwie użytkownika oraz o skrócie NT jego hasła. Posiadając te informacje haker może przykładowo skorzystać z narzędzia psexec pakietu frameworka hakerskiego Metaspoit, bądź z setek innych podobnych narzędzi dostępnych na różnych hakerskich portalach.

Metasploit
Metasploit

Jak więc chronić komputer przed atakami związanymi z nieautoryzowanym dostępem fizycznym? Otóż wyłączenie możliwości uruchamiania maszyny z innych mediów niż dysk z systemem Windows i ustawienie hasła dostępu do systemu BIOS to żadna ochrona, tylko lekkie utrudnienie, które można szybko ominąć wyciągając na chwilę bateryjkę CMOS w celu zresetowania ustawień BIOSa. Dość skuteczną ochronę przed tego typu atakami zapewni jednak szyfrowanie systemowego dysku za pomocą oprogramowania BitLocker. Aby w pełni cieszyć się z ogromnych możliwości jakie oferuje to oprogramowanie nasz sprzęt powinien być wyposażony w moduł TPM. Jednak można korzystać z oprogramowania BitLocker nawet w przypadku nie posiadania tego modułu jeśli administrator systemu na to pozwoli.

Szyfrowanie dysku - BitLocker

Uniemożliwi to łamanie haseł zapisanych w pliku SAM przy pomocy tęczowych tablic, lecz nie zapewni ochrony przed atakami brute-force. Jeśli hasła użytkowników są dość skomplikowane to metoda brute force raczej się nie powiedzie. Pamiętajmy jednak, że programy typu Ophcrack stają się dla hakera bezużyteczne w przypadku kont użytkowników logujących się do systemu za pomocą konta Microsoft, a także w przypadku kont domenowych, gdyż wówczas lokalny plik SAM nie zawiera ich haseł.

W skrócie poziom ochrony przed atakami lokalnymi można zwiększyć poprzez:
  • Wyłączenie w systemie BIOS możliwości bootowania maszyny z urządzeń USB i napędów optycznych oraz zastosowanie hasła dostępu do ustawień BIOS (utrudnienie);
  • Stosowanie kont Microsoft (Microsoft Account);
  • Stosowanie długich i złożonych haseł, zawierających duże i małe litery, cyfry oraz znaki specjalne;
  • Szyfrowanie dysku systemowego za pomocą oprogramowania BitLocker;


Bezpieczeństwo komputera: ataki zdalne


Najbardziej skuteczny rodzaj ataków zdalnych na komputery, czyli ataków przeprowadzanych przez sieć, to ataki socjotechniczne. Decydującym elementem w tego typu atakach jest człowiek, czyli najsłabsze ogniwo obrony, a strategia polega na skłonieniu ofiary do zrobienia czegoś, czego normalnie by nie zrobiła. Przykładem takiego ataku może być wysłanie do ofiary wiadomości email z przekonującą treścią oraz zainfekowanym załącznikiem, w który oczywiście ofiara kliknie, a wówczas z dużym prawdopodobieństwem hakerowi uda się przejąć kontrolę nad systemem.

Programy antywirusowe owszem zapobiegają wykonaniu podejrzanego kodu, lecz generalnie są skuteczne w przypadku znanych producentowi oprogramowania wirusów i trojanów, czyli tych które widnieją w bazie danych stosowanego programu. Dlatego, swoją drogą, zalecane jest regularne aktualizowanie bazy danych oprogramowania antywirusowego. Lecz to nie wszystko co należy zrobić by się przed tego typu atakami zabezpieczyć.

Zawodowi hakerzy są w stanie napisać wrogi kod na konkretne zlecenie. Kod ten nie zostanie wykryty przez większość programów antywirusowych, ponieważ nie będą one miały o nim żadnych informacji. Pomijając wyspecjalizowany kod, pisany przez zawodowców na zlecenie za dość duże pieniądze, prawda jest taka, że od pojawienia się nowego typu wirusa/trojana, mija co najmniej 2-3 tygodnie zanim producenci antywirusów uwzględnią go w swoich bazach danych. Co to wszystko oznacza? Oznacza to, że należy się w dodatkowy sposób chronić przed możliwością wykonania podejrzanego kodu na naszych komputerach. Jak to zrobić?

Dość wysoki poziom ochrony przed wykonywaniem podejrzanego kodu można uzyskać włączając w systemie Windows funkcję DEP – Data Execution Prevention.

Oto jak to zrobić:
  • Uruchomić eksplorator plików;
  • Trzymając myszkę nad ikonką Ten Komputer należy przycisnąć prawy klawisz myszki i wybrać Właściwości;
  • Z widniejącego w prawej części widoku menu należy wybrać Zaawansowane Ustawienia Systemu;
  • W zakładce Zaawansowane należy w sekcji Wydajność kliknąć w Ustawienia;
  • Należy wybrać zakładkę Zapobieganie Wykonywaniu Danych;
  • Włączyć ochronę DEP w odpowiednim trybie;


Jak ustawić funkcję DEP
Jak ustawić funkcję DEP


Jak ustawić funkcję DEP
Jak ustawić funkcję DEP

Zapora ogniowa systemu Windows stanowi dobrą ochronę przed wieloma rodzajami ataków z wykorzystaniem sieci. Oferuje ona bardzo dużo zaawansowanych ustawień. W większości przypadków dobry poziom ochrony zapewniają już standardowe ustawienia oprogramowania. Zapora powinna być zawsze włączona, ewentualnie pod kontrolą oprogramowania antywirusowego.

Poziom ochrony w zakresie wrogiego kodu można dodatkowo zwiększyć ograniczając możliwość uruchamiania przez użytkowników dowolnego oprogramowania. W tym celu należy skorzystać z przystawki Zasady Zabezpieczeń Lokalnych secpol.msc, definiując odpowiednie reguły zabezpieczeń w ustawieniach Zasady Ograniczeń Oprogramowania. Na stronach Technet Microsoft można znaleźć szczegółowe instrukcje o tym jak to zrobić.

Zasady oprogramowania umożliwiają sporą kontrolę nad tym co jest w systemie uruchamiane. Jednak są to ustawienia bardzo rygorystyczne. O ile wprowadzenie zasad oprogramowania w wielu przedsiębiorstwach napotyka się na duży opór ze strony użytkowników, o tyle w warunkach domowych ograniczenia tego typy przeważnie zupełnie tracą sens, chyba że korzystamy z kilku ulubionych programów i nie zamierzamy niczego innego uruchamiać.

Zasady zapezpieczeń lokalnych
Zasady zapezpieczeń lokalnych

Innym rodzajem ataków zdalnych są ataki sieciowe, wykorzystujące luki bezpieczeństwa w oprogramowaniu ofiary. Są to bardzo powszechne ataki, ze względu na prostotę ich przeprowadzania. Hakerski framework Metasploit zawiera cały zestaw narzędzi i modułów umożliwiających przeprowadzanie tego typu ataków bez konieczności posiadania gruntownej wiedzy informatycznej. Jak to działa? Otóż od momentu otrzymania przez producenta oprogramowania informacji o potencjalnym problemie do chwili pojawienia się poprawek zawartych w aktualizacjach mija przeważnie wiele miesięcy. Okres ten może być krótszy w przypadku bardzo poważnych problemów, które stanowią realne zagrożenie. Informacje o lukach bezpieczeństwa w oprogramowaniu są publicznie dostępne. Jeśli chodzi o system Windows 10 to całą listę problemów mamy tutaj: https://www.cvedetails.com/vulnerability-list/vendor_id-26/product_id-32238/Microsoft-Windows-10.html

Na podstawie publicznie dostępnych informacji o lukach powstają odpowiednie moduły frameworków Hakerskich. W szczegółowych informacjach publicznych o danym problemie technicznym można się dowiedzieć, między innymi, czy został już opracowany związany z nim moduł frameworka Metasploit. Niekiedy jednak jest tak, że hakerzy tworzą własny kod, jeszcze przed pojawieniem się publicznych informacji o danej luce. Są bowiem tacy zawodowi hakerzy, którym wcale nie zależy na nagłośnieniu problemu, lecz bardziej na wykorzystaniu istniejącej luki w celu osiągnięcia zysku.

W skrócie poziom ochrony przed atakami zdalnymi można znacznie zwiększyć poprzez:
  • Korzystanie tylko z najnowszych wersji oprogramowania;
  • Stosowanie sprawdzonego oprogramowania antywirusowego z zawsze aktualną bazą wirusów;
  • Włączenie odpowiedniego poziomu ochrony DEP;
  • Stosowanie lokalnych zasad oprogramowania;
  • Stosowanie zapory ogniowej systemu Windows;

Bezpieczeństwo IT – monitorowanie aktywności podstawą bezpieczeństwa


Żadne z opisanych wcześniej zaleceń nie zapewni długoterminowej ochrony systemu, jeśli pominiemy fundamentalną część polityki bezpieczeństwa, związaną z monitorowaniem aktywności w sieci i w samym systemie. Warto zapoznać się w tym celu z możliwościami jakie oferują zaawansowane dzienniki systemu Windows oraz z oprogramowaniem służącym do monitorowania ruchu w sieci. Gorąco polecam program WireShark, którego jestem zwolennikiem od wielu lat. Ciekawe narzędzia umożliwiające dokładny nadzór procesów można znaleźć w darmowym pakiecie Microsoft SysInternal Suite.

A więc zaglądajmy do dzienników systemu Windows i monitorujmy procesy oraz ruch w sieci. Gdy już będziemy mieli w tym wprawę, będziemy w stanie dostrzec zagrożenia, które często pozostają niezauważane przez powszechne oprogramowanie mające na celu chronić system.

Podsumowanie


Mam nadzieję, że powyższe wskazówki okażą się czytelnikom przydatne. Są to jednak podstawowe porady, dotyczące samego komputera. Pamiętajmy, że komputery są jednak częścią sieci, w których ważną rolę odgrywają także inne urządzenia, takie jak routery, switche, access pointy i tym podobne. Należy więc pamiętać również o tych urządzeniach i odpowiednio je zabezpieczyć. O tym jak to zrobić postaram się napisać innym razem.
Jeśli są jakieś pytania lub wątpliwości, lub ktoś pragnie się podzielić własną wiedzą w tym zakresie, bardzo proszę o komentarze.

poniedziałek, 24 kwietnia 2017

PHP a połączenie z serwerem MySQL

Php i MySQL stanowią podstawę funkcjonalności większości rozbudowanych aplikacji web oraz firmowych witryn internetowych. Każdy zawodowy twórca aplikacji web dobrze wie jak ważny jest wybór odpowiedniej platformy bazodanowej dla swoich projektów. Kluczowe znaczenie w tym zakresie ma także sposób łączenia się z serwerem baz danych z poziomu skryptów php, tak aby interakcja użytkowników z tabelami danych była efektywna i nie stanowiła zagrożeń.

PHP a połączenie z serwerem MySQL
PHP a połączenie z serwerem MySQL

Z poziomu skryptów php można ustanowić połączenie z serwerem bazodanowym MySQL na kilka sposobów. W tym artykule postaram się omówić zalety i wady każdej z tych metod. Przedstawię również porównanie podstawowych cech każdego z tych rozwiązań.

W celach dydaktycznych przygotowałem kilka przykładowych skryptów, które pojawiają się w tym artykule. Jeśli któryś z czytelników będzie miał ochotę przetestować ich działanie, do czego oczywiście gorąco zachęcam, dołączam wspólny fragment skryptów, zawierający zmienne dotyczące nazwy hosta, użytkownika, hasła i nazwy bazy danych, które należy ustawić w pierwszych liniach kodu wedle własnych potrzeb:

$host = 'localhost' ; // nazwa hosta $user = 'uzytkownik' ; // użytkownik $password = 'haslo' ; // hasło $db = 'bazadanych '; // baza danych

Z góry zaznaczam, że zawarte w artykule skrypty mają charakter czysto szkoleniowy i nie są opatrzone w zabezpieczenia charakterystyczne dla środowisk produkcyjnych.

Połączenie z serwerem MySQL za pomocą funkcji mysql_connect() - nie stosować


Łączenie się z serwerem MySQL za pomocą funkcji php mysql_connect() to na dziś dzień już archaiczny sposób uzyskania tego typu połączenia z poziomu skryptu php. Niestety spora ilość nieświadomych entuzjastów proceduralnego PHP wciąż z niego korzysta. Poniżej przedstawiony szkoleniowy skrypt php jest prostym przykładem użycia funkcji mysql_connect(). Skrypt ustanawia połączenie z serwerem, wybiera bazę danych oraz wykonuje prostą kwerendę dopasowującą użytkownika i hasło. Tego typu procedura bywa często stosowana w celach związanych z uwierzytelnianiem:

$conn = mysql_connect($host, $user, $password); if (!$conn) { die('Nie połączono: ' . mysql_error()); } $db = mysql_select_db($db, $conn); if (!$db) { die ('Nie można wybrać bazy danych: ' . mysql_error()); } $query = sprintf("SELECT * FROM users WHERE login='%s' AND pwd='%s'", mysql_real_escape_string($login), mysql_real_escape_string($pwd));

Metoda ta, choć dziś raczej przestarzała, ma jedną wielką zaletę, a mianowicie stanowi świetny materiał historyczno-szkoleniowy dla początkujących programistów. Czemu? Otoż zapoznanie się ze starymi metodami ochrony przed atakami sql-injection może nie tylko okazać się niemałą ciekawostką, lecz może być bardzo przydatne w zrozumieniu natury tych ataków. Metoda ta ma bowiem jedną poważną wadę: nie udostępnia bezpośrednio narzędzi programistycznych chroniących przed atakami typu sql-injection, przez co jej stosowanie w środowisku produkcyjnym a priori odpada. Programista musi tutaj zawsze pamiętać o zabezpieczaniu serwera MySQL poprzez funkcje mysql_real_escape_string(), co może okazać się bardzo uciążliwe, a zarazem nie zupełnie skuteczne, szczególnie przy dużej ilości kodu związanego z zapytaniami. Kolejną wadą tej funkcji jest konieczność stosowania proceduralnego kodu, co samo w sobie stanowi wielką przeszkodę w tworzeniu profesjonalnych rozwiązań.

Połączenie z serwerem MySQL za pomocą klasy PDO


Stosowanie klasy PDO w celu łączenia się z serwerem MySQL z poziomu php gwarantuje ochronę przed atakami typu sql-injection, pod warunkiem stosowania metod tej klasy zgodnie z zaleceniami podręcznika. Metody klasy PDO są łatwe do zrozumienia i bardzo proste w użyciu. Duża elastyczność tej klasy względem obsługi różnorodnych serwerów baz danych, możliwość bezpiecznego wiązania parametrów zapytań z określeniem typu parametru PDO oraz szybkość działania metod, mogą być decydującymi argumentami w kwestii wyboru odpowiedniej opcji dla projektowanej aplikacji.

Możliwość obsługi serwera bazodanowego innego niż MySQL to mocny atut elastyczności, umożliwiający generalnie bezproblemową migrację serwera bazy danych, bez konieczności dużych ingerencji w kod php aplikacji klienckiej. Głównie ze względu na tą cechę moim wyborem, szczególnie w przypadku złożonych aplikacji php, jest zawsze PDO.

Na chwilę obecną klasa php PDO wspiera sterowniki obsługujące następujące serwery bazodanowe:
  • CUBRID
  • MS SQL Server
  • Firebird
  • IBM
  • Informix
  • MySQL
  • MS SQL Server
  • Oracle
  • ODBC i DB2
  • PostgreSQL
  • SQLite
  • 4D

Jedynym mankamentem klasy PDO, oczywiście jeśli można taką cechę uznać za mankament, jest brak proceduralnego API, co może być sporym utrudnieniem dla początkujących programistów. Aby korzystać z klasy PDO programista musi mieć doświadczenie z programowaniem obiektowym. Jednak stabilność i elastyczność działania miewają przeważnie swoją cenę, a ewentualny wkład w naukę programowania obiektowego ze strony nowicjuszy php pragnących rozpocząć przygodę z PDO przyniesie tak czy inaczej ogromną satysfakcję i wielkie korzyści.

Poniżej przedstawiam typowy skrypt php wykorzystujący klasę PDO do nawiązania połączenia z bazą danych serwera MySQL w celu zapisania prostego wiersza danych do tabeli. Zobaczmy jak to się robi obiektowo za pomocą metod klasy PDO:

// ## Połączenie php PDO MySql i prosty zapis wiersza danych try { $conn = new \PDO("mysql:host={$host};dbname={$db}", $user, $password, array( PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); $stm = $conn->prepare("insert into kontrahenci (imie, nazwisko, kodKraju) values (:imie, :nazwisko, :kodKraju) "); $stm->bindValue(':imie', $_POST['imie'], PDO::PARAM_STR); $stm->bindValue(':nazwisko', $_POST['nazwisko'], PDO::PARAM_STR); $stm->bindValue(':kodKraju', $_POST['kodKraju'], PDO::PARAM_INT); $stm->execute(); } catch (PDOException $e) { echo "Wystąpił błąd PDO"; }


Połączenie z serwerem MySQL za pomocą MySQLi


MySQLi jest nie tylko świetnym rozwiązaniem dla początkujących programistów, ze względu na możliwość wyboru zarówno obiektowego jak i proceduralnego API, ale zapewnia optymalną ochronę przed atakami sql-injection, podobnie do klasy PDO. Kolejnym atutem MySQLi jest jego szybkość i w tym zakresie MySQLi ma przewagę nad PDO. Niestety MySQLi jest o wiele trudniejsze do opanowania niż PDO. Dodatkowym mankamentem, w przeciwieństwie do możliwości jakie oferuje klasa PDO, jest tutaj brak możliwości wiązania parametrów zapytań po nazwach. Przykładowy skrypt pokazuje jak nawiązać połączenie korzystając z MySQLi w zakresie API obiektowego oraz jak wygląda tutaj kwestia wiązania parametrów kwerend:

mysqli_report(MYSQLI_REPORT_STRICT); try { $conn = new mysqli($host, $user, $password, $db) ; $stm = $conn->prepare(" insert into kontrahenci (imie, nazwisko, kodKraju) values (?, ?, ?) "); $stm->bind_param('Jan', 'Kowalski', 1); $stm->execute(); } catch (Exception $e ) { echo "Wystąpił błąd Mysqli"; exit; }


Co wybrać


Najlepszy wybór zazwyczaj wywodzi się z doświadczenia. Aby jednak czytelnikom ułatwić zrozumienie generalnych możliwości każdego z omawianych tutaj rozwiązań, przygotowałem poniższą tabelę:
Porównanie cech mysql_connect(), PDO oraz MySQLi
Cecha mysql_connect() PDO MySQLi
Ochrona przed sql-injection NIE TAK  TAK 
Styl proceduralny  TAK  NIE  TAK
 Styl obiektowy NIE  TAK  TAK 
Różne sterowniki (nie tylko MySQL) NIE  TAK NIE
 Wartości parametrów po nazwie NIE  TAK  NIE 
 Łatwość użytkowania TAK  TAK  NIE 
 Przygotowywanie zapytań po stronie klienta NIE  TAK  NIE 
 Przygotowywanie zapytań po stronie serwera NIE  TAK  TAK 
 PHP 5.x TAK  TAK  TAK 
 PHP 7.x NIE  TAK  TAK 


Test szybkości kwerend oraz kody php


Osoby pragnące sprawdzić szybkość działania opisanych tutaj rozwiązań, zachęcam do przetestowania mojego skryptu, który mierzy czas wykonania dowolnej kwerendy oraz czas wykonania kodu php odpowiedzialnego za nawiązanie połączenia z serwerem, ustawienie bazy danych, wykonanie zapytania i zwrócenie wyników w 3 omawianych wariantach łączenia się z serwerem MySQL:

// Porównanie szybkości odczytu danych z serwera MySQL // dla mysql_connect(), PDO oraz MySQLi // Autor: informatyka-porady.blogspot.com // Licencja: friko // // Tutaj należy ustawić odpowiednie dla własnego serwera wartości $host = ""; // np. localhost lub 127.0.0.1 $user = ""; $password = ""; $db = ""; echo "<pre>"; // Kwerenda odczytu lub zapisu danych bez wiązania parametrów zapytania // Można klasycznie użyć np. "SELECT BENCHMARK(1000000,ENCODE('hello',RAND()))" // Lub zastosować dowolną kwerendę... // W celach testowych warto wyłączyć caching // Stosując w kwerendach frazę SQL_NO_CACHE: np. "SELECT SQL_NO_CACHE * from abc" $query = ""; // mysql_connect() $time_start = microtime(true); $easyconn = mysql_connect($host, $user, $password); if (!$easyconn) { die('Nie udało się nawiązać połączenia: ' . mysql_error()); } $easyconn_db = mysql_select_db($db, $easyconn); if (!$easyconn_db) { die ('Nie można wybrać bazy danych: ' . mysql_error()); } mysql_query('set profiling=1'); mysql_query($query); $q = mysql_query('show profiles'); $result = mysql_fetch_assoc($q); $time_end = microtime(true); echo "Połączenie mysql_connect(). Czas wykonania zapytania: ".$result['Duration']."\n"; echo "Czas wykonania skryptu php zapytania sql:".(($time_end - $time_start)/60)."\n\n"; $easyconn = null; try { // PDO $time_start = microtime(true); $conn = new \PDO("mysql:host={$host};dbname={$db}", $user, $password, array( PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); $conn->query('set profiling=1'); $conn->query($query); $data = $conn->query('show profiles'); $result = $data->fetchAll(PDO::FETCH_ASSOC); $time_end = microtime(true); echo "Połączenie PDO. Czas wykonania zapytania:".$result[0]['Duration']."\n"; echo "Czas wykonania skryptu php zapytania sql:".(($time_end - $time_start)/60)."\n\n"; $conn = null; // MySQLi mysqli_report(MYSQLI_REPORT_STRICT); $time_start = microtime(true); $conn = new mysqli($host, $user, $password, $db) ; $conn->query('set profiling=1'); $conn->query($query); $data = $conn->query('show profiles'); $result = $data->fetch_assoc(); $time_end = microtime(true); echo "Połączenie MySQLi. Czas wykonania zapytania:".$result['Duration']."\n"; echo "Czas wykonania skryptu php zapytania sql:".(($time_end - $time_start)/60)."\n\n"; $conn = null; } catch (PDOException $e) { echo "Nie udało się nawiązać połączenia PDO"; } echo "</pre>";

Na moim serwerze wykonanie powyższego skryptu z zapytaniem SQL

SELECT BENCHMARK(1000000,ENCODE('hello',RAND()))

poskutowało wyświetleniem poniżej przedstawionych wyników:

Połączenie mysql_connect(). Czas wykonania zapytania: 17.36685392 Czas wykonania skryptu php zapytania sql:0.28945664962133 Połączenie PDO. Czas wykonania zapytania:17.36803179 Czas wykonania skryptu php zapytania sql:0.28948030074437 Połączenie MySQLi. Czas wykonania zapytania:17.38116807 Czas wykonania skryptu php zapytania sql:0.28969765106837

A więc MySQLi okazało się najbardziej powolne :-)

Czy któryś z czytelników zna inny sposób na wykonanie tego typu testów, oczywiście z poziomu skryptu PHP? Jeśli tak, to będę wdzięczny za komentarze.