Как сделать секьюрити

Обновлено: 02.07.2024

Вы интегрируете web-app на Spring Boot с библиотекой Spring Security. Мы возьмем незащищенное приложение, которое мы разбирали в прошлой статье и защитим его с помощью Spring Security:

Что вам понадобится?

  • Около 15-50 минут
  • Ваш любимый текстовый редактор или IDE
  • JDK 1.8 или выше
  • Maven 3.0+

Как пользоваться этой статьей

  • Внимательно прочитайте статью
  • Скачайте исходный код с github
  • Запустите и проверьте работу
  • Удостоверьтесь что код вам понятен
  • Если что то осталось неясно, смело задавайте вопросы мне или google

Первичная настройка Spring-Security

В дальнейшем вы сможете более тонко настроить security. Первое что вам надо сделать это добавить Spring Security в classpath:

WebSecurityConfigurerAdapter

Создадим login-страницу

Добавим файл src/main/resources/templates/login.html с шаблоном thymeleaf в котором включим интеграцию со Spring-Security - thymeleaf-extras-springsecurity3

И не забудем добавить в MvcConfig для страницы логина натройку контроллера - registry.addViewController(“/login”).setViewName(“login”);

А также изменим страничку hello добавив туда ссылку для разлогинивания:

Как это устроено?

В chrome нажмите Ctrl-Shift-I -> Network tab и далее заголовки httml запроса

Тоесть как только пользователь залогинился Spring Security присваивает залогиненому пользователю отдельный JSESSIONID по которому он определяет его при последующих запросах. Это все похоже на работу сессий в сервлетах. Подробнее прочитайте вот эту ссылку how-does-spring-security-sessions-work

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

Мы подумали и о ваших знакомых: пробная версия для друзей работает в полтора раза дольше, чем наши обычные пробные версии, — 45 дней.

Иногда и один в поле — воин. Расскажите друзьям, чем опасны троянцы-вымогатели, почему не стоит отвечать на письма от нигерийских принцев и что плохого в подключении к общественному Wi-Fi. А также о том, что хороший антивирус способен защитить от всего этого и многих других опасностей.

Скажу сразу, что я немного помешан на безопасности и уделяю этому вопросу серьезное внимание. Посудите сами: ты развиваешь блог, добиваешься результата. И в любой момент все может закончиться, так как на сайт залили вирус и поисковые системы его пессимизируют. Да, потом можно будет выбраться из этой ситуации, но это будет дорого стоить.

И нервы потратите и деньги потеряете. Поэтому подумайте о безопасности заранее, прежде чем неистово писать новые статьи : — )

Ранее на своем блоге я писал статью по этому вопросу и некоторые приемы я возьму из нее.

Кое-какая информация из этой заметки уже устарела. Например, плагин Limit Login Attempts может некорректно работать с версией WP 3.5.1 Читал об этом факте, но сам не сталкивался, так как давно использую другой плагин, о котором пойдет речь ниже (+ свои приемы защиты)

Итак, на что нужно обратить внимание, для повышения безопасности блога:

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

3. Устанавливаем только те плагины, которые регулярно обновляются.

4. Вы не должны заходить в админку Вордпресс как admin . Задайте имя посложнее. Например, adminmonstr12

Как изменить имя, я писал вот здесь.

Или же просто создайте нового пользователя в админке. Но там, насколько я помню, какая-то проблема с записями. Они будут перенесены на нового пользователя.

5. Своевременно обновляем и Вордпресс и плагины. (Обязательно делаем резервную копию перед такими операциями!)

6. По возможности избегайте использование FTP-клиентов. FileZilla, например, хранит пароли в открытом XML-файле. Который очень любят сканировать вирусы-трояны.

7. Ваш компьютер должен быть защищен нормальным антивирусом. Не бесплатной фигней для гиков, а нормальным антивирусом. Из долгого опыта поддержки пользователей у меня сложилось очень положительное отношение к антивирусу от Касперского. Наименьшее количество проблем я наблюдаю именно на тех машинах, где он установлен.

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

8. Удалите лишние плагины.

9. Меняем префиксы в базе данных.

11. Не используйте ворованные шаблоны или изо всяких файлопомоек.

Нормальный шаблон на themeforest стоит от 20 до 40 долларов. Это нормальная цена за отличный дизайн.

12. Естественно, пароль должен быть сложным и для входа на сам хостинг.

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

