Jak bezpiecznie korzystać z loginów i haseł w Internecie i nie tylko

Przykład powyżej przedstawia sposób przechowywania znacznej części administratorów w polskich firmach prywatnych i państwowych. Oczywiście nie widać momentu jak wpisuję hasło do arkusza, ale darujmy sobie to. W sumie nie tylko mowa o administratorach, bo spotkałem się z przełożonymi korzystającymi z takich praktyk. Mój komentarz jest następujący: TO JEST DRAMAT. Postaram się wyjaśnić dlaczego łapię się za głowę jak to widzę i przy okazji postaram się przedstawić bezpieczny sposób na hasła w sieci i nie tylko. Jest to mechanizm, który sam sobie wypracowałem i posługuję się nim od ponad roku.

Jakie są najlepsze praktyki w zabezpieczaniu kont w sieci?

W skrócie:

  • hasła do różnych serwisów powinny być różne,
  • hasła powinny składać się z cyfr, znaków specjalnych, dużych i małych liter oraz powinny być dłuższe niż 12 znaków oraz hasło nie powinno składać się ze spójnych elementów (np. hasła z generatorów haseł), powinno zawierać pewien element losowości,
  • hasła powinny być przechowywane w pęku kluczy stworzonym przez menedżerze haseł,
  • hasła te powinny być zmieniane co jakiś czas (celowo nie określam przedziału czasowego),
  • pęk kluczy powinien być zabezpieczony hasłem lub kluczem publicznym lub kluczem sprzętowym (zaleca się wykorzystywanie co najmniej 2 form zabezpieczenia),
  • pęk kluczy powinien być zabezpieczony przed utratą w postaci kopii zapasowej (na przykład poprzez synchronizację na chmurze),
  • dwustopniowe uwierzytelnienie powinno być skonfigurowana w miejscach, gdzie to jest możliwe oraz powinna być realizowana przez mechanizm, który umożliwia tworzenie kopii zapasowej.

To może być trochę przerażające, ale to są naprawdę najlepsze opcje na bezpieczeństwo w sieci. Zakładam, że nie każdego stać i nie każdy ma ochotę kupować klucze sprzętowe by być bezpieczniejszym. Nie ma potrzeby do czegoś takiego się zmuszać, wszystko powinno się w tej kwestii robić z rozsądkiem.

Zanim wejdę w temat, krótkie wyjaśnienie:

Uwierzytelnienie (authentication) to proces, w którym udowadniamy, że my to my, możemy to zrobić poprzez „coś, co wiemy”, czyli na przykład znamy jakieś hasło, „coś, co mamy”, czyli na przykład token z aplikacji do logowania lub klucz sprzętowy lub poprzez „coś, czym jesteśmy”, czyli na przykład korzystając biometryki (używając odcisków palców na czytniku, korzystając z Intel RealSense 3D skanując nasz kształt twarzy przez specjalną kamerę, skanując tęczówki oka).

Autoryzacja (authorization) to proces, w którym system sprawdza, czy mamy prawo dostępu. Na przykład po zalogowaniu się do systemu ten wie, że my to my, lecz nie wie czy mamy dostęp do usług. Na przykład, jeśli nie opłacę subskrypcji za Netflixa i zaloguję się na swoje konto, ale nie będę mógł oglądać żadnych filmów. To przykład nieudanej autoryzacji.

Niektórzy używają pojęcia autentykacja – to jest kalka z angielskiego i dotyczy ona uwierzytelnienia.

„hasła do różnych serwisów powinny być różne”

Załóżmy, że używamy 1 hasła: Zaq12wsx!cokolwiek Jest to hasło, które spełnia prawie wszystkie wymagania, które przedstawiłem (z wyjątkiem losowości, bo jest ona trochę kiepska). Te hasło używamy na wielu różnych stronach. Facebook, Google, Instagram, cokolwiek innego. Nagle jeden z tych serwisów zostaje zaatakowany przez grupę hakerów, która wykrada bazę danych. Potem okazuje się, że strona nie przechowywała haseł w bezpieczny sposób (czyli na przykład przechowywała hasła w czystym tekście albo korzystała z kiepskiego mechanizmu haszującego). W ten sposób w większości wypadków ktoś ma w bazie nasz adres email i hasło – czyli najpopularniejszą formę logowania. Załóżmy, że z tej listy to był Instagram – w takiej sytuacji mając te same loginy i hasła atakujący może się zalogować na Facebooka, konto Google i cokolwiek innego tam, gdzie ustawiliśmy te same hasła. To jest małe piwo. Duże piwo zaczyna się wtedy jeśli używaliśmy tego samego hasła na kontach firmowych i ktoś zorientuje się jaki adres mailowy posiadamy w pracy lub nazwę użytkownika. Wtedy się mogą zacząć prawdziwe kłopoty.

Rozwiązanie? Inne hasła. Ale z drugiej strony spójrzmy prawdzie w oczy – ile jesteśmy w stanie haseł zapamiętać? 1? 5? 10? Będzie dobrze jak 5. Problem w tym, że większość z nas nie korzysta z 5 serwisów, tylko na przykład z 50. W moim przypadku zliczyłem ponad 150 kont w Internecie. Powodzenia w zapamiętaniu tych 150 haseł. To nie jest możliwe, dlatego trzeba sobie te hasła zabezpieczać. Dlatego hasła należy przechowywać w jednym, wspólnym miejscu.

mocne hasło i dwustopniowe uwierzytelnianie

Dzięki temu nasze hasło jest trudniej odgadnąć. Najprościej jest używać menedżera haseł i kopiować wygenerowane hasła – moje hasła są w większości 32-znakowe i nie ma szans, bym pamiętał chociaż jedno. Jest kilka kont, do których potrzebuję szybkiego dostępu typu na przykład Koleje Śląskie jak bym chciał szybko przez telefon kupić bilet na pociąg, ale poza tym wszędzie te hasła są po prostu długie i je wszystkie kopiuje z bazy. Po 10 sekundach od skopiowania hasła z KeePassa te jest usuwane ze schowka w systemie. Hasło same w sobie powinno mieć ogólnie więcej niż 12 znaków, duże, małe litery, cyfry i znaki specjalne. Do testowania haseł można skorzystać ze strony howsecureismypassword.net, która pozwala nam wpisać hasło, a strona powie nam w ile przeciętny komputer powinien takie hasło złamać:

Przykład dobrego hasła:

Kmn6X;c?F4Mx'=^"

Te hasło jest całkowicie losowe. Co prawda, nie może być wykorzystane wszędzie, bo zawiera znaki, których nie możemy dodać np. w pliku konfiguracyjnym. Takie znaki to często: { } [ ] ( ) / \ ' " ` ~ , ; : . < >, ale na szczęście generatory haseł pozwalają nam wykluczyć takie znaki z generacji, dzięki czemu można otrzymać to:

Cr*f6y_8EV4ey!&r

Przykład trudnego, ale nie całkowicie losowego hasła:

23N2iePatrz5ieNaP6likany%

Ciężko, by takie hasło było związane z jakąś pracą, bo jest całkowicie losowe + znaki w haśle są czasami w losowych miejscach. To sprawia, że hasło jest trudniejsze do złamania, ale jednocześnie trudniej je zapamiętać.

Przykład słabego hasła:

NazwaNaszejFirmy2021!123

Hasło składa się z prostych słów, które łatwo zapamiętać, przez co sprawia, że łatwiej je zapamiętać. To dobre dla nas, lecz też ułatwia to sprawę atakującym. Trzeba na to uważać z jakich słów składają się hasła, bo jeśli kontekst hasła pasuje do tego gdzie ono jest używane – sprawia to, że łatwiej jest je odgadnąć.

Teraz pytanie: czy każdy powinien używać takiego trudnego hasła? To zależy gdzie takie hasło będziesz używać:

  • strony internetowe – całkowicie losowe,
  • bazy danych, aplikacje – całkowicie losowe,
  • menedżer haseł – trudne, ale nie musi być całkowicie losowe,
  • strony „niskiego ryzyka” – trudne, ale nie musi być całkowicie losowe.

Dlaczego tak? Pierwsze dwa zawsze mogą być kopiowane z menedżera haseł i nie trzeba tych haseł pamiętać. Tak samo jest z drugim. W przypadku menedżera haseł te hasło musimy pamiętać (jest wyjątek, opiszę go w dalszej części posta). Tutaj musimy sami zdecydować jak dobrą mamy pamięć lub papier, na którym zapisujemy tekst.

