Jak zabezpieczyć usługi sieciowe RESTful?

88

Muszę zaimplementować bezpieczne usługi sieciowe RESTful . Zrobiłem już pewne badania za pomocą Google, ale utknąłem.

Opcje:

TLS (HTTPS) +

Czy jest więcej możliwych opcji do rozważenia? Jeśli OAuth, to jaka wersja? Czy to w ogóle ma znaczenie? Z tego, co przeczytałem do tej pory, OAuth 2.0 z tokenami okaziciela (czyli bez podpisów) wydaje się być niepewny .

Znalazłem kolejny bardzo interesujący artykuł na temat uwierzytelniania opartego na REST .

Zabezpiecz swój interfejs API REST ... we właściwy sposób

Jan Deinhard
źródło

Odpowiedzi:

59

Jest inna, bardzo bezpieczna metoda. To certyfikaty klienta. Wiesz, w jaki sposób serwery prezentują certyfikat SSL, gdy kontaktujesz się z nimi przez https? Cóż, serwery mogą zażądać certyfikatu od klienta, aby wiedzieć, że klient jest tym, za kogo się podaje. Klienci generują certyfikaty i przekazują je za pośrednictwem bezpiecznego kanału (np. Przychodząc do biura z kluczem USB - najlepiej niezainfekowanym kluczem USB).

Ładujesz klucz publiczny certyfikatów klienta certyfikatów (i certyfikatów ich osoby podpisującej, jeśli to konieczne) na serwer sieciowy, a serwer sieciowy nie będzie akceptował połączeń od nikogo poza osobami, które mają odpowiednie klucze prywatne do certyfikatów to wie. Działa na warstwie HTTPS, więc możesz nawet całkowicie pominąć uwierzytelnianie na poziomie aplikacji, takie jak OAuth (w zależności od wymagań). Możesz oddzielić warstwę i utworzyć lokalny urząd certyfikacji oraz podpisywać żądania certyfikatów od klientów, co pozwala pominąć kroki „spraw, aby przyszli do biura” i „załaduj certyfikaty na serwer”.

Ból szyi? Absolutnie. Dobry na wszystko? Nie. Bardzo bezpieczne? Tak.

Opiera się jednak na tym, że klienci dbają o bezpieczeństwo swoich certyfikatów (nie mogą publikować swoich kluczy prywatnych online) i jest zwykle używany, gdy sprzedajesz usługę klientom, zamiast pozwalać każdemu zarejestrować się i połączyć.

W każdym razie może to nie być rozwiązanie, którego szukasz (prawdopodobnie nie jest to szczere), ale to inna opcja.

Tom Ritter
źródło
Okej, teraz jestem zdezorientowany, który z nich jest lepszy, to podejście czy inna odpowiedź . Czy mógłbyś to rozwinąć? : D
fikr4n
Twoja odpowiedź byłaby idealna dla mistrzów, ale jest myląca dla nowicjusza. Czy możesz podać szczegółowe informacje lub linki do przeczytania?
Rajan Rawal
Jeśli certyfikaty są podpisane samodzielnie, czy nadal są one „bardzo bezpieczne”?
Joyce
@Joyce Myślę, że nie. Ponieważ nie jesteś zaufany (bez obrazy), certyfikatom, które podpisujesz (własnym certyfikatem), nie można ufać. Uważam, że certyfikaty z podpisem własnym są bardziej przydatne do testowania.
mbmast,
Biorąc pod uwagę, że użytkownik końcowy (klient) ma certyfikat klienta, którego klucz publiczny jest współdzielony z serwerem, czy cała „bardzo bezpieczna” rzecz nie rozpadnie się, jeśli maszyna klienta zostanie zhakowana, a certyfikat klienta zostanie skradziony?
mbmast,
18

HTTP Basic + HTTPS to jedna z powszechnych metod.

pc1oad1etter
źródło
3
Nie sądzę, że skrót http daje cokolwiek w porównaniu z podstawowym protokołem http, jeśli oba są za pośrednictwem protokołu HTTPS.
pc1oad1etter
3
Możesz poważnie dodać przydatne informacje o zaletach skrótu HTTP bez tonu.
pc1oad1etter
9

Jeśli wybierasz między wersjami OAuth, wybierz OAuth 2.0.

Tokenów na okaziciela OAuth należy używać tylko z bezpiecznym transportem.

Tokeny okaziciela OAuth są tak bezpieczne lub niepewne, jak transport, który szyfruje konwersację. HTTPS dba o ochronę przed powtórkowymi atakami, więc nie jest konieczne, aby token okaziciela również chronił przed powtórzeniem.

Chociaż prawdą jest, że jeśli ktoś przechwyci twój token okaziciela, może podszyć się pod Ciebie podczas wywoływania interfejsu API, istnieje wiele sposobów na ograniczenie tego ryzyka. Jeśli dasz swoim tokenom długi okres wygaśnięcia i oczekujesz, że Twoi klienci będą przechowywać tokeny lokalnie, masz większe ryzyko przechwycenia tokenów i ich niewłaściwego wykorzystania niż w przypadku, gdy nadasz swoim tokenom krótki okres ważności, wymagaj od klientów nabycia nowych tokenów na każdą sesję, i doradzaj klientom, aby nie utrwalali tokenów.

Jeśli potrzebujesz zabezpieczyć ładunki, które przechodzą przez wielu uczestników, potrzebujesz czegoś więcej niż HTTPS / SSL, ponieważ HTTPS / SSL szyfruje tylko jedno łącze wykresu. To nie jest wina protokołu OAuth.

Tokeny okaziciela są łatwe do uzyskania dla klientów, łatwe w użyciu dla klientów do wywołań API i są szeroko stosowane (z HTTPS) do zabezpieczania publicznych interfejsów API z Google, Facebooka i wielu innych usług.

dthorpe
źródło