6

Korzystam z usług RememberMe Spring Security, aby zachować uwierzytelnienie użytkownika.Spring Security RememberMe Usługi z plikami cookie sesji

Chciałbym znaleźć prosty sposób, aby plik cookie RememberMe był ustawiony jako sesyjny plik cookie, a nie o ustalonym czasie wygaśnięcia. Dla mojej aplikacji plik cookie powinien być wyświetlany do momentu zamknięcia przeglądarki przez użytkownika.

Jakieś sugestie, jak najlepiej to wdrożyć? Jakiekolwiek obawy związane z potencjalnym problemem bezpieczeństwa?

Podstawowym powodem jest to, że przy użyciu tokena opartego na pliku cookie każdy z serwerów znajdujących się za naszym modułem równoważenia obciążenia może obsługiwać chronione żądania bez polegania na uwierzytelnianiu użytkownika w celu przechowywania w HttpSession. W rzeczywistości wyraźnie powiedziałem Spring Security, aby nigdy nie tworzył sesji przy użyciu przestrzeni nazw. Ponadto korzystamy z elastycznego równoważenia obciążenia Amazon, dlatego też nie są obsługiwane sesje typu sticky.

NB: Chociaż zdaję sobie sprawę, że od 08 kwietnia Amazon obsługuje teraz sesje lepkie, nadal nie chcę ich używać z kilku innych powodów. Mianowicie, że przedwczesny zgon jednego serwera nadal powodowałby utratę sesji dla wszystkich użytkowników z nim powiązanych. http://aws.amazon.com/about-aws/whats-new/2010/04/08/support-for-session-stickiness-in-elastic-load-balancing/

+0

Dlaczego czy po prostu nie wdrożysz własnej implementacji RememberMe? To całkiem proste. – lexicore

+0

Duplikat? http://stackoverflow.com/questions/2594960/best-practice-to-implement-secure-remember-me – rook

+0

@lexicore ludzie realizujący własne sesje mogą przynieść prawdziwą dewastację twojej aplikacji internetowej. Nie wynajduj ponownie bąka. Przeczytaj mój post na "duplikacie?" pytanie powyżej. – rook

Odpowiedz

3

Aby sesja działała poprawnie z równoważeniem obciążenia, dane sesji byłyby przechowywane w bazie danych sql.

Plik cookie powinien być zawsze losową wartością, która traci ważność. Zdarzają się sytuacje, w których można przechowywać stan jako wartość cookie i nie jest to zagrożenie bezpieczeństwa, takie jak preferowany język, ale należy tego unikać w jak największym stopniu. Włączanie HttpOnlyCookies jest świetnym pomysłem.

Przeczytaj A3: "Zerwane uwierzytelnianie i zarządzanie sesjami" w pierwszej dziesiątce OWASP w 2010 roku. Ważnym punktem w tej sekcji jest to, że do całej sesji musi być używany protokół https. Jeśli sesja trwa bardzo długo, jest to jeszcze ważniejsze.

Należy również pamiętać, że "Pamiętaj mnie" tworzy duże okno, w którym osoba atakująca może "jeździć" po sesji. To daje atakującemu bardzo długi czas (miesiące?), W którym może on dostarczyć atak CSRF. Nawet jeśli masz ochronę CSRF, osoba atakująca może nadal korzystać z sesji XSS i XmlHttpRequest (HttpOnlyCookies uniemożliwi pełne przejęcie). "Remember Me" sprawia, że ​​inne zagrożenia, takie jak xss, csrf, węszą poważniej. Tak długo jak te luki zostały rozwiązane, nie powinieneś mieć problemu z hakerami.

Najprostszym (i bezpiecznym) podejściem do wdrożenia funkcji "zapamiętaj mnie" byłoby zmodyfikowanie limitu czasu sesji tak, aby było bardzo duże (kilka miesięcy). Jeśli pole wyboru "zapamiętaj mnie" nie jest zaznaczone, zapisz zmienną sesji z nowym limitem czasu (1 dzień od zalogowania). Należy pamiętać, że nawet jeśli plik cookie zostanie usunięty przez przeglądarkę po jej zamknięciu, sesja nadal będzie aktywna po stronie serwera. Jeśli kradzież tożsamości zostanie skradziona, może być nadal używana.

+0

Co zrobić z niestandardowym filtrem RememberMe, zamiast tworzyć nowy token dla każdego żądania. Nowy token może mieć krótką żywotność, np. 20 minut. Jeśli użytkownik nic nie robi, token wygasa. Jeśli użytkownik wyśle ​​kolejne żądanie w oknie 20-minutowym, zostanie utworzone nowe 20-minutowe okno. Jeśli sesja użytkownika zostanie w jakiś sposób skradziona, zmiana hasła użytkownika nadal spowoduje unieważnienie wszystkich ważnych tokenów w dzikich ... myślach? –

+0

pamiętam gdzie usłyszałem ten pomysł przed ... to wymaga wytrwałości tokena do bazy danych, ale nie HttpSession: http://jaspan.com/improved_persistent_login_cookie_best_practice Może będę patrzeć w instacji PersistentTokenBasedRememberMeService wiosną Bezpieczeństwo. –

5

Spring Security 3 nie oferuje konfiguracji sposobu generowania pliku cookie.Trzeba zastąpić domyślne zachowanie:

import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices; 

/** Cookie expires on session. */ 
public class PersistentTokenBasedRememberMeServicesCustom extends 
    PersistentTokenBasedRememberMeServices { 

    /** only needed because super throws exception. */ 
    public PersistentTokenBasedRememberMeServicesCustom() throws Exception { 
    super(); 
    } 

    /** Copy of code of inherited class + setting cookieExpiration, */ 
    @Override 
    protected void setCookie(String[] tokens, int maxAge, 
     HttpServletRequest request, HttpServletResponse response) { 
    String cookieValue = encodeCookie(tokens); 
    Cookie cookie = new Cookie(getCookieName(), cookieValue); 
    //cookie.setMaxAge(maxAge); 
    cookie.setPath("/"); 
    cookie.setSecure(false); // no getter available in super, so always false 

    response.addCookie(cookie); 
    } 
} 

Upewnij się, należy użyć tej dostosowanych PersistentTokenBasedRememberMeServices dla jesteś rememberMeService dodając nazwę klasy do jego konfiguracja fasola:

<beans:bean id="rememberMeServices" 
class="my.custom.spring.PersistentTokenBasedRememberMeServicesCustom"/>