Рубрики
Без рубрики

Безопасность канала Spring HTTP/HTTPS

В статье кратко показано, как защитить конфиденциальные данные, настроив HTTPS, и обсуждаются дополнительные детали конфигурации функции безопасности канала.

Автор оригинала: baeldung.

1. Обзор

В этом руководстве показано как использовать HTTPS для защиты страницы входа в систему вашего приложения с помощью функции безопасности канала Spring.

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

Эта статья основана на учебнике по входу в систему Spring Security, добавив дополнительный уровень безопасности. Мы выделяем шаги, необходимые для защиты данных аутентификации, обслуживая страницу входа в систему через закодированный канал 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

Для доставки страницы входа только по протоколу HTTPS ваш веб-сервер должен иметь возможность обслуживать страницы HTTPS . Для этого требуется, чтобы была включена поддержка SSL/TLS .

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

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

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

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

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

Следующим шагом является редактирование conf/server.xml чтобы это выглядело так:



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

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

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

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

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

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

Чтобы потребовать HTTPS для страницы входа в систему измените конфигурацию безопасности, добавив следующее:

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

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

Без принуждения /perform_login использовать HTTPS перенаправление произойдет на его HTTP-вариант, потеряв регистрационную информацию , отправленную с исходным запросом.

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

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

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

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

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

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

5.2. Отключение сеанса-фиксация-защита

Фиксация сеанса – это проблема, которой нельзя избежать при переключении между HTTP и HTTPS.

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

Чтобы избежать этого s etting session-fixation-protection |/to none требуется .

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

Или через XML:


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

6. Тест

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

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

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

В этом уроке мы рассмотрели, как настроить веб-приложение Spring, которое взаимодействует через HTTP, за исключением механизма входа в систему. Однако новые современные веб-приложения почти всегда должны использовать HTTPS исключительно в качестве своего протокола связи. Снижение уровня безопасности или отключение функций безопасности (например, фиксация сеанса-защита ) никогда не является хорошей идеей.

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