Jest jakaś opcja żeby zablokować możliwość łączenia się do mojego serwera innych klientów niż moja aplikacja mobilna?
Chcę uniknąć ataków fałszywych klientów (aplikacja na androida)
Administratorem nie jestem i nie chciałbym Cie wprowadzić w błąd ale z tego co wiem, problem można rozwiązać w następujący sposób:
-
Na serwerze konfigurujesz firewalla (np. iptables) tak aby można się było połączyć tylko z sieci prywatnej na wybranych adresach IP.
-
Konfigurujesz wirtualną sieć prywatną (VPN).
-
Konfigurujesz połączenie w systemie Android tak aby łączył się do wirtualnej sieci prywatnej.
W takiej sytuacji dostęp do Twojego serwera powinien odbywać za pośrednictwem sieci prywatnej, do której trzeba być zalogowanym.
Co do sieci prywatnej może być ciężko, bo będzie to aplikacja ogólnodostępna i dostęp do serwera musi być z każdego miejsc na świecie.
Użytkownik też nic nie powinien musieć zrobić oprócz instalacji aplikacji
volau napisał(a):
Co do sieci prywatnej może być ciężko, bo będzie to aplikacja ogólnodostępna i dostęp do serwera musi być z każdego miejsc na świecie.
Użytkownik też nic nie powinien musieć zrobić oprócz instalacji aplikacji
Rzeczywiście trochę to komplikuje sprawę. Powiem tak: nie jestem specem od sieci, ale wydaje mi się, że można serwery HTTP skonfigurować tak aby wymagane były certyfikaty klienta. Mógłbyś po prostu taki certyfikat klienta zawrzeć w swojej aplikacji i wtedy Twoja aplikacja łączyłaby się z użyciem tego certyfikatu (inni klienci tego certyfikatu nie powinni mieć więc być może da się samą aplikację Android jakoś dodatkowo zaszyfrować żeby nie dało się wyciągnąć z niej certyfikatu). Na ile jest to bezpieczne to nie wiem, ale zawsze to jakaś propozycja.
Niestety tak jak wspomniałem wyżej nie jestem specem od sieci i nie wiem na ile to wszystko ma sens co tutaj pisze. Być może powinieneś zapytać na forach gdzie siedzi więcej administratorów typu webhostingtalk?
Jeśli mowa o zwykłym niskopoziomowym serwerze TCP (bo tak napisałeś w tytule wątku), przy twoich założeniach to jest niemożliwe od początku. Przy tworzeniu połączenia TCP wszystko co wie serwer to adres IP klienta i nic więcej, więc jeśli potrzebujesz dostępu z całego świata (czyli firewall na IP nie wchodzi w grę), to nie tędy droga. Musisz szukać czegoś na warstwie wyżej (jakiś klucz w headerze HTTP np.), ale pamiętaj, że i tak ostatecznie apkę mobilną można zdekompilować, podejrzeć ruch sieciowy itp. więc nie da się całkowicie przed tym zabezpieczyć z definicji.
Z tego co wiem to niestety nie da się ukryć certyfikatu zawartego w apce, 7-zip radzi sobie z rozpakowaniem pliku apk bez najmniejszych problemów
Dokładnie klucz w headerze też nic mi nie da.
OK, ale czy nie uważasz, że może lepiej byłoby pójść trochę inną drogą i po prostu zabezpieczyć serwer w taki sposób aby nie miało to znaczenia, który klient korzysta z Twojego API?
tk napisał(a):
OK, ale czy nie uważasz, że może lepiej byłoby pójść trochę inną drogą i po prostu zabezpieczyć serwer w taki sposób aby nie miało to znaczenia, który klient korzysta z Twojego API?
Ogólnie jest zabezpieczony, tzn nie ma dla niego różnicy czy jest to moja apka czy inny klient ale chciałem uniknąć "dzikich" klientów.
W jakim celu zatem chciałbyś tak właściwie wprowadzać dodatkowe zabezpieczenie?
Co jest złego w "dzikich" klientach?