W przypadku stron „niskiego ryzyka” – mam na myśli strony, w których jeśli stracimy dostęp, nikt nam nie wyrządzi szkody. Dla mnie taką stroną jest strona Kolei Śląskich, bo w przypadku, gdy ktoś przejąłby moje konto to mógłby zobaczyć jak się nazywam i ewentualnie mógłby kupić mi bilet na pociąg 😂

Żarty żartami, ale definitywnie do niskiego ryzyka nie należą strony takie jak na przykład Facebook. Typowy argument, który ja słyszę to: ale przecież ja nie mam nic do ukrycia, tam i tak nic nie ma, przecież nie jestem żadnym przestępcą, to co mogłoby się stać. Cóż, mogłoby i dam przykład. Załóżmy, że ja jestem atakującym. Mógłbym zalogować się na Facebooka ofiary i napisać do 2 znajomych, z którymi ofiara ostatnio pisała, że wykopałem się kasy i potrzebuje 50 zł na tydzień. W dużej mierze raczej osoba odpisze, że nie ma problemu, bo większość ludzi ma uśpioną czujność i nie zadzwoni na komórkę, by sprawdzić czy to na pewno prawdziwa prośba. Czyli w ten sposób wyjąłem od ofiary 100 zł, bo koniec końców pewnie odda te pieniądze. A to tylko jedna osoba. Oczywiście to tylko początek rzeczy, jakie można robić podszywając się pod kogoś i chyba lepiej się o tym nie przekonywać jak to mogłoby się skończyć, gdy ktoś przegląda nasze wiadomości prywatne…

Hasło do menedżera haseł może być losowym i trudnym hasłem pod warunkiem, że będziemy w stanie je wprowadzić w wygodny sposób. W innym wypadku większość ludzi po prostu nie będzie korzystać z takiego rozwiązania. W takich sytuacjach szczególnie warto się wyposażyć w klucz sprzętowy, jakim jest np. YubiKey:

Dzięki temu poza podaniem hasła w KeePassie należy wybrać klucz sprzętowy przypisany do bazy:

Alternatywą dla kluczy sprzętowych jest klucz publiczny – generujemy taki za pomocą Pageanta, gdy na przykład używamy PuTTY na Windowsie – to zdecydowanie wystarczy. Używałem czegoś takiego w poprzedniej pracy. Dla cierpliwych zawsze można skorzystać ze wszystkich trzech opcji, ale moim zdaniem nie jest warto.

„hasła powinny być przechowywane w pęku kluczy stworzonym przez menedżerze haseł”

Niektórzy używają Excela ale to jest kiepskie rozwiązanie z tego względu, że nie każdy zabezpiecza go hasłem, poza tym nie każdy ma nowego Office, co sprawiałoby to, że Office szyfrowałby dokument aktualnymi bezpiecznie mechanizmami (bodajże Office 2007 i 2003 mają bardzo łatwe do złamania mechanizmy). Poza tym Excel nie jest przeznaczony do przechowywania haseł, do tego są pęki haseł w programach typu KeePassXC (to taki lepszy KeePass). KeePass jest przykładowym rozwiązaniem i nie jest wyłącznym menedżerem haseł, które rozwiązuje ten problem. Jest wiele innych, czasami opartych o chmurę rozwiązań, które też są bezpieczne.

KeePass poza samym przechowywaniem haseł pozwala na obsługę 2FA kont, łatwe generowanie haseł, pozwala zabezpieczyć bazę haseł dwu- i trzystopniowo (hasło, klucz publiczny, klucz sprzetowy), da się go zintegrować z przeglądarką, dzięki czemu wpisywanie haseł jest prostsze. Zresztą przedstawiłem już nawet przykład powyżej.

Oczywiście trzeba pamiętać, że KeePass i jego baza nie jest czymś nie do złamania. Fakt, zawartość jest szyfrowana przez AES 256-bitowy, ale to nie zmienia faktu, że takie hasło da się złamać. Ten sam program jest w stanie łamać hasła do arkuszy w Excelu i jest nim hashcat. To ogólnie narzędzie do łamania haseł w różnych algorytmach, i po prostu bazy KeePassa i arkusze Excela są jedynie drobnym elementem listy tego, co on obsługuje. Tutaj jest gotowy skrypt do łamania arkuszy Excela.

Hasła się łamie na dwa sposoby: słownikowo i siłowo. Słownik zakłada, że posiada się dużą bazę haseł (na przykład jedną wielką sklejkę haseł z wycieków różnych serwisów internetowych z przeciągu kilku lat 😉) lub serwerek z mocną kartą graficzną do obliczeń i jeśli hasło było krótkie lub łatwe – zostanie złamane dosyć szybko.

Pokażę jak to wygląda w praktyce zakładając, że definiuję metodę siłową, która natrafi na hasło, które jest w arkuszu:

supra@supra-pc:/mnt/r/supra/Pulpit$ python office2hashcat.py Zeszyt1.xlsx
$office$*2013*100000*256*16*cb973f1be246fbd96939c909bce5905e*18fe55fc3f134776687f79551c68a3f6*b519e82fa04c357910f2022f6ddd8f2f2ba0ac81436c2b83d96ca7eb0eda8883
R:\supra\Pulpit\hashcat-6.0.0>hashcat.exe -a 3 -w 3 -m 9600 hash.lst ^Z?l?l?d?dwsx!
hashcat (v6.0.0) starting...

* Device #1: CUDA SDK Toolkit installation NOT detected.
             CUDA SDK Toolkit installation required for proper device support and utilization
             Falling back to OpenCL Runtime

* Device #1: WARNING! Kernel exec timeout is not disabled.
             This may cause "CL_OUT_OF_RESOURCES" or related errors.
             To disable the timeout, see: https://hashcat.net/q/timeoutpatch
OpenCL API (OpenCL 1.2 CUDA 11.0.140) - Platform #1 [NVIDIA Corporation]
========================================================================
* Device #1: GeForce RTX 2070, 6912/8192 MB (2048 MB allocatable), 36MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates

Applicable optimizers:
* Zero-Byte
* Single-Hash
* Single-Salt
* Brute-Force
* Slow-Hash-SIMD-LOOP

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 696 MB

The wordlist or mask that you are using is too small.
This means that hashcat cannot use the full parallel power of your device(s).
Unless you supply more work, your cracking speed will drop.
For tips on supplying more work, see: https://hashcat.net/faq/morework

Approaching final keyspace - workload adjusted.

[s]tatus [p]ause [b]ypass [c]heckpoint [q]uit =>

Session..........: hashcat
Status...........: Running
Hash.Name........: MS Office 2013
Hash.Target......: $office$*2013*100000*256*16*cb973f1be246fbd96939c90...da8883
Time.Started.....: Fri Jul 17 12:12:55 2020 (2 secs)
Time.Estimated...: Fri Jul 17 12:13:03 2020 (6 secs)
Guess.Mask.......: Z?l?l?d?dwsx! [9]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:    10937 H/s (31.52ms) @ Accel:4 Loops:512 Thr:1024 Vec:1
Recovered........: 0/1 (0.00%) Digests
Progress.........: 0/67600 (0.00%)
Rejected.........: 0/0 (0.00%)
Restore.Point....: 0/67600 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:31744-32256
Candidates.#1....: Zar12wsx! -> Zqx84wsx!
Hardware.Mon.#1..: Temp: 71c Fan: 46% Util:100% Core:1935MHz Mem:7000MHz Bus:16

$office$*2013*100000*256*16*cb973f1be246fbd96939c909bce5905e*18fe55fc3f134776687f79551c68a3f6*b519e82fa04c357910f2022f6ddd8f2f2ba0ac81436c2b83d96ca7eb0eda8883:Zaq12wsx!

Session..........: hashcat
Status...........: Cracked
Hash.Name........: MS Office 2013
Hash.Target......: $office$*2013*100000*256*16*cb973f1be246fbd96939c90...da8883
Time.Started.....: Fri Jul 17 12:12:55 2020 (6 secs)
Time.Estimated...: Fri Jul 17 12:13:01 2020 (0 secs)
Guess.Mask.......: Z?l?l?d?dwsx! [9]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:    11630 H/s (28.61ms) @ Accel:4 Loops:512 Thr:1024 Vec:1
Recovered........: 1/1 (100.00%) Digests
Progress.........: 67600/67600 (100.00%)
Rejected.........: 0/67600 (0.00%)
Restore.Point....: 0/67600 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: Zar12wsx! -> Zqx84wsx!
Hardware.Mon.#1..: Temp: 71c Fan: 54% Util:100% Core:1935MHz Mem:7000MHz Bus:16

