Jakie są najlepsze praktyki zabezpieczania internetowego interfejsu API?

15

Muszę zbudować interfejs API usługi sieci Web, aby nasza aplikacja mobilna mogła współpracować z naszym serwerem i bazą danych (w ASP.Net MVC 4, ale to nie jest istotne). Jeśli większość działań nie wymaga rejestracji użytkowników w naszym serwisie, chcielibyśmy ograniczyć dostęp tylko do użytkowników naszej aplikacji.

Jakie są metody upewnienia się, że połączenia wykonane gdzie indziej (np. Ktoś, kto chce wszystkich naszych danych lub zbudowanie nieoficjalnej aplikacji) są odrzucane?

Moim początkowym pomysłem jest, aby urządzenie poprosiło serwer o token, który jest losowo generowany i wysyłany w niezmienionej postaci. Wszystkie pozostałe metody sprawdzą, czy nagłówki żądań zawierają określony, który będzie skrótem md5 solonego tokena. Serwer zna token i sól i jest w stanie obliczyć skrót i porównuje go z wysłanym. Ponadto token ma ograniczoną żywotność, a urządzenie musi otrzymywać kolejne co drugą godzinę.

Wydaje się to dość łatwe do wdrożenia i chociaż prawdopodobnie nie w 100% dowód, wydaje się to dobrym pomysłem. Co myślisz?

Antoine
źródło

Odpowiedzi:

15

Gdy tylko wydasz aplikację, może zostać poddana inżynierii wstecznej. Oznacza to, że nie można nic zrobić, aby być w 100% chronionym, jeśli ta sama aplikacja (te same pliki binarne, te same ustawienia) jest dystrybuowana do wszystkich użytkowników.

Jeśli możesz dostosować aplikację dla każdego użytkownika, może nie będziesz mógł zabronić innej aplikacji korzystania z interfejsu API, ale przynajmniej ograniczy tę aplikację do liczby żądań, które może ona wykonać w interfejsie API.

Wyobraź sobie następujący schemat:

  1. Klient łączy się i wysyła swój unikalny identyfikator (jeden identyfikator użytkownika).
  2. Serwer odpowiada wysyłając wyzwanie zaszyfrowane kluczem publicznym. Ten klucz publiczny jest powiązany z wcześniej wysłanym unikalnym identyfikatorem.
  3. Klient rozwiązuje wyzwanie, odszyfrowując dane za pomocą klucza prywatnego i wysyłając odszyfrowany klucz tajny z powrotem na serwer.
  4. Serwer sprawdza, czy przesłany klucz tajny odpowiada pierwotnie wygenerowanemu.

Deweloper, który zhakuje Twoją aplikację i uda się uzyskać klucz prywatny, będzie mógł korzystać z interfejsu API z własnej aplikacji, ale będzie identyfikował się z Twoim serwerem.

Jeśli ten sam użytkownik może wykonać 10 000 żądań do interfejsu API dziennie i średnio, aktywny użytkownik wysyła 2 000 żądań dziennie, oznacza to, że ten programista będzie mógł korzystać z własnej aplikacji i być może przekazać ją znajomym, ale nie byłby w stanie, powiedzmy, sprzedać go tysiącom ludzi, tylko dlatego, że zadziała tylko przez kilka minut rano.

Chociaż to pomaga, nie jest to również 100% dowód. Co się stanie, jeśli haker znajdzie sposób na wyodrębnienie klucza prywatnego z aplikacji, gdy na urządzeniu zainstalowana jest jego własna aplikacja?


Uwaga dodatkowa, która nie odpowiada na twoje pytanie, ale może być przydatna: nie myśl o interfejsie API jako narzędziu dla podstawowego produktu (aplikacji mobilnej). Pomyśl o tym jako o samym produkcie pierwszej klasy, produkcie , za który można zapłacić. Ten sam model jest używany od lat przez Amazon i Google, zaczyna być aktywnie wykorzystywany przez Microsoft z platformą Azure itp.

Gdy tylko uznasz, że interfejs API nie jest narzędziem wtórnym zredukowanym do niewolnictwa dla twoich błyszczących nowych aplikacji mobilnych, ale faktyczny produkt, na tym samym poziomie, co każda aplikacja, którą faktycznie widzi użytkownik, zaczynasz mniej myśleć o tym, jak chronić interfejs API przed wykorzystanie przez inne aplikacje i więcej o zarabianiu samego interfejsu API . Z takiego interfejsu API mogą korzystać aplikacje, które są jego klientami, lub dowolne inne aplikacje dowolnie opracowane przez każdego. Ma to kilka zalet:

  • Dokonywanie API tak, że będzie używany tylko przez swoich aplikacji jest trudne i kosztowne. Ten czas i pieniądze można przeznaczyć na coś bardziej użytecznego.

  • Otwarcie interfejsu API dla publiczności może przynieść ogromne korzyści zarówno Tobie, jak i światu. Wyobraź sobie, że jesteś świetnym architektem i świetnym programistą, więc stworzyłeś zadziwiająco wspaniały interfejs API, ale twoje umiejętności wizualne są do kitu i naprawdę nic nie rozumiesz na temat projektowania interakcji itp. Jeśli ukryjesz swój interfejs API, jedyne ludzie będą wiedzieć, że stworzyłeś aplikację mobilną, która jest bezużyteczna i brzydka. Jeśli Twój interfejs API jest publiczny, inni deweloperzy będą zainteresowani jego jakością i pisać dla niego świetne aplikacje, przynosząc Ci mnóstwo pieniędzy.

  • Nigdy nie wyobrażasz sobie, jak inne osoby mogą korzystać z twoich interfejsów API. Tak stało się z Kinect. Początkowo Microsoft stworzył Kinect do gier. Kiedy Microsoft udostępnił API publicznie, nigdy nie wyobrażał sobie, że kilka lat później będzie on używany przez aplikacje naukowe, sektor opieki zdrowotnej itp. Podobnie jest w przypadku internetowych interfejsów API: więcej programistów z niego korzysta, bardziej rozpowszechnione byłyby pomysły.

Arseni Mourzenko
źródło
Bardzo interesująca odpowiedź. Prawdopodobnie musimy pomyśleć, w jaki sposób możemy upublicznić API. Dla porównania, rynek docelowy we Francji, gdzie inżynieria odwrotna i deasemblacja jest nielegalna, dlatego powinniśmy się tym zbytnio zajmować.
Antoine
2
@Antoine: poważna inżynieria byłaby nielegalna w każdym kraju, gdy tylko pozwoliłaby na to licencja. Ale fakt, że jest to nielegalne, nie oznacza, że ​​nikt nie będzie szanował Twojej aplikacji.
Arseni Mourzenko