Когда я заморозил два прежних своих ГС, то мне не хотелось опять все делать вручную и стал искать плагин, который решил бы эту проблему побыстрее. В мои цели не входило со всем разбираться вручную (как здесь) и долго искал.

Я их попробовал штук пять (четыре раза блог падал!), но вот на пятый раз мне повезло.

Better WP Security

Очень хороший плагин, который в пару кликов делают работу, которую в ручном режиме опытный спец делает пару часов, а новичок пару дней.

Внимание: обязательно нужно сделать резервную копию перед установкой этого плагина.

Если не уверены, что сможете восстановиться из резервной копии, то не ставьте Better WP Security.

Этот плагин может конфликтовать с теми, которые установлены на ваших блогах. Поэтому даже если установка прошла удачно, погоняйте блог, посмотрите разные страницы — вдруг что-то вылезет.

Самое главное: убедитесь, что помните свой логин и пароль к админке. По умолчанию, он настраивается так, что дается 5 (пять) попыток на ввод верного пароля. На шестой раз следует бан.

Итак, как установить и настроить этот плагин:

Инструкция по установке и настройке iThemes Security

Вернулся к статье и добавил небольшое видео. Дело в том, что теперь плагин называется iThemes Security и появилось несколько новых функций. Особое внимание обратите на настройку, связанную с блокировкой русских символов.

Видео писал без дублей, с первого раза. Есть некоторые заминки и слова-сорняки : ) Но основной смысл понятен : )


У меня есть видеоурок по безопасности, который рекомендую посмотреть, и все станет понятно. (Речь идет о старой версии Беттер Вп Секьюрити и не только).

Если лень смотреть видео, то внимательно прочитайте инструкцию ниже.

1. Делаем резервную копию блога. (как это делается, писал вот здесь)

2. Удаляем всякий хлам в виде плагинов, которые не используете. Или пользуетесь, но видите, что толку от них нет.

3. Установка стандартная:

установка Better WP Security

После установки у вас на блоге должно появиться такое меню “Безопасность”:

image63_thumb

И потребуется простая настройка, которая сразу же решит кучу проблем безопасности:

1. Заходим в меню “Безопасность и видим следующий экран:

меню Better WP Security

Так как у вас есть резервная копия блога (так ведь? : ), то жмем на кнопку “Нет, спасибо. У меня уже есть резервная копия”

Переходим к следующему экрану:

настройка Better WP

Жмем на кнопку “Разрешить этому плагину изменять основные файлы WordPress”

И видим следующий экран:

настройка BWPS

Жмем на кнопку “Защитить мой сайт от базовых атак”

Блог задумается на некоторое время и показывает следующий экран:

панель управления

В принципе, на этом можно остановиться, так как от большинства проблем Вы защитились.

Те, кто не разбираются хорошо в Вордпресс или боится – не двигайтесь дальше, пожалуйста. Иначе пара бессонных ночей будет обеспечена.

Для тех, кто уверен в себе и знает английский, двигаемся дальше:

Если строки синие, оранжевые или зеленые, то проблем нет. Но в идеале, они должны быть все зеленого цвета.

Давайте убирать “Красные строки”, которые означают потенциальную угрозу.

1. Я сразу изменил админа на другое имя поэтому у меня надпись “The admin user has been removed.” подсвечена зеленым. Если красным, то просто измените имя на другое, но только не admin

2. “А user with id 1 still exists” подсвечено красным. Жмем на надпись “Click here to change user ID…”

На след. экране Вам будет предложено изменить ID. Соглашайтесь.

К сожалению, скриншота нет этого окна.

3. Следующая строка: “Ваш префикс не должен быть wp” Жмем на надписи рядом “Кликните здесь, чтобы переименовать его”

Этот простой шаг снизит вероятность успеха SQL-атаки.

замена префиксов БД

Так как у вас есть резервная копия, то жмем на кнопку “Изменение префикса таблицы базы данных”

Префикс автоматически будет сгенерирован. Не такой же, как в моем примере, конечно.

В моем примере префикс получился mvr9m_ В Вашем случае он может быть другим. Например, cvd7t_ (Понятно, что сейчас он совсем другой и я не “свечу” его на скриншотах”)

меняем префиксы ВордПресс

4. Your installation is not actively looking for changed files”

“Enable file change detection”

666-300x172

В чем суть: теперь к Вам на почту каждый день будет приходить сводная таблица с файлами, которые были изменены. То есть, например, изменили ваш файл .htaccess, вам свалится об этом письмо на почту.

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