Started: Fri Jul 17 12:12:52 2020
Stopped: Fri Jul 17 12:13:02 2020


/////////////////////////////////////////////////////////////////////////
Hashcat.potfile
$office$*2013*100000*256*16*cb973f1be246fbd96939c909bce5905e*18fe55fc3f134776687f79551c68a3f6*b519e82fa04c357910f2022f6ddd8f2f2ba0ac81436c2b83d96ca7eb0eda8883:Zaq12wsx!
/////////////////////////////////////////////////////////////////////////

W zaznaczonym miejscu widać hasło. Jak widać poniżej, taka metoda też jest dostępna dla KeePassa:

W przypadku posiadania dwustopniowego uwierzytelniania raczej ta opcja w hashcat to przycisk do papieru. Nie sądzę, by było możliwe łamanie dwóch ciągów znaków jednocześnie w wydajny sposób i w czasie, który pozwoli na łatwe złamanie siłą rzeczy dwóch haseł jednocześnie. Jeśli się mylę – dajcie znać.

„hasła te powinny być zmieniane co jakiś czas”

Tutaj nie ma za dużo do obgadywania. Hasła co jakiś czas należy zmieniać i to jest trochę jak wymienianie wypalonych żarówek w pokoju, lecz klepiemy na klawiaturze. W firmach sensownym okresem czasu jest 3-6 miesięcy. Prywatnie nie zmieniałbym częściej niż rok, nawet dwa. Wyjątkiem od tej reguły jest wyciek – wtedy zmieniamy hasło natychmiast. Oczywiście trzymając się poprzedniej reguły dotyczącej różnych haseł na różnych serwisach nie trzeba zmieniać tych haseł wszędzie – wystarczy w miejscu, gdzie to hasło wyciekło.

„pęk kluczy powinien być zabezpieczony hasłem lub kluczem publicznym lub kluczem sprzętowym (zaleca się wykorzystywanie co najmniej 2 form zabezpieczenia)”

Ten punkt jest opcjonalny. Nie każdego stać na to i nie każdy musi to mieć prywatnie, ale moim zdaniem służbowo jako administrator w firmie każdy powinien coś takiego posiadać. Dwa klucze sprzętowe, które są moim zdaniem godne uwagi to YubiKey 5 NFC i SoloKey Solo V2 (które powinno już być dostępne). Klucze powinno się kupować w parach, to znaczy zawsze dwie sztuki, bo jak uszkodzimy klucz to na zapasowym mamy kopię naszych kluczy prywatnych/HMAC itd. W przypadku YubiKey 5 NFC koszt to około 500 zł mając to na względzie. Solo V2 dostaniemy za połowę tej ceny. W cenie YubiKey dostaniemy definitywnie dużą odporność na uszkodzenia i wodoszczelność (której nie ma w Solo V2), w zamian w Solo V2 otrzymamy sprzęt z otwartym oprogramowaniem układowym (firmware YubiKey jest zamknięty) oraz nieco większe możliwości pod kątem autoryzacji w Windowsie od YubiKey).

Konfiguracja kluczy jest dosyć prosta, udało mi się wszystko ustawić tego samego wieczoru, którego odebrałem urządzenia 😊

„pęk kluczy powinien być zabezpieczony przed utratą w postaci kopii zapasowej”

Podałem jako przykład chmurę, bo to wydaje się najrozsądniejsze. W ten sposób możemy mieć dostęp do pęku kluczy z telefonu, bo na Androidzie jest aplikacja KeePass2Android, która jest w stanie pobierać pęk kluczy z chmury i go aktualizować. Ponadto obsługuje klucze sprzętowe! To jest moim zdaniem coś. Najlepiej mieć do tego własną chmurę, ale zdając sobie sprawę z tego, że nie każdego na to stać lub nie każdy chce musieć coś takiego ustawiać – zawsze można wybrać Google Drive czy Dropbox. To też są rozwiązania, które raczej będą okej. Ja osobiście korzystam z Nextcloud, bo uważam to za najlepsze rozwiązanie do prywatnej chmury ze względu na możliwości i fakt, że te oprogramowanie jest otwartoźródłowe. Ponadto jest wtyczka, która pozwala na otwieranie baz KeePassa bezpośrednio ze stronki Nextcloud, lecz niestety ona raczej nie obsługuje zabezpieczenia kluczem sprzętowym 😔

Jeśli hasła dotyczą tylko lokalnych systemów/baz – dobrym rozwiązaniem też może być przechowywanie bazy na udziale sieciowym. Jeśli ktoś chce – zawsze można korzystać z dysków zewnętrznych, ale to jest dosyć uporczywe, bo trzeba ciągle pamiętać o kopiowaniu najnowszej wersji pliku i posiadaniu jego kopii gdzieś indziej. Chmura sama w sobie to rozwiązuje. Jeśli komputer padnie – jest na chmurze. Jeśli chmura padnie – jest na dysku lokalnie. Poza tym mam kopię na dwóch komputerach, więc mogę spać spokojnie.

„dwustopniowe uwierzytelnienie powinno być skonfigurowana w miejscach, gdzie to jest możliwe oraz powinna być realizowana przez mechanizm, który umożliwia tworzenie kopii zapasowej”

W każdym szanującym się dzisiaj serwisie mamy możliwość korzystania z dwustopniowego uwierzytelniania (2FA, two-factor authentication) lecz większość ludzi z tego nie korzysta. BŁĄD. To jest mechanizm, który pozwala nam znacznie zwiększyć bezpieczeństwo w sieci. W skrócie działa to tak: wpisujemy login i hasło, następnie wpisujemy token (ciąg cyfr, najczęściej 6) z telefonu lub używamy klucza sprzętowego do potwierdzenia, że to naprawdę my chcemy się zalogować. Tokeny same w sobie są generowane na podstawie tajnego kodu przechowywanego przez aplikację oraz aktualnego czasu. Nie wymagają one połączenia z Internetem. W skrócie, musimy mieć ustawioną aktualną godzinę, w innym wypadku generowane tokeny nie będą działać. Odnosi się to do tokenów z aplikacji, nie z SMSów.

Korzystanie z tokenów na telefonie odbywa się przez wiadomości SMS lub aplikację i w drugim przypadku wymaga od nas jedynie posiadania telefonu z Androidem lub iOSem (sic!). Na telefonie musimy zainstalować odpowiedni program, następnie należy dodać metodę uwierzytelniania w postaci tokenu. Następnie należy aplikacją do tokenów zeskanować kod QR wyświetlany na ekranie lub podać tajny kod wygenerowany przez kreator do programu z tokenami. To doda możliwość generowania tokenów. Następnie taki token należy przepisać do okienka w kreatorze dodawania metody uwierzytelniania i voilà – gotowe.

Najpopularniejszą aplikacją do tokenów jest Google Authenticator, lecz ja osobiście polecam Authy. Google Authenticator nie posiada mechanizmu kopii zapasowej tajnych kodów, przez co jak zgubilibyśmy telefon, tracimy wszystkie tokeny i mamy problem. Duży problem. Z Authy takiego problemu nie ma, ponieważ tajne kody są przechowywane w chmurze. Aplikacja i tokeny w niej wyglądają mniej więcej tak:

Zrzut ekranu

Alternatywą jest klucz sprzętowy. Wpisujemy login i hasło, następnie musimy dotknąć klucz sprzętowy w odpowiednim miejscu lub podać kod PIN klucza. Przykład logowania do konta Google możecie zobaczyć poniżej:

Na innych serwisach możemy dostać nieco inny prompt, przykład z cloudflare.com:

Kopia takiego klucza jest realizowana w prosty sposób: po prostu na dwóch kluczach sprzętowych zapisuje się dokładnie ten sam klucz prywatny, klucz HMAC itd. Wtedy jeśli jeden przestaje działać, drugi dalej może być używany. Przy konfiguracji YubiKey zapisałem sobie plik tekstowy z kluczami, które znajdują się wewnątrz urządzenia. Dzięki temu będę mógł przepisać dane na kolejne urządzenie jeśli uszkodzę jakoś jeden klucz, a potem będę musiał kupić nowy, by zachować status 2 kluczy w jednym czasie. Klucz sprzętowy ma jedną zasadniczą wadę – można go łatwo zgubić. Warto więc przechowywać kopię klucza w bezpiecznym miejscu, a główny klucz w miejscu, które na pewno nie zniknie – ja trzymam go przy kluczach, bo tak na dobrą sprawę to jest taki trochę klucz, lecz elektroniczny. Ponadto używałbym takiego klucza tylko w sprzęcie, któremu ufam – nie wiem jakie oprogramowanie może pracować w czyimś komputerze i niekoniecznie chciałbym to testować.

