Spring HTTP/HTTPS Channel Security

Spring HTTP / HTTPS Channel Security

1. обзор

В этом руководстве показано, какhow to use HTTPS to protect your application’s login page использует функцию Spring Channel Security.

Использование HTTPS для аутентификации имеет решающее значение для защиты целостности конфиденциальных данных при транспортировке.

Статья основана наSpring Security Login tutorial, добавляя дополнительный уровень безопасности. Мы выделяем шаги, необходимые для защиты данных аутентификации, предоставляя страницу входа через закодированный канал HTTPS.

2. Первоначальная настройка без защиты канала

Начнем с настройки безопасности, описанной в вышеупомянутой статье.

Веб-приложение позволяет пользователям получить доступ к:

  1. /anonymous.html без аутентификации,

  2. /login.html и

  3. другие страницы (/homepage.html) после успешного входа в систему.

Доступ контролируется следующей конфигурацией:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/anonymous*")
      .anonymous();

    http.authorizeRequests()
      .antMatchers("/login*")
      .permitAll();

    http.authorizeRequests()
      .anyRequest()
      .authenticated();

Или через XML:


    
    
    

На данный момент страница входа доступна по адресу:

http://localhost:8080/spring-security-login/login.html

Пользователи могут аутентифицировать себя через HTTP, однако это небезопасно, так как пароли будут отправляться в виде простого текста.

3. Конфигурация сервера HTTPS

Для доставки страницы входа только через HTTPSyour web-server must be able to serve HTTPS pages. Для этого требуется, чтобы была включена поддержкаSSL/TLS.

Обратите внимание, что вы можете использовать действующий сертификат или, для целей тестирования, вы можете создать свой собственный.

Допустим, мы используем Tomcat и запускаем собственный сертификат. Сначала нам нужно создатьkeystore с самоподписанным сертификатом.

Генерацию хранилища ключей можно выполнить, введя в терминале следующую команду:

keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'

Это создаст закрытый ключ и самозаверяющий сертификат в хранилище ключей по умолчанию для вашего профиля пользователя в вашей домашней папке.

Следующий шаг - отредактироватьconf/server.xml, чтобы он выглядел так:



Второй тег SSL / TLS<Connector> обычно закомментирован в файле конфигурации, поэтому все, что нужно, - это раскомментировать и добавить информацию о хранилище ключей. Дополнительная информация доступна вTomcat’s related documentation.

При наличии конфигурации HTTPS страницу входа теперь можно обслуживать также по следующему URL:

https://localhost:8443/spring-security-login/login.html

Для веб-серверов, отличных от Tomcat, потребуется другая, но, вероятно, аналогичная конфигурация.

4. Настройка безопасности канала

На данный момент мы можем обслуживать страницу входа как по HTTP, так и по HTTPS. В этом разделе объясняется, как разрешить использование HTTPS.

To require HTTPS for the login page измените вашу конфигурацию безопасности, добавив следующее:

http.requiresChannel()
  .antMatchers("/login*").requiresSecure();

Или добавьте атрибутrequires-channel=”https” в конфигурацию XML:

После этого момента пользователи могут войти только через HTTPS. Все относительные ссылки, например переадресация на/homepage.html унаследует протокол исходного запроса и будет обслуживаться по HTTPS.

При смешивании запросов HTTP и HTTPS внутри одного веб-приложения необходимо учитывать дополнительные аспекты, требующие дальнейшей настройки.

5. Смешивание HTTP и HTTPS

С точки зрения безопасности, обслуживание всего через HTTPS является хорошей практикой и серьезной целью.

Однако, если использование исключительно HTTPS не является опцией, мы можем настроить Spring на использование HTTP, добавив в конфигурацию следующее:

http.requiresChannel()
  .anyRequest().requiresInsecure();

Или добавьте атрибутыrequires-channel=”http” в XML:

Это указывает Spring на использование HTTP для всех запросов, которые явно не настроены для использования HTTPS, но в то же время нарушают оригинальный механизм входа в систему. В следующих разделах объясняется основная причина.

5.1. Пользовательский URL-адрес обработки входа через HTTPS

Конфигурация безопасности в исходном руководстве по безопасности содержит следующее:

Without forcing /perform_login to use HTTPS a redirect would happen to the HTTP variant of it, losing the login information отправлено с исходным запросом.

Чтобы преодолеть это, нам нужно настроить Spring на использование HTTPS для обработки URL:

http.requiresChannel()
  .antMatchers("/login*", "/perform_login");

Обратите внимание на дополнительный аргумент/perform_login, переданный методуantMatchers.

Эквивалент в конфигурации XML требует добавления нового элемента<intercept-url> в конфигурацию:

Если ваше собственное приложение используетlogin-processing-url по умолчанию (то есть/login), вам не нужно настраивать это явно, поскольку шаблон/login* уже охватывает это.

При наличии конфигурации пользователи могут входить в систему, но не иметь доступа к аутентифицированным страницам, например, /homepage.html по протоколу HTTP из-заSpring’s session fixation protection feature.

5.2. Отключениеsession-fixation-protection

Session fixation - это проблема, которую нельзя избежать при переключении между HTTP и HTTPS.

По умолчанию Spring создает новыйsession-id после успешного входа в систему. Когда пользователь загружает страницу входа HTTPS, файл cookie пользователяsession-id будет помечен какsecure.. После входа в систему контекст переключится на HTTP иthe cookie will be lost, поскольку HTTP небезопасен.

Чтобы избежать этогоsetting session-fixation-protection to none is required.

http.sessionManagement()
  .sessionFixation()
  .none();

Или через XML:

Disabling session fixation protection might have security implications, поэтому вам необходимо взвесить все за и против, если вас беспокоят атаки на основе фиксации сеанса.

6. Test

После применения всех этих изменений конфигурации доступ к/anonymous.html без входа в систему (с использованиемhttp:// или https: //) перенаправит вас на страницу через HTTP.

Открытие других страниц напрямую, например/homepage.html, должно перенаправить вас на страницу входа через HTTPS, а после входа вы будете перенаправлены обратно на/homepage.html по HTTP.

7. Заключение

В этом руководстве мы рассмотрели, как настроить веб-приложение Spring, которое обменивается данными через HTTP, за исключением механизма входа в систему. Однакоnew modern web-applications should almost always use HTTPS exclusively в качестве протокола связи. Снижение уровней безопасности или отключение функций безопасности (например,session-fixation-protection) - плохая идея.

Это руководство основано наcodebase available on GitHub. Конфигурацию безопасности канала можно включить, указавhttps как активныйSpring profile.