Wiedza o tym, jak zabezpieczyć interfejsy API REST, jest równie ważna, jak pisanie samych interfejsów API. Większość interfejsów API REST opiera się na protokole HTTP, a każdy użytkownik mający połączenie z Internetem może uzyskać do nich dostęp, podobnie jak źli użytkownicy. Bardzo ważne jest pisanie bezpiecznych interfejsów API, aby chronić firmę.
zanim zaczniemy zabezpieczać interfejsy API RESTful, zrozumiemy, jakie mamy możliwości jako programiści? Co będzie dobrze pasować do naszego zastosowania?
Table of Contents1. Authentication vs. Authorization2. Four Ways to Secure RESTful Web Services- BASIC Authentication- DIGEST Authentication- Client CERT Authentication- OAUTH2 API Keys3. RESTful Web Services Security Implementations- Using SecurityContext- Using Annotations4. Best Practices
- różnica między uwierzytelnianiem a autoryzacja
- cztery sposoby zabezpieczenia usług internetowych RESTful
- 2.1. Podstawowe uwierzytelnianie
- 2.2. Uwierzytelnianie DIGEST
- 2.3. Uwierzytelnianie Cert klienta
- 2.4. Klucze API OAUTH2
- implementacje zabezpieczeń REST API
- 3.1. JAX-RS SecurityContext instancja
- 3.2. Adnotacje JAR – RS dla autoryzacji na poziomie metody
- najlepsze praktyki bezpieczeństwa API REST
- czy ten post był pomocny?
różnica między uwierzytelnianiem a autoryzacja
zanim przejdziemy do głównej dyskusji, wyjaśnijmy sobie, czym jest uwierzytelnianie i czym jest autoryzacja.
w prostym, prostym języku angielskim, uwierzytelnianie jest procesem upewniania się, że „jest użytkownikiem naprawdę kimś, kim twierdzi, że jest”. Pod względem technicznym jest to proces logowania do systemu za pomocą nazwy użytkownika/hasła lub podobnych mechanizmów np. skanowania odcisków palców, tokena bezpieczeństwa, pytań bezpieczeństwa lub tokena SAML otrzymanego z logowania SSO. Musi istnieć coś, co może odróżnić użytkownika od innych.
gdy użytkownik jest w systemie, autoryzacja odnosi się do reguł określających „co użytkownik może robić” i czym nie jest np. normalny użytkownik może opublikować wiadomość w dowolnej grupie publicznej, ale użytkownicy tylko z rolą edytora będą mogli coś usunąć. Autoryzacja jest często postrzegana zarówno jako wstępne ustawianie uprawnień przez administratora systemu, jak i sprawdzanie wartości uprawnień, które zostały już skonfigurowane, gdy użytkownik uzyskuje dostęp do systemu.
kiedy zabezpieczamy Usługi internetowe RESTful, musimy zadbać o oba te czynniki. Te dwie koncepcje są całkowicie ortogonalne i niezależne, ale obie mają kluczowe znaczenie dla projektowania zabezpieczeń, a brak poprawności jednego z nich zwiększa szanse na skompromitowanie systemu..
cztery sposoby zabezpieczenia usług internetowych RESTful
istnieje wiele sposobów zabezpieczenia interfejsu API RESTful w Javie. Przejdźmy przez 4 Najpopularniejsze wybory:
2.1. Podstawowe uwierzytelnianie
jest to najprostsza ze wszystkich technik i prawdopodobnie najczęściej używana. Używasz formularzy login/hasło-to tylko podstawowe uwierzytelnianie. Wprowadzasz swoją nazwę użytkownika i hasło i przesyłasz formularz na serwer, a aplikacja identyfikuje cię jako użytkownika-możesz korzystać z systemu-w przeciwnym razie pojawi się błąd.
głównym problemem tej implementacji zabezpieczeń jest to, że poświadczenia są propagowane w prosty sposób od klienta do serwera. Dane uwierzytelniające są jedynie kodowane za pomocą Base64 w trakcie przesyłania, ale nie są w żaden sposób szyfrowane ani haszowane. W ten sposób każdy sniffer mógł odczytać wysłane pakiety przez sieć.
HTTPS jest zatem zwykle preferowany lub używany w połączeniu z podstawowym uwierzytelnianiem, które sprawia, że rozmowa z serwerem WWW jest całkowicie zaszyfrowana. Najlepsze jest to, że nikt nie może nawet odgadnąć z zewnątrz, że ma miejsce Basic Auth.
2.2. Uwierzytelnianie DIGEST
ta metoda uwierzytelniania wykorzystuje algorytmy haszujące do szyfrowania hasła (zwanego hash hash) wprowadzonego przez użytkownika przed wysłaniem go na serwer. To oczywiście czyni go znacznie bezpieczniejszym niż podstawowa metoda uwierzytelniania, w której hasło użytkownika podróżuje w postaci zwykłego tekstu, który może być łatwo odczytany przez tego, kto go przechwytuje.
Czytaj więcej: generowanie zaszyfrowanych haseł
istnieje wiele takich algorytmów haszujących w Javie, które mogą okazać się naprawdę skuteczne dla bezpieczeństwa haseł, takich jak algorytmy MD5, SHA, BCrypt, SCrypt i pbkdf2withhmacsha1.
pamiętaj, że gdy ten hash hasła zostanie wygenerowany i zapisany w bazie danych, nie możesz go przekonwertować z powrotem na oryginalne hasło. Za każdym razem, gdy użytkownik loguje się do aplikacji, musisz ponownie wygenerować hash hasła i dopasować go do hasha zapisanego w bazie danych. Tak więc, jeśli użytkownik zapomniał swojego hasła, będziesz musiał wysłać mu tymczasowe hasło i poprosić o jego zmianę za pomocą nowego hasła. To powszechny trend.
2.3. Uwierzytelnianie Cert klienta
jest to mechanizm, w którym zawierana jest umowa zaufania między serwerem a klientem za pomocą certyfikatów. Muszą być podpisane przez agencję ustanowioną w celu zapewnienia, że certyfikat przedstawiony do uwierzytelnienia jest zgodny z prawem, znany jako CA.
korzystając z tej techniki, gdy klient próbuje uzyskać dostęp do chronionego zasobu, zamiast podać nazwę użytkownika lub hasło, prezentuje certyfikat serwerowi. Certyfikat zawiera informacje użytkownika do uwierzytelniania, w tym poświadczenia bezpieczeństwa, oprócz unikalnej pary kluczy prywatny-publiczny. Następnie serwer określa, czy użytkownik jest legalny za pośrednictwem urzędu certyfikacji. Dodatkowo musi sprawdzić, czy użytkownik ma dostęp do zasobu. Ten mechanizm musi używać HTTPS jako protokołu komunikacyjnego, ponieważ nie mamy bezpiecznego kanału, aby zapobiec kradzieży tożsamości klienta.
kompletny samouczek dotyczący generowania certyfikatu bezpieczeństwa można znaleźć w oficjalnych dokumentach oracle.
2.4. Klucze API OAUTH2
jeśli kiedykolwiek tworzyłeś aplikacje, które współdziałają z innymi aplikacjami w chmurze, np. integracja z Facebookiem lub uwierzytelnianie na Twitterze itp. więc już to wykorzystałeś. Wymagają one podania klucza API i tajemnicy API, aby prawidłowo Cię zidentyfikować. Te klucz API i sekret są jakimś losowym zakodowanym ciągiem, którego nie można odgadnąć.
aby zrozumieć, jak to działa, Załóżmy, że korzystasz z Flickr (aplikacji do udostępniania zdjęć) i chcesz opublikować niektóre zdjęcia za pomocą interfejsu REST API. Tworzysz żądanie zgodnie z dokumentami Flickr, a następnie je wysyłasz.
następnie, po otrzymaniu żądania, Flickr uwierzytelnia użytkownika poprzez odczytanie informacji z klucza API za pomocą klucza tajnego, który należy do użytkownika. Po pomyślnym zatwierdzeniu serwer dostarcza odpowiedź klientowi. W ten sposób otrzymujemy odpowiedź ze wszystkimi zdjęciami, które zostały niedawno opublikowane w serwisie Flickr.
jak zauważysz, w ten sposób możesz łatwo tworzyć aplikacje za pomocą interfejsu API dostawcy. Ponadto, dostawca pozwoli Ci uwierzytelnić, dostęp do informacji publicznych.
jeśli ktoś zacznie lekceważyć umowy, np. wysyłając śmieciowy ruch lub jakiekolwiek naruszenie zasad, dostawca wycofuje klucz API i zapobiega nadużyciom w korzystaniu z jego interfejsów API.
implementacje zabezpieczeń REST API
poza powyższymi koncepcjami, Zwykle będziesz musiał zabezpieczyć swoje API RESTful w swojej firmie za pomocą poniższych metod.
3.1. JAX-RS SecurityContext instancja
interfejs javax.ws.rs.core.SecurityContext
zapewnia dostęp do informacji związanych z bezpieczeństwem dla żądania i jest bardzo podobny do javax.servlet.http.HttpServletRequest
.
uzyskujesz dostęp do SecurityContext poprzez wstrzyknięcie instancji do pola klasy, metody settera lub parametru metody za pomocą adnotacji javax.ws.rs.core.Context
, np. w poniższym kodzie sc.isUserInRole()
służy do sprawdzania autoryzacji dla użytkownika.
3.2. Adnotacje JAR – RS dla autoryzacji na poziomie metody
ta technika jest szeroko stosowana w aplikacjach korporacyjnych i służy do weryfikacji ról i odpowiedzialności uwierzytelnionego użytkownika używanego dla dowolnej określonej operacji. JAX-RS podaje poniższe adnotacje w tym celu.
- @PermitAll
- @DenyAll
- @RolesAllowed
przykładem użycia adnotacji może być:
Czytaj więcej : Przykład uwierzytelniania i autoryzacji JAX-RS
najlepsze praktyki bezpieczeństwa API REST
zwróćmy uwagę na kilka ważnych punktów podczas projektowania zabezpieczeń dla usług internetowych RESTful.
- używaj tylko protokołu HTTPS, aby cała komunikacja była zawsze szyfrowana.
- nigdy nie wysyłaj poświadczeń auth ani kluczy API jako param zapytania. Pojawiają się one w adresie URL i mogą być łatwo rejestrowane lub śledzone.
- Zawsze używaj najtrudniejszego poziomu szyfrowania. Pomoże to w uzyskaniu większej pewności siebie.
- w przypadku zasobów ujawnionych przez Usługi internetowe RESTful ważne jest, aby upewnić się, że każde żądanie PUT, POST i DELETE jest chronione przed fałszowaniem żądań między witrynami.
- zawsze sprawdzaj poprawność danych wejściowych asap, które zostaną odebrane w metodzie serwera. Używaj tylko prymitywnych danych jako parametru wejściowego w jak największym stopniu.
- polegaj na funkcjach walidacji dostarczanych przez framework, ponieważ są one już testowane przez dużą społeczność.
Daj mi znać swoje przemyślenia i doświadczenia na temat tego, jak zabezpieczyć Usługi internetowe RESTful w Twojej organizacji.
Szczęśliwej Nauki !!