najważniejsze pytanie – czy naprawdę nam jest to potrzebne?

To niegrzeczne, ale odpowiem pytaniem – a czy Tobie jest potrzebne bezpieczeństwo w sieci?

Definitywnie nie każdy musi mieć klucze sprzętowe. Nie powiem, że to jest bajer, to jest przydatna rzecz, ale nie każdy musi tak bardzo dbać o swoje bezpieczeństwo i to rozumiem. Jednak jak wspomniałem na początku, kradzież tożsamości z punktu widzenia ofiary to okropna rzecz i nikomu tego nie życzę. Dlatego moim zdaniem, dla własnego spokoju warto spędzić jeden lub dwa popołudnia przeglądając historię przeglądania Internetu w przeglądarce, spisać portale, na których się logujemy, utworzyć pęk kluczy, pozmieniać hasła do wszystkiego (na każdej stronie inne), zrobić kopię bazy kluczy i już jesteśmy bezpieczniejsi niż większość świata. To wymaga zaangażowania, ale nie wymaga wielkiego wysiłku, by o to zadbać.

Koniec końców trzeba sobie zadać pytanie – co bardziej się opłaca? Zmarnować trochę czasu na bawienie się w menedżera haseł i zmienianie haseł na trudniejsze, a potem ich kopiowanie przy logowaniu się do serwisów czy zmienianie ich po tym, jak ktoś w naszym imieniu wykorzysta naszych znajomych lub zrobi coś jeszcze gorszego i ten cały wstyd, który zostaje po całej sytuacji?

Odpowiedzcie sobie sami.

Zmiana typu interfejsu w VMware Workstation

W większości niestandardowych systemów takich jak np. FreeNAS VMware Workstation przy tworzeniu maszyny tworzy interfejs(y) sieciowe wykorzystując domyślnie sterownik e1000, który pozwala na wyciągnięcie 1 Gbit/s po stworzeniu sieci pomiędzy maszynami wirtualnymi/hostem. To jest problem, bo czasami jeśli chce się zrobić testy na iSCSI, sprzęt mamy wydajny i coś wolno działa. Generalnie ten sterownik jest problemem i jest proste rozwiązanie na zmianę tego sterownika na wydajny vmxnet3, który pozwala na wyciągnięcie na luzie 10 Gbit/s. Problem w tym, że nie każdy system to wspiera. W moim przypadku wiem, że wspiera.