Я просматриваю это письмо только на предмет изменения системных файлов. (Они в самом конце письма, как правило)

Но тем не менее:

Чтобы не переписывать названия строк на английском, пробежимся по некоторым строкам:

Буду указывать номера пунктов:

панель настроек

1. Включить применение надежных паролей. Актуально, если на блоге есть подписчики через процедуру регистрации в Вордпресс.

2. Сокрытие служебных тегов ВП. Не трогайте, если используете протокол XML-RPC

3. Скрывает информацию для пользователей-подписчиков блога, но не администраторов блога. Неактуально, если только один пользователь на блоге. Да и тот — админ.

4. Удаляет юзера admin и предлагает его переименовать. Я это делаю сразу при запуске блога и не знаю как эта штука работает в этом плагине.

5. Уже изучали этот пункт

6. Уже изучали этот пункт

7. Позволяет делать резервные копии базы данных блога и отрпавлять на е-майл. Удобно, кстати.

8. Позволяет скрыть админку. Например, уехали в отпуск на неделю и сами себя забанили на неделю (или на ночь, чтобы неповадно было : — ) Не использовал – боюсь :)

9. Подгружает блэк-лист хакеров с американского сервера и превентивно их банит. Не советую включать. Тормозит.

10. Это — полный аналог лимит-логин-аттемпт.

Внимание: если выставите слишком жесткие настройки в этом пункте, то можете сами себя забанить навеки : — ) Например, я выставил бан за 3 раза неверно набранных пароля. Так вот — бан будет не только по IP , но и для пользователя с указанным именем.

Например, мой логин adminbbvc и сложный пароль. Блокировка установлена на месяц за три неверно набранных пароля. Вы набрали неверно три раза.

Так вот в админку с этим же паролем вы попадете только через месяц. Сам себя так один раза забанил, ради эксперимента. Спасение одно — резервная копия блога.

12. Закрывает htaccess от взлома. Очень популярно у мошенников, которые воруют мобильный трафик через редирект.

13. Ни разу не трогал этот пункт.

14. Уже рассмотрели этот пункт.

Я серьезно — настроек слишком много, чтобы описать все возможности в одной заметке. Поройтесь, поэкспериментируйте и он вам точно понравится.

Например, через этот плагин я банил парсеры текста, глупого спамера, делаю регулярные копии базы данных на е-майл и массу других вещей.

Что делать?

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

Авторизация — это выдача прав (либо отказ). Происходит уже после того, как пользователь подтвердил свою идентичность. Допустим, пользователь прошел аутентификацию и хочет попасть на url:

Приложение проверяет, какие стоят права у данного пользователя, и либо впускает его, либо нет.

Например, user может зайти на url /user, а admin и на /user, и еще на другие url.

Подготовка

В прошлом примере мы настроили аутентификацию типа In-Memory, при которой пользователи хранятся в памяти приложения. Пример простой и подходящий для демонстрации настройки авторизации.

Контроллер

Но для того, чтобы настроить права (для двух пользователей), дополним контроллер еще парой методов. Итак, пусть будут две роли USER и ADMIN, а также три URL:

Контроллер теперь имеет три URL:

Пользователи (In-Memory athentication)

А настройка аутентификации (см. предыдущий пример) выглядит теперь так:

Теперь мы ввели два разрешения ROLE_USER и ROLE_ADMIN, а в прошлом примере было одно.

Вот теперь разрешения нам пригодятся — для настройки авторизации.

Настройка авторизации

Как мы видели в прошлой статье, по умолчанию Spring Security дает доступ к любому url любому аутентифицированному пользователю. Иначе говоря, если хочешь попасть на url, перенаправляешься на форму ввода пароля, и только после этого попадаешь на url.

Мы по очереди перечисляем возможные url и задаем права доступа к ним (точнее, в нашем примере — роли).

Перечисление url

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

Далее мы перечисляем не сами url (поскольку их может быть слишком много), а шаблоны. Шаблоны url задаются с помощью класса AntPathRequestMatcher .

Перечислять шаблоны надо в порядке от самых узкоохватывающих до широкоохватывающих:

