Bezpieczeństwo systemów uwierzytelniania REST

Background:

Projektuję schemat uwierzytelniania dla serwisu internetowego REST. To nie "naprawdę" musi być bezpieczne (jest to bardziej osobisty projekt), ale chcę, aby było tak bezpieczne, jak to tylko możliwe, jako doświadczenie ćwiczeń/uczenia się. Nie chcę używać SSL, ponieważ nie chcę kłopotów, a przede wszystkim wydatków związanych z konfiguracją.

Te pytania były szczególnie przydatne na początek:

Myślę o użyciu uproszczonej wersji uwierzytelniania Amazon S3 (lubię OAuth , ale wydaje się to zbyt skomplikowane dla moich potrzeb). Dodaję losowo wygenerowanąnonce , dostarczoną przez serwer, do żądania, aby zapobiec atakom powtórek.

Aby przejść do pytania:

Zarówno S3, jak i OAuth polegają na podpisaniu adresu URL żądania wraz z kilkoma wybranymi nagłówkami. żaden z nich nie podpisuje ciała żądania dla POST lub PUT requests. Czy nie jest to podatne na atak typu man-in-the-middle, który zachowuje adres url i nagłówki i zastępuje treść żądania dowolnymi danymi, których chce atakujący?

Wygląda na to, że mogę się przed tym uchronić, włączając hash treści żądania do łańcucha, który zostanie podpisany. Czy to bezpieczne?

Author: Community, 2009-01-18

6 answers

Poprzednia odpowiedź mówiła tylko o SSL w kontekście transferu danych i nie obejmowała uwierzytelniania.

Naprawdę pytasz o bezpieczne uwierzytelnianie klientów REST API. Jeśli nie używasz uwierzytelniania klienta TLS, sam SSL nie jest realnym mechanizmem uwierzytelniania dla REST API. SSL bez uwierzytelniania klienta uwierzytelnia tylko Serwer , co jest nieistotne dla większości interfejsów API REST, ponieważ naprawdę chcesz uwierzytelnić klienta .

Jeśli nie używasz uwierzytelniania klienta TLS, musisz użyć czegoś w rodzaju schematu uwierzytelniania opartego na digest (takiego jak schemat niestandardowy Amazon Web Service) lub OAuth 1.0 A lub nawet podstawowego uwierzytelniania HTTP (ale tylko przez SSL).

Te systemy uwierzytelniają, że żądanie zostało wysłane przez kogoś oczekiwanego. TLS (SSL) (bez uwierzytelniania klienta) zapewnia, że dane przesyłane przez przewód pozostają nienaruszone. Są to odrębne - ale komplementarne - zagadnienia.

Dla tych interesujący, rozszerzyłem na tak pytanie o Schematy uwierzytelniania HTTP i jak one działają .

 159
Author: Les Hazlewood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:53

REST oznacza pracę ze standardami sieciowymi, a standardem "bezpiecznego" transferu w sieci jest SSL. Wszystko inne będzie trochę dziwne i będzie wymagało dodatkowego wysiłku wdrożeniowego dla klientów, którzy będą musieli mieć dostępne biblioteki szyfrowania.

Kiedy już zdecydujesz się na SSL, w zasadzie nie ma nic wymyślnego wymaganego do uwierzytelniania. Możesz ponownie przejść ze standardami sieciowymi i użyć HTTP Basic auth (nazwa użytkownika i tajny token wysyłany wraz z każdym żądaniem), ponieważ jest to dużo prostsze niż rozbudowany protokół podpisywania i nadal skuteczne w kontekście bezpiecznego połączenia. Musisz tylko upewnić się, że hasło nigdy nie przechodzi przez zwykły tekst; więc jeśli hasło zostanie kiedykolwiek odebrane przez połączenie tekstowe, możesz nawet wyłączyć hasło i wysłać wiadomość do programisty. Należy również upewnić się, że poświadczenia nie są rejestrowane w dowolnym miejscu po otrzymaniu, tak jak nie logujesz zwykłego hasła.

Http Digest jest bezpieczniejszym podejściem, ponieważ zapobiega tajnemu tokenowi zamiast tego jest to hash, który serwer może zweryfikować po drugiej stronie. Chociaż może to być przesada dla mniej wrażliwych aplikacji, jeśli podjąłeś środki ostrożności wymienione powyżej. W końcu hasło użytkownika jest już przesyłane w postaci zwykłego tekstu podczas logowania (chyba że robisz jakieś fantazyjne szyfrowanie JavaScript w przeglądarce), a także ich pliki cookie na każde żądanie.

Zauważ, że w API lepiej jest, aby Klient przekazywał tokeny-losowo generowane ciągi - zamiast hasła programista loguje się do witryny. Tak więc deweloper powinien być w stanie zalogować się do witryny i wygenerować nowe tokeny, które mogą być wykorzystane do weryfikacji API.

Głównym powodem użycia tokenu jest to, że można go wymienić, jeśli jest zagrożony, podczas gdy hasło jest zagrożone, właściciel może zalogować się na konto dewelopera i zrobić z nim wszystko, co chce. Kolejną zaletą tokenów jest możliwość wydania wielu tokenów tym samym programistom. Być może ponieważ mają wiele aplikacji lub chcą tokenów o różnych poziomach dostępu.

(zaktualizowano, aby objąć implikacje nawiązania połączenia tylko SSL.)

 58
Author: mahemoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-21 06:47:33

LUB możesz użyć znanego rozwiązania tego problemu i użyć SSL. Własnoręcznie podpisane certy są bezpłatne i to osobisty projekt, prawda?

 7
Author: wowest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-28 13:52:06

Jeśli potrzebujesz hash body jako jednego z parametrów w adresie URL i ten adres URL jest podpisany za pomocą klucza prywatnego, wtedy atak man-in-the-middle byłby w stanie zastąpić treść treścią, która wygenerowałaby ten sam hash. Łatwe do zrobienia z wartościami skrótu MD5 teraz przynajmniej i kiedy SHA-1 jest uszkodzony, cóż, masz obraz.

Aby zabezpieczyć ciało przed manipulacją, musisz wymagać podpisu ciała, który atak człowieka w środku byłby mniej prawdopodobny mogą się złamać, ponieważ nie znają klucza prywatnego, który generuje podpis.

 5
Author: ZaDDaZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-28 06:37:07

W rzeczywistości oryginalny auth S3 pozwala na podpisywanie treści, aczkolwiek ze słabym podpisem MD5. Możesz po prostu wymusić ich opcjonalną praktykę włączania nagłówka Content-MD5 do HMAC (ciąg znaków do podpisania).

Http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

Ich nowy schemat uwierzytelniania v4 jest bezpieczniejszy.

Http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

 3
Author: djsadinoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-10 07:14:54

Pamiętaj, że Twoje sugestie utrudniają klientom komunikację z serwerem. Muszą zrozumieć swoje innowacyjne rozwiązanie i odpowiednio szyfrować dane, Ten model nie jest tak dobry dla publicznego API (chyba że jesteś amazon \ yahoo \ google..).

W każdym razie, jeśli musisz zaszyfrować zawartość ciała, proponuję sprawdzić istniejące standardy i rozwiązania, takie jak:

Szyfrowanie XML (standard W3C)

XML Security

 1
Author: LiorH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 21:36:47