Rozwiązanie jest proste: wystarczy znaleźć plik o formacie *.vmx dla naszej maszyny wirtualnej (w moim przypadku jest to maszyna freenas.vmx, edytować plik i zmienić zmienną ethernetX.virtualDev = "e1000" (X – numer interfejsu sieciowego) na ethernetX.virtualDev = "vmxnet3". To załatwia sprawę, ale trzeba pamiętać, że system wykryje te interfejsy jako nowe przechowując nadal starą konfigurację, więc trzeba się upewnić, że nie ma się w swoim systemie przypisanych żadnych ustawień do tych „starych” interfejsów.

Przykład pliku VMX przed:

.encoding = "windows-1250"
config.version = "8"
virtualHW.version = "18"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
pciBridge5.functions = "8"
pciBridge6.present = "TRUE"
pciBridge6.virtualDev = "pcieRootPort"
pciBridge6.functions = "8"
pciBridge7.present = "TRUE"
pciBridge7.virtualDev = "pcieRootPort"
pciBridge7.functions = "8"
vmci0.present = "TRUE"
hpet0.present = "TRUE"
nvram = "freenas.nvram"
virtualHW.productCompatibility = "hosted"
powerType.powerOff = "soft"
powerType.powerOn = "soft"
powerType.suspend = "soft"
powerType.reset = "soft"
displayName = "freenas"
guestOS = "freebsd-64"
tools.syncTime = "FALSE"
sound.autoDetect = "TRUE"
sound.fileName = "-1"
sound.present = "TRUE"
numvcpus = "8"
cpuid.coresPerSocket = "8"
memsize = "8192"
nvme0.present = "TRUE"
nvme0:0.fileName = "freenas.vmdk"
ide1:0.deviceType = "cdrom-image"
ide1:0.fileName = "V:\Roboczy!\ISO i appliance\TrueNAS-12.0-RELEASE.iso"
ide1:0.present = "TRUE"
usb.present = "TRUE"
ehci.present = "TRUE"
ethernet0.connectionType = "custom"
ethernet0.addressType = "generated"
ethernet0.vnet = "VMnet2"
ethernet0.displayName = "VMnet2"
ethernet0.virtualDev = "e1000"
ethernet4.connectionType = "custom"
ethernet4.addressType = "generated"
ethernet4.vnet = "VMnet6"
ethernet4.displayName = "VMnet6"
ethernet4.virtualDev = "e1000"
ethernet3.connectionType = "custom"
ethernet3.addressType = "generated"
ethernet3.vnet = "VMnet5"
ethernet3.displayName = "VMnet5"
ethernet3.virtualDev = "e1000"
ethernet2.connectionType = "custom"
ethernet2.addressType = "generated"
ethernet2.vnet = "VMnet4"
ethernet2.displayName = "VMnet4"
ethernet2.virtualDev = "e1000"
ethernet1.connectionType = "custom"
ethernet1.addressType = "generated"
ethernet1.vnet = "VMnet3"
ethernet1.displayName = "VMnet3"
ethernet1.virtualDev = "e1000"
ethernet0.present = "TRUE"
ethernet4.present = "TRUE"
ethernet3.present = "TRUE"
ethernet2.present = "TRUE"
ethernet1.present = "TRUE"
extendedConfigFile = "freenas.vmxf"
floppy0.present = "FALSE"
numa.autosize.cookie = "80082"
numa.autosize.vcpu.maxPerVirtualNode = "8"
uuid.bios = "56 4d 91 60 c6 03 50 e2-04 21 ed b1 0e 01 c7 7b"
uuid.location = "56 4d 91 60 c6 03 50 e2-04 21 ed b1 0e 01 c7 7b"
nvme0:0.redo = ""
pciBridge0.pciSlotNumber = "17"
pciBridge4.pciSlotNumber = "21"
pciBridge5.pciSlotNumber = "22"
pciBridge6.pciSlotNumber = "23"
pciBridge7.pciSlotNumber = "24"
usb.pciSlotNumber = "32"
ethernet0.pciSlotNumber = "192"
ethernet1.pciSlotNumber = "224"
ethernet2.pciSlotNumber = "256"
ethernet3.pciSlotNumber = "1184"
ethernet4.pciSlotNumber = "1216"
sound.pciSlotNumber = "38"
ehci.pciSlotNumber = "39"
vmci0.pciSlotNumber = "40"
nvme0.pciSlotNumber = "160"
svga.vramSize = "268435456"
vmotion.checkpointFBSize = "134217728"
vmotion.checkpointSVGAPrimarySize = "268435456"
vmotion.svga.mobMaxSize = "268435456"
vmotion.svga.graphicsMemoryKB = "262144"
ethernet0.generatedAddress = "00:0c:29:01:c7:7b"
ethernet0.generatedAddressOffset = "0"
ethernet1.generatedAddress = "00:0c:29:01:c7:85"
ethernet1.generatedAddressOffset = "10"
ethernet2.generatedAddress = "00:0C:29:01:C7:8F"
ethernet2.generatedAddressOffset = "20"
ethernet3.generatedAddress = "00:0C:29:01:C7:99"
ethernet3.generatedAddressOffset = "30"
ethernet4.generatedAddress = "00:0C:29:01:C7:A3"
ethernet4.generatedAddressOffset = "40"
vmci0.id = "234997627"
monitor.phys_bits_used = "45"
cleanShutdown = "TRUE"
softPowerOff = "TRUE"
usb:1.speed = "2"
usb:1.present = "TRUE"
usb:1.deviceType = "hub"
usb:1.port = "1"
usb:1.parent = "-1"
nvme0:4.fileName = "freenas-3.vmdk"
nvme0:1.fileName = "freenas-2.vmdk"
nvme0:3.fileName = "freenas-2.vmdk"
nvme0:2.fileName = "freenas-1.vmdk"
nvme0:2.redo = ""
nvme0:3.redo = ""
nvme0:1.redo = ""
nvme0:4.redo = ""
guestOS.detailed.data = "bitness='64' distroName='FreeBSD' familyName='FreeBSD' kernelVersion='12.2-RC3'"
checkpoint.vmState = ""
scsi0.virtualDev = "lsilogic"
scsi0.present = "TRUE"
scsi0:2.fileName = "freenas-1.vmdk"
scsi0:3.fileName = "freenas-2.vmdk"
scsi0:0.fileName = "freenas.vmdk"
scsi0:1.fileName = "freenas-0.vmdk"
scsi0:2.redo = ""
scsi0:1.redo = ""
scsi0:3.redo = ""
scsi0:0.redo = ""
scsi0.pciSlotNumber = "16"
scsi0:0.present = "TRUE"
ide1:0.startConnected = "FALSE"
scsi0:3.present = "TRUE"
scsi0:4.fileName = "freenas-3.vmdk"
scsi0:4.present = "TRUE"
scsi0:1.present = "TRUE"
scsi0:2.present = "TRUE"
scsi0:4.redo = ""
usb:0.present = "TRUE"
usb:0.deviceType = "hid"
usb:0.port = "0"
usb:0.parent = "-1"

Po zmianach:

.encoding = "windows-1250"
config.version = "8"
virtualHW.version = "18"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
pciBridge5.functions = "8"
pciBridge6.present = "TRUE"
pciBridge6.virtualDev = "pcieRootPort"
pciBridge6.functions = "8"
pciBridge7.present = "TRUE"
pciBridge7.virtualDev = "pcieRootPort"
pciBridge7.functions = "8"
vmci0.present = "TRUE"
hpet0.present = "TRUE"
nvram = "freenas.nvram"
virtualHW.productCompatibility = "hosted"
powerType.powerOff = "soft"
powerType.powerOn = "soft"
powerType.suspend = "soft"
powerType.reset = "soft"
displayName = "freenas"
guestOS = "freebsd-64"
tools.syncTime = "FALSE"
sound.autoDetect = "TRUE"
sound.fileName = "-1"
sound.present = "TRUE"
numvcpus = "8"
cpuid.coresPerSocket = "8"
memsize = "8192"
nvme0.present = "TRUE"
nvme0:0.fileName = "freenas.vmdk"
ide1:0.deviceType = "cdrom-image"
ide1:0.fileName = "V:\Roboczy!\ISO i appliance\TrueNAS-12.0-RELEASE.iso"
ide1:0.present = "TRUE"
usb.present = "TRUE"
ehci.present = "TRUE"
ethernet0.connectionType = "custom"
ethernet0.addressType = "generated"
ethernet0.vnet = "VMnet2"
ethernet0.displayName = "VMnet2"
ethernet0.virtualDev = "vmxnet3"
ethernet4.connectionType = "custom"
ethernet4.addressType = "generated"
ethernet4.vnet = "VMnet6"
ethernet4.displayName = "VMnet6"
ethernet4.virtualDev = "vmxnet3"
ethernet3.connectionType = "custom"
ethernet3.addressType = "generated"
ethernet3.vnet = "VMnet5"
ethernet3.displayName = "VMnet5"
ethernet3.virtualDev = "vmxnet3"
ethernet2.connectionType = "custom"
ethernet2.addressType = "generated"
ethernet2.vnet = "VMnet4"
ethernet2.displayName = "VMnet4"
ethernet2.virtualDev = "vmxnet3"
ethernet1.connectionType = "custom"
ethernet1.addressType = "generated"
ethernet1.vnet = "VMnet3"
ethernet1.displayName = "VMnet3"
ethernet1.virtualDev = "vmxnet3"
ethernet0.present = "TRUE"
ethernet4.present = "TRUE"
ethernet3.present = "TRUE"
ethernet2.present = "TRUE"
ethernet1.present = "TRUE"
extendedConfigFile = "freenas.vmxf"
floppy0.present = "FALSE"
numa.autosize.cookie = "80082"
numa.autosize.vcpu.maxPerVirtualNode = "8"
uuid.bios = "56 4d 91 60 c6 03 50 e2-04 21 ed b1 0e 01 c7 7b"
uuid.location = "56 4d 91 60 c6 03 50 e2-04 21 ed b1 0e 01 c7 7b"
nvme0:0.redo = ""
pciBridge0.pciSlotNumber = "17"
pciBridge4.pciSlotNumber = "21"
pciBridge5.pciSlotNumber = "22"
pciBridge6.pciSlotNumber = "23"
pciBridge7.pciSlotNumber = "24"
usb.pciSlotNumber = "32"
ethernet0.pciSlotNumber = "33"
ethernet1.pciSlotNumber = "34"
ethernet2.pciSlotNumber = "35"
ethernet3.pciSlotNumber = "36"
ethernet4.pciSlotNumber = "37"
sound.pciSlotNumber = "38"
ehci.pciSlotNumber = "39"
vmci0.pciSlotNumber = "40"
nvme0.pciSlotNumber = "160"
svga.vramSize = "268435456"
vmotion.checkpointFBSize = "134217728"
vmotion.checkpointSVGAPrimarySize = "268435456"
vmotion.svga.mobMaxSize = "268435456"
vmotion.svga.graphicsMemoryKB = "262144"
ethernet0.generatedAddress = "00:0c:29:01:c7:7b"
ethernet0.generatedAddressOffset = "0"
ethernet1.generatedAddress = "00:0c:29:01:c7:85"
ethernet1.generatedAddressOffset = "10"
ethernet2.generatedAddress = "00:0C:29:01:C7:8F"
ethernet2.generatedAddressOffset = "20"
ethernet3.generatedAddress = "00:0C:29:01:C7:99"
ethernet3.generatedAddressOffset = "30"
ethernet4.generatedAddress = "00:0C:29:01:C7:A3"
ethernet4.generatedAddressOffset = "40"
vmci0.id = "234997627"
monitor.phys_bits_used = "45"
cleanShutdown = "TRUE"
softPowerOff = "TRUE"
usb:1.speed = "2"
usb:1.present = "TRUE"
usb:1.deviceType = "hub"
usb:1.port = "1"
usb:1.parent = "-1"
nvme0:4.fileName = "freenas-3.vmdk"
nvme0:1.fileName = "freenas-2.vmdk"
nvme0:3.fileName = "freenas-2.vmdk"
nvme0:2.fileName = "freenas-1.vmdk"
nvme0:2.redo = ""
nvme0:3.redo = ""
nvme0:1.redo = ""
nvme0:4.redo = ""
guestOS.detailed.data = "bitness='64' distroName='FreeBSD' familyName='FreeBSD' kernelVersion='12.2-RC3'"
checkpoint.vmState = ""
scsi0.virtualDev = "lsilogic"
scsi0.present = "TRUE"
scsi0:2.fileName = "freenas-1.vmdk"
scsi0:3.fileName = "freenas-2.vmdk"
scsi0:0.fileName = "freenas.vmdk"
scsi0:1.fileName = "freenas-0.vmdk"
scsi0:2.redo = ""
scsi0:1.redo = ""
scsi0:3.redo = ""
scsi0:0.redo = ""
scsi0.pciSlotNumber = "16"
scsi0:0.present = "TRUE"
ide1:0.startConnected = "FALSE"
scsi0:3.present = "TRUE"
scsi0:4.fileName = "freenas-3.vmdk"
scsi0:4.present = "TRUE"
scsi0:1.present = "TRUE"
scsi0:2.present = "TRUE"
scsi0:4.redo = ""
usb:0.present = "TRUE"
usb:0.deviceType = "hid"
usb:0.port = "0"
usb:0.parent = "-1"

Tak wyglądają prędkości po zmianie w iperf:

Dopisanie adresu konsoli ShadowControl do instalatora agenta

Dzięki programowi Orca można osiągnąć taki efekt, że w trakcie kreatora instalacji nie trzeba podawać adresu serwera ShadowControl przy instalacji agenta, ponieważ może on być zapisany wewnątrz instalatora i wygląda to tak:

Dzięki temu można zainstalować agenta i po instalacji on sam się podepnie do konsoli. Program Orca możemy znaleźć w Windows 10 SDK – wystarczy przy instalacji zaznaczyć opcję MSI Tools i nic innego. Dzięki temu w folderze Windows 10 SDK będziemy mieć instalator do Orca:

Wystarczy przejść instalator i będziemy mieli program Orca na swoim komputerze. Po tym należy go otworzyć, przeciągnąć na niego instalator ShadowControl, a następnie wybrać po lewej pole Property, a następnie kliknąć na środku na wolne pole PPM i wybrać opcję Add row…

Następnie w polu Property należy zdefiniować APPL_ADDR i w polu Value wpisać adres IP lub FQDN naszej konsoli ShadowControl. Po tym zapisujemy i w File > Save nasz plik instalacyjny.

Po tym taki instalator możemy zainstalować przez GPO lub przez np. polecenie msiexec:

msiexec /qn /package ShadowControl_Installer.msi

Wymuszanie wykorzystywania lokalnego magazynu certyfikatu w Firefoxie przez GPO

To jest całkiem przydatna rzecz, szczególnie w 2 przypadkach: mamy wdrażane vCenter i chcemy mieć zaufane wszystkie certyfikaty lub wdrażamy SSL deep inspection. Do tego niektórzy używają Firefoxa i tego nie jesteśmy w stanie przeskoczyć, więc pozostaje nam spróbować wymusić ustawienia przez GPO. Takich ustawień nie ma domyślnie w GPO, ale możemy wykorzystać pliki ADMX, które nam dodają specjalne ustawienia w przeglądarkach. Do Firefoxa plik ADMX znajduje się na stronie getadmx.com i to wykorzystamy. Klonujemy repo, w którym są te ustawienia, otwieramy katalog SYSVOL na naszym kontrolerze domeny (pod adresem //domena.local/SYSVOL lub //kontroler-domeny/SYSVOL, np. //serba.local/SYSVOL lub //dc1.serba.local/SYSVOL), w nim otwieramy folder o nazwie naszej domeny (w moim przypadku serba.local), w nim tworzymy folder PolicyDefinitions i wklejamy tam folder o nazwie języka + pliki ADMX, które znajdują się w folderze. Z faktu, że nie ma języka polskiego – kopiuję folder en oraz pliki *.admx.

Folder PolicyDefinitions istnieje także w C:/Windows/PolicyDefinitions. Takie tworzenie folderu w SYSVOL dla definicji polityk GPO jest określane jako Central Store. Poza samymi zmienionymi politykami powinniśmy skopiować wszystko, co jest we wspomnianym folderze systemowym do //serba.local/SYSVOL/serba.local/PolicyDefinitions. Dzięki temu wszystkie opcje w GPO będą trzymane w jednym miejscu, co jest istotne w przypadku posiadania wielu kontrolerów domeny. Dlatego też nie polecam wrzucania 3rd party plików ADMX do lokalnego folderu – w przyszłości jeśli będzie się miało drugi kontroler domeny to ten nie będzie wiedział w ogóle co znaczą te polityki i one mogą nam nie działać.

Następnie w GPO tworzymy nowy obiekt (nazwałem go firefox use local ca store), następnie rozwinąłem w Konfiguracja komputera > Zasady > Szablony administracyjne: definicje zasad (pliki ADMX) pobrane z komputera lokalnego > Mozilla > Firefox > Certificates i włączamy opcję Import Enterprise Roots.

Po tym wystarczy podłączyć taką politykę i wymusić aktualizację zasad grupy:

Po aktywowaniu, jak sama polityka wskazuje zmiany są stosowane nawet jeśli przeglądarka była zainstalowana po wprowadzeniu polityki, ponadto użytkownik nie może zmienić wskazanego ustawienia:

Jak się nie nabrać na internetowych złodziei przedmiotów w grach online

Ten poradnik adresuję wszystkim osobom, które mówiąc krótko nie znają się dobrze na IT i nie wiedzą jak sobie poradzić z potencjalnym scamem. W tym nie ma nic wstydliwego, że ktoś nie jest dobrze zorientowany, jest tyle dziedzin wiedzy na których można się znać, że jak dla mnie to jest naturalne. Poza tym zdaję sobie z tego sprawę, że niektórzy starzy wyjadacze czasami nawet są w stanie się nabrać na scam. Skupię się nad stronkami do przedmiotów w Team Fortress 2 i Counter Strike: Global Offensive, ale ogólnie wzorzec próby nabrania użytkownika jest mniej więcej ten sam.

Wygląda on tak: ktoś nas dodaje do znajomych i oferuje łatwy zarobek i podsyła nam linka do strony internetowej. Zwykle to jest strona z przedmiotami i łatwym zarobkiem, lecz by dostać jakiś bonus/premię/cokolwiek innego należy się zalogować. Po zalogowaniu często nic się nie dzieje ale strona przenosi użytkownika na główną i tyle z tego było, a po kilku minutach przedmioty znikają. Jesteśmy wściekli, że akurat nam się to przytrafiło, a najgorsze jest to, że to tylko z naszej winy tak jest.

Poniżej lista rzeczy, na którą należy zwracać uwagę. Jeśli strona, na którą wchodzisz spełnia przynajmniej jeden punkt z listy – raczej bym na nią nie wchodził. Kolejność punktów jest przypadkowa – piszę wszystko na bazie własnego doświadczenia i moim zdaniem każdy punkt jest ważny.

1. Brak certyfikatu SSL

Jeśli strona do trade’ów lub jakichś interesów nie posiada certyfikatu SSL w 2020 roku to nie jest bezpieczna. W przypadku takich stron jak logs.tf ze zrzutu ekranu to nie jest problem, poza tym logs.tf obsługuje SSL, ale nie przekierowuje na niego automatycznie. Na logs.tf są prezentowane informacje o meczach, a nie wymienia się przedmioty w grze, które mogą być warte czasem nawet tysiące złotych, więc to nie jest aż tak istotne. Tak czy siak strona bez certyfikatu SSL pozwala na przechwycenie danych w trakcie komunikacji i tutaj nie tylko scammer miałby nasze dane logowania w przypadku ich podania, lecz w sumie każdy, kto chciałby podsłuchać ruch.

W drugą stronę nie można też myśleć, że certyfikat SSL oznacza 100% bezpieczeństwa – w dzisiejszych czasach certyfikat SSL można wygenerować za darmo za pomocą takich usług jak np. Let’s Encrypt. Certyfikat chroni nas przed podsłuchaniem komunikacji pomiędzy pomiędzy naszym komputerem a serwerem, z którym się łączymy, ale nie chroni nas przed tym, co wewnątrz tej komunikacji się dzieje.

2. Krótki czas istnienia domeny

Domena to nazwa strony, na którą wchodzimy. W moim przypadku to jest supra.tf. Ta strona jako it.supra.tf jest subdomeną supra.tf. Tak czy siak, to co może sprawić, że dana domena może być próbą oszustwa to, że strona powstała na przykład kilka dni temu. Nie wiadomo, czy interesy, które oferuje są legalne i czy tą korzyść z interesów będziemy mieć, czy tylko będzie mieć z nich twórca strony 😂

Dzięki stronie z obrazka powyżej możemy sprawdzić jak długo dana domena istnieje. Dzisiaj dostałem linka od kolegi (pozdro MattJ) ze strony, która jest potencjalnie scamem i mam też jeden zapisany adres w zanadrzu, więc zrobimy sobie szybkie dwa testy. Test jest prosty – wpisujemy adres strony i sprawdzamy datę założenia domeny. Po wpisaniu strony klikamy Search, zatwierdzamy CAPTCHA…

Celowo robię zrzut ekranu z zegarkiem – ta domena to oczywisty scam w tym przypadku domeny tf-market.fun:

Jak widać – została założona tego samego dnia, co na zrzucie ekranu. Strony ze scamem są wyłapywane bardzo szybko, czasami to jest kwestia godzin i strona jest globalnie oznaczona jako potencjalny scam. W dodatku, strona została założona na stronie REG.RU. Nie wiem dlaczego, ale z jakiegoś powodu często te strony scamowe są zarejestrowane właśnie u tego rejestratora, co to może być? 🤔

Drugi przykład to domena csgo-inventory.icu. Dostałem ją od innego kolegi (pozdro Stan) i wykonałem taki sam test:

Efekt podobny – stronka, która istnieje cały 1 dzień.

3. Strona oznaczona jako potencjalna próba oszustwa

Może to zabrzmi idiotycznie, ale jeśli przeglądarka wyświetla ekran na czerwono i próbuje Cię uświadomić, by na stronę nie wchodzić – to po prostu nie wchodź. Strona z drugiego przypadku została w ciągu 12 godzin oznaczona jako scam w Google Safe Browsing, co spowodowało, że Firefox po otwarciu strony pokazał mi coś takiego:

Z faktu, że mam ESETa na komputerze to po zignorowaniu komunikatu z Firefoxa dodatkowo zobaczyłem jego komunikat:

Po zignorowaniu komunikatu ESETa dostałem kolejny komunikat (tym razem z Cloudflare (ten przypadek jest dosyć zabawny, bo dzięki Cloudflare także można mieć certyfikaty za darmo + można mieć darmową usługę Anti-DDOS i właściciel domeny ją włączył, co okazało się dla niego zgubne – to ten komunikat wyświetli się każdemu użytkownikowi bez względu na przeglądarkę)):

Chrome też zrobił swoje:

Poza tym możemy sprawdzać listy ze stronami scamerskimi. Na tej stronie znajdziemy dosyć aktualną listę scam stronek do CS:GO. Dosyć wymowne jest to, że jak po pominięciu ostrzeżenia wejdziemy na stronkę to ta jest pusta – to jest coś w stylu akcji damage control, czyli w skrócie im mniej osób zobaczyło jak wygląda strona będąca scamem tym większa szansa, że ktoś się na to nabierze.

4. Strona logowania jest w języku angielskim

To MOŻE tworzyć podejrzenia scamu, ale nie musi. Bo co, jeśli ktoś używa anglojęzycznego systemu operacyjnego? By zrozumieć problem, muszę nieco lepiej wyjaśnić w jaki sposób przeglądarki wyświetlają nam strony internetowe w konkretnym języku.

Ogólnie przeglądarka posiada coś takiego jak user agent. User agent określa język contentu, który pobieramy. Domyślnie przeglądarki sprawdzają jaki język jest ustawiony w systemie operacyjnym, w którym działa i ustawia w user agencie język systemowy – w moim przypadku polski. To powoduje, że jeśli wejdę na jakąś wielojęzyczną stronę, moja przeglądarka w moim imieniu poprosi o zawartość w języku polskim jeśli to jest możliwe. Jeśli jest – dostanę stronę po polsku, jeśli nie, dostanę stronę w domyślnym języku (prawie zawsze angielski). Jesteśmy w stanie sami zmieniać ustawienia user agenta. User agent przesyła także informacje o używanej przeglądarce, dzięki czemu strona wie, że ją przeglądamy za pomocą Opery, Google Chrome, Mozilli czy czegokolwiek innego. Tym też można manipulować za pomocą wtyczek typu User Agent Switcher w Chrome czy User-Agent Switcher w Firefoxie. Bez wtyczek ustawimy sam język i w Chrome można to zrobić tutaj:

W Firefoxie mamy to tutaj:

Stronka ze scamem będzie się wyświetlać w języku angielskim bez względu na wszystko. Strona logowania Steama dopasowuje się do języku, można zobaczyć to tutaj:

Jeśli nie jestem zalogowany efekt jest ten sam:

5. Podrabianie ekranu logowania

Ten punkt moim zdaniem jest najważniejszy ze wszystkich, bo najłatwiej wyczuć tutaj scam. Ten ekran logowania wygląda jak zwykły ekran logowania, ale nim nie jest. Po pierwsze nie ma informacji o tym, że ta strona nie jest powiązana ze Steamem ani Valve (tak jak na zrzucie ekranu wyżej z etf2l.org), po drugie adres strony na stronie logowania to dalej ta strona.

Tak wygląda stronka ze scamem
Tak wygląda prawdziwa stronka

Mechanizm działania jest prosty – po wpisaniu loginu i hasła na scam stronce ta próbuje w Twoim imieniu się zalogować Twoim loginem i hasłem (Ty tego nie widzisz, to się dzieje na serwerze strony internetowej w tle) i jeśli wpisałeś złe dane – dostaniesz na tej stronie taki sam komunikat (świadczący o tym, że po prostu wpisałeś nieprawidłowe dane). W innym przypadku jeśli wpiszesz dobre dane logowania to strona poprosi Cię o kod ze Steam Guarda i jeśli go podasz to tak samo serwer w Twoim imieniu się zaloguje na te konto i jeśli mu się uda – zapisze Twoje dane logowania do bazy danych, a potem spróbuje automatycznie zmienić maila i przenieść Twoje przedmioty na jakieś inne konto, z którego będzie przedmioty przenosić na różne, by potem móc je szybko i tanio sprzedać na rynku.

Logowanie się na stronach poprzez konto Steam opiera się o mechanizm pojedynczego logowania OpenID. Wcześniej logujesz się na swoje konto na Steamie (np. na https://steamcommunity.com/) i potem wchodząc na stronę wystarczy, że klikniesz Zaloguj, jak w przypadku na dole (na scam stronce nigdy takiego przycisku nie będzie nawet jeśli na drugiej karcie jesteś zalogowany na Steamie):

Po zatwierdzeniu Steam wysyła do strony numer ID konta użytkownika, po to, by poświadczyć, że użytkownik o takim ID poprawnie się zalogował. Strona, która korzysta z logowania (np. backpack.tf) dostaje jedynie ID użytkownika i nic więcej. Poza ID może próbować pobierać dane użytkownika z publicznego profilu Steam (o ile jest publiczny). Jeśli nie jest to strona się nie dostanie np. do naszej listy przedmiotów czy statystyk o grach (np. czas spędzony w konkretnej grze). Normalna strona nigdy nie dostaje żadnego loginu ani hasła, dzięki czemu jesteśmy bezpieczniejsi, jeśli logujemy się naprawdę na Steama, a nie spreparowaną stronę.

Ciekawostka: to, co właśnie napisałem jest też napisane na ekranie logowania ze steamcommunity.com:

Ponadto, w przypadku logowania się na Steamie można sprawdzić certyfikat – zawsze będzie pokazywał to, że jest wystawiony na Valve Corp. [US]:

Jeśli tego nie ma lub strona ma wystawiony certyfikat SSL przez Let’s Encrypt – to nie jest strona prawdziwego Steama.

Jest jeszcze jedna opcja scamu i polega ona na tym, że po kliknięciu przycisku Zaloguj przez Steam pojawia nam się nowe okienko z ekranem logowania. W niej adres jest poprawny i ekran wygląda tak samo jak normalny…ale jednak nie do końca. Posiłkując się obrazkami z tej strony można zobaczyć dodatkowe dwie opcje scamu:

Pierwsza to okienko, w którym nie możemy kliknąć na kłódkę certyfikatu, by sprawdzić kto certyfikat wystawił. Druga to jest to, że tym popupem nie jesteśmy w stanie wyjść poza okno przeglądarki, więc na dobrą sprawę ten popup ma imitować takie konto przeglądarki, tyle, że zmniejszone.

Drugi przypadek to stronka, który ma adres about:blank. Myślę, że sprawa tutaj jest oczywista.

03-about-blank-popup.png

Handel z innymi graczami na Steamie – czy ta osoba jest w porządku?

Pod tym kątem polecam wtyczki do przeglądarek, które automatycznie wyświetlają informacje o potencjalnych banach za scam na popularnych stronkach. Tak, każdy zaleca, by zawsze sprawdzać tradera na steamrep.com, ale szczerze czy ktoś to dzisiaj robi? Ja to robiłem ostatni raz w 2014 roku może. Tak czy siak dzięki takim wtyczkom nie musimy na te strony wchodzić, bo wszystko jest na tacy – tutaj widać recydywistę pod kątem scamowania. Wtyczka, o której cały czas mówię to Augumented Steam – jest dostępna na Chrome i Firefoxie. Ten plugin ma wiele innych zalet – ułatwia sprzedaż przedmiotów, od razu dodaje przyciski do sprzedawania przedmiotów na Steam Market o jeden grosz taniej, liczy ilość przedmiotów w trakcie tworzenia oferty wymiany i sprawdza zbliżoną wartość przedmiotów itd. Ogólnie warto z tego korzystać. Co do wymian, wtyczka to Steam Economy Enhancer.

Przepraszam, ale przypadkiem Cię zgłosiłem do moderatorów Steama, musisz pogadać z moderatorem by Ci się nic nie stało.

Moderatorzy Steama są zamiennie z supportem Steama w tej śpiewce.

To jest stara głupia śpiewka, czyli jakaś losowa osoba z Internetu sugeruje, że coś może się stać z Twoim kontem nie mając pojęcia z kim ma się do czynienia. W takiej sytuacji sugeruję od razu zablokować użytkownika na Steamie i się w ogóle nie patyczkować. Support Steama NIGDY nie napisze do Ciebie niczego z prywatnego konta. Support Steam zawsze będzie się kontaktował z Tobą przez specjalny system wiadomości. Ponadto, za każdym razem gdy otrzymujesz wiadomość od supportu możesz ją zobaczyć na swoim mailu oraz Steam wyświetla specjalne powiadomienie, które tego dotyczy. Jeśli nie jesteś osobą, która robi dużo dla społeczności jakiejś gry to szanse na to, że rozmawiasz z osobą będącą pracownikiem Valve na Steamie na czacie prywatnym to prawie 0%.

Ogólnie jedyna forma, w której support Steama może odpowiedzieć jest widoczna tutaj (dostaje się na Steamie specjalne powiadomienie):

Ponadto miejsce dyskusji wygląda zupełnie inaczej niż taki zwykły czat:

Ponadto wysłanie do nas odpowiedzi w zgłoszeniu przez support Steama powoduje informację o tym na mailu:

Dla przykładu ten sam plugin, o którym wspominałem wcześniej (Augumented Steam) wyświetla też informację o tym, że ktoś jest pracownikiem Valve (przydaje się pod kątem podszywania za pracowników):

Chcę, byś promował(a) moją stronę, daję za to kasę/metal, pomożesz mi?

Kolejna próba chamskiego scamu. Sytuacja jest prosta: ktoś zaprasza Cię do znajomych i prosi o reklamę jego „nowej strony”. Często ta strona, która ma być reklamowana jest stronką, w stylu tych, które prezentowałem wcześniej w tym poście, czyli taka udająca jakieś jackpoty, loterie, ruletki itd., gdzie w praktyce jedyne, co jest istotne to dane logowania do Twojego konta. Pod żadnym pozorem nie reklamuj stron, których nie znasz – w ten sposób nie wkopiesz swoich znajomych lub fanów (jeśli ich masz).

Poniżej przykład takiej konwersacji dzięki uprzejmości Nucleone – przy okazji jak widać Nucle nie dał tanio skóry sprzedać:

Potrzebujemy piątego do teamu, gramy w ligach i turniejach. Dołączysz do nas? Zarejestruj się tutaj.

Tutaj scam polega na tym, że po prostu ktoś próbuje nas namówić na to, byśmy się zalogowali przez stronkę pod przykrywką jakiegoś teamu. Fake grupka, gość unika podania prawdziwych linków do teamu i próbuje przekonać za wszelką cenę, bym się zarejestrował. Na stronie była spreparowana stronka do logowania (jak w przykładach wcześniej).

„nie mogę Cię dodać do znajomych, dodasz mnie?”

Odpowiedź powinna być jednoznaczna: NIE. Jeśli ktoś chce Cię zaprosić i ma do Ciebie sprawę to Cię zaprosi. Takie coś jest najczęściej robione po to, by nie budzić podejrzeń gracza, bo ktoś się odezwał w bardziej wymowny sposób niż po prostu same zaproszenie, które normalnie byśmy odrzucili, bo widać, że np. konto jest niedawno utworzone lub jest prywatne.

Jak dokopać takim oszustom?

Krótko – zgłosić ich do Google Safe Browsing. Wchodząc na tą stronę podajemy adres strony z potencjalnym scamem i dodatkowe informacje o stronie (tak jak ja poniżej) i wysyłamy.

Po tym nam Google dziękuje i zostanie czekać.

Na koniec chciałem tylko dodać, że w trakcie pisania tego poradnika znalazłem inny pod kątem scamów, który jest na steamrep.com, wygląda nieźle!

Zmiana wyglądu w stronach bez dark mode z użyciem Stylish

Niektóre strony nie mają wbudowanego trybu ciemnego (aka dark mode) i przez mój światłowstręt cierpię o 2 w nocy. Z pomocą przychodzi plugin Stylish, który można wykorzystywać w przeglądarkach Google Chrome (i wszystkich innych bazujących na Chromium) i Mozilla Firefox. Dzięki temu strona zamiast wyglądać tak:

może wyglądać tak:

Pokażę jak taki efekt uzyskać na przykładzie stron https://tf2pickup.pl oraz https://hl.tf2pickup.pl.

Google Chrome (i inne przeglądarki oparte o Chromium)

Na początku trzeba wejść na tę stronę i kliknąć Dodaj do Chrome, a następnie w komunikacie kliknąć Dodaj rozszerzenie.

Mozilla Firefox

Wchodzimy na tę stronę i klikamy na Dodaj do Firefoksa, a następnie zatwierdzamy klikając Dodaj.

Opera

Wchodzimy na tę stronę i klikamy na Dodaj do Opery. Na Operze akurat instalujemy program, który bazuje na Stylishu, lecz docelowo działa tak samo.

Następne kroki

Po dodaniu należy wejść na stronę, której wygląd chcemy zmienić, kliknąć ikonkę Stylisha i zaakceptować warunki korzystania wtyczki.

Potem możemy zainstalować skin dla danej strony, ale aktualnie nie ma żadnych opublikowanych, więc po prostu dodamy nowy. Klikamy na przycisk opcji u góry okienka wtyczki i Create New Style.

W przypadku Opery ze Stylusem należy kliknąć na ikonkę wtyczki, a następnie na link pod Napisz styl dla. Wtedy otworzy nam się to samo, co w innych przeglądarkach.

Otworzy nam się nowe konto, w którym musimy zdefiniować wygląd skina. Na górze, po lewej wpisz nazwę skina (w moim przypadku tf2pickup.pl), następnie zaznacz Enabled pod nazwą. Teraz w sekcji *Code 1 wklej kod, którym zmieniasz wygląd strony (mój kod poniżej):

body {
    background-color: #222 !important;
}
nav.navbar {
    background-color: #333 !important;
    color: #f8f9fa !important;
}
a.nav-link {
    color: #f8f9fa !important;
}
.list-group-item {
    background-color: #333 !important;
    border: 1px solid #111 !important;
    color: #f8f9fa !important;
}
.list-group-item.list-group-item-action, .queue-slot-item.free {
    background-color: #333 !important;
    border: 1px solid #111 !important;
    color: #f8f9fa !important;
}
.queue-slot-item.taken {
    border: 1px solid #111 !important;
}
footer {
    background-color: #333 !important;
}
markdown {
    color: #f8f9fa !important;
}
div.bg-light {
    background-color: #333 !important;
}
span.mt-1.font-weight-bold {
    color: #f8f9fa !important;
}
span.mb-1 {
    color: #f8f9fa !important;
}
span.text-secondary.font-italic.mb-2 {
    color: #f8f9fa !important;
}
button.btn.btn-sm.pre-ready-up-btn.btn-primary {
    background-color: #f8f9fa !important;
    color: #111 !important;
}
h4.text-center.mx-2 {
    color: #f8f9fa !important;
}
div.col {
    color: light !important;
}
h4 {
    color: #f8f9fa !important;
}
span.font-italic.text-muted {
    color: #f8f9fa !important;
}
li.page-item.disabled {
    color: #f8f9fa !important;
}
a.page-link {
    color: #f8f9fa !important;
    background-color: #333 !important;
}
span.font-italic.text-muted {
    color: #f8f9fa !important;
}
label.col-4.col-form-label {
    color: #f8f9fa !important;
}
.modal-content{
	background-color: #333 !important;
    color: #f8f9fa !important;
}
a.text-dark {
    color: #aaaaaa !important;
}
div.row.text-muted {
    color: #aaaaaa !important;
}
div.row {
    color: #f8f9fa !important;
}
span.badge.badge-light.ml-2.team-score
{
    background-color: #6c757d !important;
    color: #f8f9fa !important;
}
h5 {
    color: #f8f9fa !important;
}
h6.mt-5 {
    color: white !important;
}
datatable-header-cell.resizeable.sort-active.sort-asc.sortable {
    color: #f8f9fa !important;
}
div.datatable-body-cell-label {
    color: #f8f9fa !important;
        width: 100px !important;
text-align: center;
}
datatable-header-cell.datatable-header-cell.resizeable.sortable {
    width: 100px !important;
    text-align: center;
}
div.datatable-header-cell-template-wrap {
    color: #f8f9fa !important;
    width: 100px !important;
    text-align: center;
}
datatable-body-cell.sort-active {
    width: 100px !important;
    text-align: center;
}

W praktyce to wygląda tak:

Na końcu na samym dole jest coś takiego jak Applies to: Everything. Kliknij przycisk Specify, wybierz z listy URLs on the domain i wpisz tf2pickup.pl.

Na końcu pod nazwą stylu kliknij Save. W ten sposób masz zmieniony wygląd strony: