Zabezpieczamy stronę przed atakami słownikowymi oraz brutal-force.

Ostatnio zaniedbałem pewne sprawy, głównie te związane ze sprawami prywatnymi. Uwagę moją skupił serwer którym się opiekuję gdy zajrzałem w logi - spora ilość wejść na adres http://example.com/wp-login.php. Szybka analiza oraz porównanie z całkiem oddzielnym serwerem i wniosek błyskawiczny - boty zaczęły panoszyć się po naszych WordPressach.

Ręczne wycinanie IP można uznać za walkę z wiatrakami, dlatego też postanowiłem zastosować trochę inną metodę - moduł AuthBasic serwera HTTP połączony z Fail2Ban. Poniżej przedstawię konfigurację dla serwera Nginx, jednak nikt nie będzie miał problemów przepisać jej pod Apache, Lighttpd czy Cheeroke.

 

1. Uruchamiamy AuthBasic. Należy zwrócić na nazwę plików konfiguracyjnych, zapewne u każdego będą różne.

1.1. Otwieramy plik z konfiguracją naszej domeny, a następnie w sekcji server wpisujemy:

nano /etc/nginx/sites-enabled/example.com.conf
	location  /wp-login.php {
                auth_basic            "Restricted"; 
                auth_basic_user_file  /etc/nginx/haslo-blog;
		include /etc/nginx/fastcgi_params;
        }
 
        location  /wp-admin/ {
                auth_basic            "Restricted";
                auth_basic_user_file  /etc/nginx/haslo-blog; 
		include /etc/nginx/fastcgi_params;
        }

Bardzo ważne, musimy ponownie dodać odwołanie do FastCGI, w przeciwnym razie PHP się wykona bez względu na AuthBasic!
 
1.2. Generujemy hash.

perl -le "print crypt('tu wpisz swoje haslo', 'salt')"

 

1.3. Tworzymy plik z użytkownikiem/użytkownikami.

nano /etc/nginx/haslo-blog
	przykladowyuser:wygenerowanyhash
	przykladowyuser2:kolejnyhash:komentarz
	przykladowyuser3:wygenerowanyhash3:komentarz

 

1.4. Restartujemy nginx.

/etc/init.d/nginx restart

 

2. Połowa drogi za nami, mamy już dodatkową autoryzację do panelu logowania. Teraz pora na Fail2Ban

2.1. Instalajemy F2B.

apt-get install fail2ban

 

2.2. Otwieramy jail.conf i dodajemy regułkę Nginx'a.

nano /etc/fail2ban/jail.conf
[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx/error.log
bantime = 43200 #Blokujemy dostęp na 12h
maxretry = 3

 

2.3. Dodajemy filtr dla regułki.

nano /etc/fail2ban/filter.d/nginx-auth.conf
[Definition]
failregex = no user/password was provided for basic authentication.*client: 
              user .* was not found in.*client: 
              user .* password mismatch.*client: 
ignoreregex =

 

2.4. Restartujemy F2B.

/etc/init.d/fail2ban restart

 

To by było na tyle, metoda odrobinę uciążliwa (podwójne logowanie), jednak dla większego bezpieczeństwa chyba warto. Jak już wspomniałem, ścieżki do plików podałem przykładowe (w regułce Fail2Ban koniecznie trzeba podać poprawną ścieżkę do pliku error.log danego vhosta bądź całego Nginx'a). Warto także dla pliku z hasłem ustawić odpowiednie prawda odczytu, by niepowołane osoby nie miały dostępu.

Phishing – problem leżący po stronie użytkownika.

Ostatniego poświęciłem trochę czasu na pewien eksperyment dotyczący bezpiecznego serfowania w sieci - podatność na phishing.

Phishing – w branży komputerowej, wyłudzanie poufnych informacji osobistych (np. haseł lub szczegółów karty kredytowej) przez podszywanie się pod godną zaufania osobę lub instytucję, której te informacje są pilnie potrzebne. - Wikipedia

Metoda eksperymentu była dość brutalna ale by mieć pewność, musiałem faktycznie wyłudzić dane. Postanowiłem do tego celu napisać skrypt łudząco podobny wyglądem do Facebook-a, jednak nie zadbałem o to, by adres był chociaż odrobinę podobny (sic! Użyłem adresu w domenie rocik.net). Efekt był zaskakująco.. fatalny. Fatalny z punktu widzenia użytkownika. Wiadomość wysłałem do 25 osób, osób których kompletnie nie znam (kontakty znalezione w katalogu publicznym GG oraz czacie internetowym). Spośród 25 osób udało zdobyć się dane aż 22 osób - to prawie 90%. Przedział wiekowy osób waha się miedzy 12 a 18 rokiem życia, a patrząc na aktualny rozwój technologi każda z tych osób ma styczność z internet zapewne od kilku lat.

Gdzie leży problem tak wielkiej nieświadomości bezpiecznego korzystania z sieci?

Wśród młodzieży problem leży głównie w szkole. Programy nauczania nie są zmieniane od lat a chyba nikt się nie będzie sprzeczał, że w ciągu ostatnich lat dostęp do komputera i internetu w domach zawrotnie się zmienił.
Jeszcze parę lat temu spora część uczniów pierwszy kontakt z komputerem miała w szkolnej pracowni, wtedy zwykły ruch myszką był szokującym przeżyciem. Dziś? Dziś zdecydowana większość używa komputera od najmłodszych lat, łącznie z użytkowaniem sieci - w szczególności wszelkiego rodzaju portali społecznościowych. Czy na prawdę trzeba uczyć obsługi Paint-a, czy pisać notatki na temat tworzenia folderu? Wiadomo, zajęcia z dziedziny informatyki mają być na poziomie podstawowym, ale czy bezpieczeństwo naszych danych nie jest (lub czy nie powinno być) jednym z głównych tematów?

Zmiana kilku tematów na pewno by podniosła świadomość użytkowników o parę procent. Jednakże, kto by miał tego uczyć? Wracając latami wstecz, w podstawówce nauczycielem od TI był Pan, który na co dzień od lat uczył plastyki. W gimnazjum natomiast nauczycielką była osoba, która na co dzień uczyła zajęć z techniki. W kolejnej szkole miałem więcej szczęścia. Czy tak jest wszędzie? Na pewno nie, jednak w wielu szkołach nauczycielami od tego przedmiotu są osoby, które obsługę komputera mają w zakresie dość podstawowym (nie mam zamiaru tutaj nikogo obrażać).

Okazuje się więc, że w wypadku młodzieży problem mógłby być rozwiązany w dość prosty sposób. Jednak co z osobami, które skończyły szkoły wiele lat temu?
Osobiście nie mam żadnego pomysłu który by był chociaż w średnim stopniu skuteczny. Niektóre strony (głównie dotyczące operacji na pieniądzach, tak więc serwisy aukcyjne oraz banki) na stronach logowania wyświetlają informację lub odnośniki do wskazówek na co zwracać uwagę (np.  jak sprawdzić czy strona jest szyfrowania, lub poprawność adresu), jednak ile osób zwraca na to uwagę? Zazwyczaj każdy się w pewnym stopniu spieszy, bądź po prostu nie ma ochoty na czytanie porad, które zapewne szybko wylecą mu z głowy. Czy faktycznie można ludzi za to obwiniać? Każdy interesuje się tym, w czym się czuje, w czym się obraca.
Kwestia kursów? Istnieją kursy obsługi komputera i ile znacie osób, które owy kurs zaliczyły? Ludzie po prostu nie mają czasu.

Allegro może być przykładem dla innych, sumiennie co jakiś czas wysyła e-maile z informacją, co jest ważne by dokonywaniu zakupów, logowaniu się oraz przelewaniu pieniędzy. Ma to też swoje wady, że co jakiś czas napływa fala fałszywych maili z podrobionymi odnośnikami do portalu (zob. Niebezpiecznik.pl)

Dlaczego NK czy Facebook nie starają się edukować? Czy ktoś dostał kiedyś wskazówkę od wcześniej wymienionych portali w jaki sposób weryfikować informacje proszące o zmianę bądź potwierdzenie hasła? Ja osobiście nie dostałem.

Podsumowując: po raz kolejny najsłabszym ogniwem okazuje się człowiek. Począwszy od portali, które nie są zbyt chętne do próby edukacji swoich użytkowników, szkoły które nie uczą tego, co na prawdę ważne podczas korzystania z komputera aż po ludzi, którzy nie starają się zadbać o bezpieczeństwo swoich danych. Im większa wygoda tym mniejszy poziom bezpieczeństwa. Może ktoś z czytających ma pomysł, jak rozwiązać problem, który rozniósł się na tak wielką skalę? Jak zmniejszyć ilość ludzi, którzy stają się ofiarami wyłudznia danych?

Kończąc chciałbym poinformować, że każda osoba która nieświadomie podała mi swoje dane dostępowe, została o tym po chwili poinformowana i poproszona o zmianę swojego hasła.

Czy ładowarka jest kablem?

To będzie krótki wpis, mówiący o względności pewnych pojęć.

Pochwale się na początek - niedawno zakupiłem LiveView, czyli taki mały, bajerancki zegarek. zakupu dokonałem na allegro, gdzie w treści aukcji sprzedający napisał, że w zestawie znajduje się ładowarka. Niby zbędny gadżet, całość można i tak ładować przez USB (kabel microusb).

Gdzie sprawa, która jest warta opisania?

Ładowarki nie otrzymałem. W zestawie był uchwyt, kabel, pasek, zegarek, ale nie ładowarka. Napisałem e-mail (dość miłym tonem), czy może zaszła pomyłka przy pakowaniu. Odpowiedź otrzymałem po prawie dwóch tygodniach.

"Przepraszam że tak późno odpisuje , ale to ten kabel USB jest ładowarką."

Nie wiem, śmiać się? Płakać? Chyba olać.

Easy Nginx Installer

Jakiś czas temu straciłem część swoich danych, a razem z tym kilka moich skryptów. Parę osób pisało do mnie, bym w miarę możliwości napisał od nowa "Easy Nginx Installer", bądź podesłał gotowe pliki konfiguracyjne. Nie miałem jakoś specjalnie dużo czasu by to zrobić, jednak całkiem przypadkiem znalazłem na dysku kopię zapasową tego skryptu. Zasada działania jest prosta i opiera się na kilku podstawowych danych, o które skrypt zapyta.

Skrypt tworzy podstawową konfigurację serwera wraz ze sprawnie działającym php.
Po instalacji warto zajrzeć do /etc/nginx/php.conf.

Rocik@rociknet:$ wget http://dev.rocik.net/easy_nginx_installer.sh
chmod +x easy_nginx_installer.sh
./easy_nginx_installer.sh

Całość oczywiście współpracuje tylko z Debianem i pochodnymi!

RS232 jako ostatnia deska ratunku

Zapewne nie raz zdarzyło się wam utracić dostęp do serwera, maszyny testowej lub innego, niewielkiego komputera który służy u was np. w domu do działania pewnych usług bez monitora, klawiatury.
Sprawny system możemy zawsze szybko i wygodnie obsługiwać przez sieć (SSH, Telnet, VNC), co jednak w przypadku, gdy system nie chce wstać po zmianie jądra? Gdy sieć przestanie odpowiadać? Jeśli w okolicy znajduje się drugi komputer z którego mamy dostęp oraz posiada on port RS232 (COM) to możemy czuć się trochę bardziej bezpieczni tworząc miedzy nimi awaryjne połączenie dostępowe.

Całość jest dość prosta i nie zajmie więcej niż 10minut.
Na początek warto zaopatrzyć się w paczkę setserial.

Rocik@rociknet:$ apt-get install setserial

Paczka ta umożliwia nam sprawdzenie dostępnych portów, należy pamiętać, że jeśli nie mamy odpowiednich uprawnień jako użytkownik to musimy ją używać z prawami roota.

Rocik@rociknet:$ setserial -g /dev/ttyS[0123]
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3

Powyższy wynik pokazuje nam, że dostępny mamy port /dev/ttyS0. Należy to zapamiętać, przyda się to w następnych krokach.

1. Konfigurujemy GRUB2

Otwieramy dowolny edytor tekstu:

Rocik@rociknet:$ nano /etc/default/grub
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,9600n8"
GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"
GRUB_TERMINAL=serial

Należy zwrócić uwagę, ttyS0 trzeba zastąpić portem dostępnym u siebie. Prędkość 9600 może zostać bez zmian.

W wcześniej wymienionym pliku powinny się znajdować już wcześniej linie odpowiadające za domyślny wybór jądra oraz czas oczekiwania na reakcję.

GRUB_DEFAULT=0
GRUB_TIMEOUT=5

Po dodaniu wszystkich wpisów, należy pamiętać, by wykonać aktualizacje gruba poleceniem

Rocik@rociknet:$ update-grub

2. Grub stoi! Teraz tty.

Ponownie otwieramy edytor:

Rocik@rociknet:$ nano /etc/inittab

Na końcu pliku wystarczy dodać poniższy wpis

T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

Kolejny raz musimy zwrócić uwagę na to, by był wpisany odpowiedni port.
Wygląda na to, że to koniec konfiguracji.

3.Teraz przechodzimy na maszynę, z której będziemy się podłączać.

Potrzebujemy paczkę minicom.

Rocik@rociknet:$ apt-get install minicom

Możemy także na tej maszynie sprawdzić dostępny port COM, by wiedzieć z jakiego portu się łaczymy. Polecenie znajduję się trochę wyżej (setserial). Podłączenie się jest banalnie proste:

Rocik@rociknet:$ minicom --device /dev/ttyS0 -b 9600

Oprócz poprawnego portu ważne, by prędkość zgadzała się z tą, która podaliśmy w konfiguracji.
Aktualnie nie zobaczymy nic, gdyż inittab załaduje tty na ttyS0 dopiero po ponownym uruchomieniu. Warto zostać teraz podłączonym i wykonać reboot, powinniśmy zobaczyć najpierw gruba, następnie całe ładowanie systemu a następnie uzyskać dostęp do tty.

Menu GRUB po podłączeniu się przez minicom.

TTY przez minicom

Teraz kłania się pytanie - po co to robić?

Niedawno moja maszyna nie podniosła się po zmianie jądra, a oddalona jest o kilkadziesiąt kilometrów. Stoi w pomieszczeniu, gdzie znajduje się jeszcze kilka innych maszyn. Dzięki temu zalogowałem się na serwer obok, na którym poprzez minicom dotarłem do GRUBa mojej maszyny, sprawdziłem błąd oraz wybrałem z listy inny - sprawny kernel. Jest to na pewno swego rodzaju alternatywa dla osób początkujących które chcą mieć maksymalny dostęp do swojego serwera a nie chcą wydawać dużych pieniędzy na drogi (oraz bogatszy w wiele innych możliwości) sprzętowy KVM.