Например, следующие три url подпадают под шаблон /admin/**:

Если в коде начать перечисление с всеобъемлющего шаблона /**, то перебор на нем остановится (так как любой url, в том числе /admin) соответствует шаблону /** , а значит всем будет разрешен доступ. Именно поэтому начинать нужно с узкоохватывающих шаблонов.

Настройка доступа (роли, разрешения)

Обратите внимание, что в настройках аутентификации в начале статьи мы задавали пользователям разрешение с префиксом ROLE. А в настройках авторизации доступ определяем через роль. Роль идет без префикса ROLE, таково соглашение.

Можно было задать доступ с помощью разрешений, результат был бы аналогичный:

Еще такой есть полезный метод:

Наконец, страница логина теперь генерироваться не будет, чтобы ее вернуть, допишем строку:

Если пользователь не аутентифицирован (в данном случае так будет, если в запросе либо отсутствует кукис JSESSIONID, либо он неправильный), то выполняется редирект на страницу ввода логина и пароля.

Ввод логина и пароля в форму считается аутентификцией типа Form-Based, что означает, что имя и пароль приходят в POST-запросе в параметрах username и password (такие имена параметров по умолчанию используются в Spring Security). То есть когда пользователь попадет на страницу логина и введен туда данные, на сервер пойдет новый запрос, в котором данные будут передаваться в этом самом POST.

Это устаревший и небезопасный способ.

Но суть в том, что обе эти строки указывают Spring Security, как именно он должен брать из запроса имя пользователя и пароль.

Итоги

Пример доступен на GitHub.

Также см. тут как защитить конкретные методы с помощью @Preauthorize.

Как настроить авторизацию в Spring Security: 13 комментариев

Здравствуйте, подскажите, пожалуйста, как со всеми аналогичными настройками авторизоваться через постман? json с передачей username и password в формате json (raw) и через form-data не сработали. Возвращается всегда 403

Можно сделать авторизацию на уровне методов, например, если пользователь приложения AppUser может редактировать только свой объект Thing, то аннотируем метод редактирования так:

Есть также Spring Security ACL — мощная вещь (но возможно избыточная, нужно создавать обязательные таблицы и т.д.)

1. Возможно не включили @EnableGlobalMethodSecurity(prePostEnabled = true) на главном классе.
2. @PreAuthorize рекомендуется ставить на методы сервисов

Вы очень понятно объясняете, спасибо большое за ваш труд!
2 связанных вопроса:
1. Откуда в конфиге вытаскивается информация о наличии у юзера определенной роли hadRole? Я использую jwt token, по вашему примеру делала фильтр, чтобы токен при запуске апп.проверялся, обновлялся (дата продлевается) и заново ложился в хедер реквеста перед возвратом в чейн — и дальше уже в контроллер

2. Допустим, в jwt токен есть роли в authorities. Что срабатывает раньше: наш конфиг со своими hadRole, или фильтр? А то выходит, фильтр мне обновит токен (дату, и вытащит в токен актуальные роли из бд с помощью userDetails), но секьюрити конфиг сработает раньше фильтра и не будет знать, что юзер уже админ, например

Подскажите, использую микросервисную архитектуру, и авторизация выполняется на другом сервере. У пользователя есть два токена. Токен досупа и refresh токен. Второй устаревает каждый 3 минуты. За его обновлением следит свой сервис.
Для доступа к основыным сервсам приложения пользователь в базовой аутентификации передает логин и пароль. Логи это токен доступа… пароль… refreshToken. Так как второй все время обновляется то компроментация ему не страшна.
Но есть пролблем. Спринг хеширует авторизацию. И при повторных запросах уже не проверяет ее если установлен куки JSESSIONID.
А так как токен устаревает, то проверять надо при каждом доступе к серверу.
Сейчас у меня такие настройки Spring Security

Подскажите, может еще надо что то дописать, чтоб каждый запрос проходил процедуру авторизации?

В декомпилированном BasicAuthenticationFilter нашел вот такой метод private boolean authenticationIsRequired(String username) Authentication existingAuth = SecurityContextHolder.getContext().getAuthentication();
if (existingAuth != null && existingAuth.isAuthenticated()) if (existingAuth instanceof UsernamePasswordAuthenticationToken && !existingAuth.getName().equals(username)) return true;
> else return existingAuth instanceof AnonymousAuthenticationToken;
>
> else return true;
>
>

тут он как раз проверяет необходимость повторной авторизации. Но как это мне поможет не понимаю.

Спасибо! Помогло!
У меня токен обновления живет 3 минуты. Может мне не отключать совсем сессию, а сделать у нее таймаут, пару минут. Чтоб уменьшить нагрузку на сервис авторизации?

Читайте также: