Сервисы Spring Security RememberMe с файлом cookie сеанса - PullRequest
6 голосов
/ 09 апреля 2010

Я пользуюсь сервисами Remember Security от Spring Security для аутентификации пользователя.

Я хотел бы найти простой способ установить cookie-файл RememberMe в качестве cookie-файла сеанса, а не с фиксированным временем истечения. Для моего приложения cookie должен сохраняться до тех пор, пока пользователь не закроет браузер.

Есть предложения, как лучше всего это реализовать? Есть опасения, что это потенциальная проблема безопасности?

Основная причина для этого заключается в том, что с помощью маркера на основе файлов cookie любой из серверов, находящихся за нашим балансировщиком нагрузки, может обслуживать защищенный запрос, не полагаясь на то, что аутентификация пользователя сохраняется в HttpSession. На самом деле я прямо сказал Spring Security никогда не создавать сеансы с использованием пространства имен. Кроме того, мы используем эластичную балансировку нагрузки Amazon, поэтому липкие сессии не поддерживаются.

Примечание: хотя я знаю, что по состоянию на 08 апреля Amazon теперь поддерживает липкие сессии, я все еще не хочу использовать их по ряду других причин. А именно, что несвоевременное прекращение работы одного сервера все равно приведет к потере сеансов для всех пользователей, связанных с ним. http://aws.amazon.com/about-aws/whats-new/2010/04/08/support-for-session-stickiness-in-elastic-load-balancing/

Ответы [ 2 ]

5 голосов
/ 24 апреля 2010

Spring Security 3 не предлагает настройки того, как генерируется cookie. Вы должны переопределить поведение по умолчанию:

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);
  }
}

Убедитесь, что вы используете этот настроенный PersistentTokenBasedRememberMeServices для вас запомнитьMeService , добавив имя класса в конфигурацию его компонента:

<beans:bean id="rememberMeServices"
 class="my.custom.spring.PersistentTokenBasedRememberMeServicesCustom"/>
3 голосов
/ 09 апреля 2010

Чтобы сессия работала должным образом с балансировкой нагрузки, я бы сохранял ваши данные сессий в базе данных sql.

Файл cookie всегда должен иметь случайное значение, срок действия которого истекает. В некоторых случаях вы можете сохранить состояние в виде значения cookie, и это не будет опасной угрозой, например, предпочитаемый пользователем язык, но этого следует избегать, насколько это возможно. Включение HttpOnlyCookies - отличная идея.

Прочитайте A3: «Сломанная аутентификация и управление сеансами» в первой десятке OWASP за 2010 год. Одним из важных моментов в этом разделе является то, что https должен использоваться для всего сеанса. Если сеанс длится очень долго, это еще более важно.

Также имейте в виду, что «Помни меня» создает большое окно, в котором злоумышленник может «покататься» по сеансу. Это дает злоумышленнику очень много времени (месяцы?), В течение которого он может провести атаку CSRF. Даже если у вас есть защита от CSRF, злоумышленник может продолжать сеанс с XSS и XmlHttpRequest (HttpOnlyCookies предотвратит полный взлом). «Помни меня» делает другие угрозы, такие как xss, csrf, сниффинг более серьезными. Пока эти уязвимости устранены, у вас не должно быть проблем с реальными хакерами.

Самым простым (и безопасным) подходом к реализации функции «запомнить меня» было бы изменение тайм-аута сессии, чтобы сделать его очень большим (несколько месяцев). Если флажок «запомнить меня» снят, сохраните переменную сеанса с новым тайм-аутом (1 день от входа в систему). Имейте в виду, что даже если cookie удаляется браузером, когда он закрыт, сеанс все еще активен на стороне сервера. Если идентификатор сеанса украден, то он все еще может быть использован.

...