Безопасность сайта

Двухфакторная аутентификация в Битриксе: включаем и не теряем доступ

Как настроить 2FA в Битрикс Управление сайтом и Битрикс24, что делать при потере телефона и как не заблокировать себе админку.

13 минут чтения 4 Дмитрий Акиндинов
Содержание
  1. Что второй фактор закрывает, а что нет
  2. Где в Битриксе лежат одноразовые пароли
  3. Чем быть вторым фактором
  4. Порядок включения, при котором вы не запрёте себя снаружи
  5. Обязательный OTP для группы администраторов
  6. Потеряли телефон: как вернуть доступ
  7. Код правильный, а Битрикс его не принимает
  8. Что настроить рядом, чтобы был толк
  9. Когда 2FA включать не стоит
  10. Что сделать на этой неделе
  11. Частые вопросы

Одноразовые пароли в Битриксе включают в настройках модуля безопасности, но сначала заводят себе запасной путь: второго администратора с 2FA и сохранённые резервные коды. Иначе смена телефона через восемь месяцев превращается в разбор через консоль.

Двухфакторная аутентификация в Битриксе запирает админку надёжно, а открывается обратно тяжело. Типичная история: владелец включил одноразовые пароли, поставил приложение на телефон, через восемь месяцев сменил телефон, приложение не перенёс. Теперь он смотрит на поле ввода шестизначного кода, взять который неоткуда. Ниже разбираю, где 2FA включается в Битрикс Управление сайтом и в Битрикс24, как включить её без риска запереть себя снаружи, что делать при потере телефона и какие соседние настройки дают больше пользы, чем сам второй фактор.

Смартфон с одноразовым кодом рядом с формой входа в админку Битрикса

У меня в обслуживании несколько десятков сайтов, из них полтора десятка на Битриксе. Одноразовые пароли включены примерно на половине. Не на всех, и это осознанное решение: на части проектов второй фактор создаёт больше риска потерять доступ, чем закрывает риска взлома. Про это тоже скажу отдельно.

Что второй фактор закрывает, а что нет

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

2FA хорошо закрывает четыре сценария:

  • Перебор пароля по форме /bitrix/admin/. Боты долбят её круглосуточно, у клиента с посещаемостью 200 человек в сутки я видел 12 тысяч попыток входа за неделю. С включённым OTP знание пароля перестаёт что-либо давать.
  • Утечка пароля из чужого сервиса. Владелец использовал тот же пароль на форуме, форум слили, пароль всплыл в комбо-листе. Классика, встречаю раз в квартал.
  • Пароль, оставшийся у бывшего сотрудника или подрядчика. Учётку забыли отключить, но телефона с генератором у человека нет.
  • Подсмотренный пароль. Кто-то заглянул через плечо в коворкинге или увидел его в переписке.

И вот чего второй фактор не сделает, сколько его ни включай:

  • Не поможет, если в /upload/ уже лежит веб-шелл. Скрипт работает мимо авторизации вообще.
  • Не закроет дыру в стороннем модуле с Маркетплейса. Уязвимости в компонентах отдают данные без входа в админку.
  • Не защитит украденную сессионную куку. Сессия уже прошла аутентификацию, второй фактор к ней не применяется повторно.
  • Не касается FTP, SSH и панели хостинга. Там свои пароли и свои двери.
  • Не спасёт от слитого ключа обмена с 1С или от вебхука Битрикс24 с широкими правами.

Если общая логика второго фактора для админки вам пока не очень понятна, начните с обзорной статьи про двухфакторную аутентификацию для админки, там разобраны сами принципы без привязки к CMS. Здесь дальше идёт конкретика по Битриксу.

Где в Битриксе лежат одноразовые пароли

Битрикс называет эту функцию не 2FA и не OTP-авторизацией, а «одноразовые пароли». Живёт она в модуле «Проактивная защита», то есть в модуле security.

Битрикс Управление сайтом

Путь в админке: Настройки, дальше Проактивная защита, дальше Одноразовые пароли. Прямой адрес страницы настроек:

/bitrix/admin/security_otp.php

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

ls -d /var/www/site/bitrix/modules/security
mysql -u USER -p BASE -e "SELECT ID, ACTIVE FROM b_module WHERE ID='security';"

Дальше логика простая. На странице модуля включается общий рубильник и задаются параметры: тип генерации кода, окно синхронизации, длина кода, обязательность для выбранных групп пользователей. Отдельно каждый пользователь подключает генератор в своей карточке: Настройки, Пользователи, Список пользователей, открыть карточку, вкладка «Одноразовые пароли». Там появляется QR-код, который сканируется приложением.

Битрикс умеет два режима генерации: по времени (TOTP, код меняется каждые 30 секунд) и по событию (HOTP, код меняется по счётчику нажатий). По умолчанию сейчас включают TOTP, он совместим с любым стандартным приложением. Режим по счётчику выбирают редко, и я его не советую: счётчик рассинхронизируется, если пользователь нагенерил кодов в приложении просто из любопытства.

Приложение подойдёт любое: Bitrix24 OTP, Яндекс Ключ, Google Authenticator, Aegis, 2FAS, KeePassXC или Bitwarden со встроенным генератором. Про выбор скажу ниже, он важнее, чем кажется.

Битрикс24

В облачном Битрикс24 это раздел Настройки, дальше Безопасность, дальше двухэтапная авторизация. Доступность зависит от тарифа: на бесплатном её нет, на платных включается администратором портала. Он же может сделать её обязательной для всех сотрудников или только для отдела с доступом к CRM.

В коробочной версии всё то же самое, плюс доступны настройки модуля security из админки продукта, потому что коробка это тот же Битрикс с админкой на /bitrix/admin/.

Важное отличие облака от коробки: в облаке у вас нет доступа к базе. Если единственный администратор портала потерял и телефон, и резервные коды, дорога одна, в поддержку Битрикс24 с подтверждением прав на портал. Это платёжные документы, доступ к почте владельца, иногда скан паспорта ИП. Занимает от суток до недели. В коробке и в Управлении сайтом всё решается за 15 минут через консоль, о чём дальше.

Чем быть вторым фактором

Здесь чаще всего ошибаются, поэтому сведу варианты в таблицу. Оценки мои, по опыту эксплуатации у клиентов малого бизнеса.

Второй факторРаботает в БитриксеСтоимостьРиск потери доступаКомментарий
Приложение TOTP на телефонеДа, штатно0 руб.Высокий, если нет экспорта секретаОсновной вариант, но выбирать приложение с бэкапом
Секрет TOTP в менеджере паролейДа, штатно0 руб. или подписка от 300 руб./месНизкийМой выбор для владельцев сайтов
Резервные кодыДа, выдаются при подключении0 руб.Средний, теряются в перепискеХранить оффлайн, не в чате с подрядчиком
SMS с кодомНет штатной поддержки, только доработкаот 4 руб. за сообщениеСреднийПеревыпуск SIM обходит защиту, я против
Код на почтуНет штатной поддержки0 руб.СреднийПочта обычно защищена хуже админки
Аппаратный ключ U2F/FIDO2Нет в БУС, есть в Битрикс24 через SSOот 3 500 руб. за ключНизкий при двух ключахОправдан для порталов с персданными

Отдельно про SMS. В Битрикс Управление сайтом штатной отправки одноразового пароля в SMS нет, её делают доработкой через события модуля security или через сторонний модуль Маркетплейса. Тратить на это деньги я не советую по простой причине: восстановление SIM-карты по доверенности или через мошенническую замену остаётся живой схемой. Приложение-генератор бесплатно и надёжнее.

Порядок включения, при котором вы не запрёте себя снаружи

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

  1. Заведите второго администратора заранее. Отдельная учётка с полными правами, привязанная к почте владельца бизнеса, а не подрядчика. Пароль в менеджере паролей у владельца.
  2. Проверьте доступ к базе и файлам. Панель хостинга, phpMyAdmin или SSH должны открываться прямо сейчас, а не «где-то был пароль». Это ваш аварийный люк.
  3. Сделайте бэкап базы. Пять минут работы, которые спасают, если что-то пойдёт не так с таблицами модуля.
  4. Подключите OTP сначала себе, не трогая обязательность для групп. Проверьте вход в новой сессии инкогнито.
  5. Сохраните секрет, а не только QR-код. Под QR-кодом Битрикс показывает текстовый ключ вида JBSWY3DPEHPK3PXP. Этот ключ, а не картинка, восстанавливает генератор на любом новом телефоне.
  6. Запишите резервный код, который выдаётся при активации. Не в переписку, не в заметки телефона, у которого вы и теряете доступ.
  7. Подключите OTP второму администратору, с другого телефона.
  8. Только теперь включайте обязательность для группы администраторов.

Пункт 5 люди пропускают чаще всего. Сфотографировали QR-код, потеряли телефон вместе с фотографией, приехали. Текстовый секрет живёт в менеджере паролей и переживает любую смену устройства. Где такие вещи хранить и почему не в заметках браузера, я разбирал в статье про то, где хранить пароли от админки.

Отдельно про пункт 1. Сайт с одним человеком, который знает все доступы, это классическая проблема автобусного фактора: под машину никто попадать не собирается, а вот потерять телефон, уехать в отпуск без связи или просто рассориться с подрядчиком случается регулярно. Про то, как разложить доступы, чтобы бизнес не зависел от одной головы, есть отдельный разбор.

Обязательный OTP для группы администраторов

В настройках модуля есть параметр «Обязательное использование одноразовых паролей» со списком групп и числом дней на подключение. Работает так: пользователь из выбранной группы входит по паролю, видит экран с QR-кодом и требованием подключить генератор. Если поставить срок в днях, он сможет отложить настройку на указанный период, а потом вход без OTP закроется.

Ставьте отсрочку 3 дня, если администраторов больше двух. Ноль дней хорош только тогда, когда вы физически рядом с каждым, кому это включаете. Иначе бухгалтер зайдёт в понедельник утром с рабочего компьютера, увидит QR-код, не поймёт, что от неё хотят, и вы получите звонок с претензией вместо настроенной безопасности.

Что стоит проверить до включения обязательности:

  • Есть ли в группе администраторов служебные учётки, под которыми работают скрипты обмена или интеграции. Им OTP сломает авторизацию.
  • Не заходит ли кто-то в админку через сохранённую сессию в браузере на кассе или планшете в зале. После включения сессия рано или поздно кончится, и человек останется на улице.
  • Работают ли внешние сервисы под учёткой администратора. Выгрузки в маркетплейсы, интеграции с 1С, парсеры остатков.

Служебным учёткам одноразовые пароли не нужны. Их надо выносить в отдельную группу с урезанными правами и ограничением по IP, а не тащить в администраторы.

Потеряли телефон: как вернуть доступ

Три способа, от самого мягкого к самому грубому. Все три я применял на живых проектах.

Резервный код

Битрикс при активации OTP выдаёт одноразовый код восстановления. На форме входа вместо кода из приложения вводится он. После этого генератор отвязывается, и вы подключаете новый телефон заново. Работает ровно один раз, поэтому сразу выпишите новый.

Сброс через API модуля

Если резервного кода нет, а доступ к файлам сайта есть, кладём в корень сайта временный скрипт и открываем его один раз.

<?php
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

use BitrixMainLoader;
use BitrixSecurityMfaOtp;

Loader::includeModule('security');

$userId = 1; // ID вашей учётки в b_user

$otp = Otp::getByUser($userId);
$otp->deactivate();
$otp->save();

echo 'OTP для пользователя ' . $userId . ' отключён';

Дальше три обязательных шага, которые забывают в панике: удалить файл с сервера, войти в админку, подключить генератор заново. Скрипт, оставшийся в корне, отключает второй фактор кому угодно, кто угадает его имя. Имя, соответственно, берите не otp.php, а что-то невнятное вроде tmp-9f3c1a.php.

Если ID своей учётки вы не знаете, он смотрится в базе одним запросом:

SELECT ID, LOGIN, EMAIL, ACTIVE FROM b_user WHERE LOGIN = 'admin';

Прямая правка базы

Крайний вариант, когда PHP-скрипт по каким-то причинам не отрабатывает (например, модуль ругается на лицензию). Настройки OTP хранятся в таблице b_security_user.

-- сначала посмотреть, что там вообще есть
SELECT USER_ID, ACTIVE, INITIAL_DATE FROM b_security_user WHERE USER_ID = 1;

-- отключить второй фактор конкретному пользователю
UPDATE b_security_user SET ACTIVE = 'N' WHERE USER_ID = 1;

Перед этим делайте дамп базы, а после обязательно чистите кеш Битрикса, иначе настройки прочитаются из /bitrix/cache/ и вы решите, что запрос не сработал:

mysqldump -u USER -p BASE b_security_user > /home/backup/b_security_user.sql
rm -rf /var/www/site/bitrix/cache/* /var/www/site/bitrix/managed_cache/*

Ещё раз: это операция про доступ к вашему собственному сайту, и она означает, что любой, у кого есть доступ к базе, обходит ваш второй фактор за минуту. Вывод из этого не «2FA бесполезна», а «пароль от панели хостинга и от базы должен быть сильнее, чем пароль от админки».

Код правильный, а Битрикс его не принимает

Отдельный жанр обращений. Приложение показывает шесть цифр, вы их вводите, Битрикс отвечает, что пароль неверный. Причины по частоте:

  1. Разошлись часы. TOTP считает код от текущего времени. Если время на сервере или на телефоне уехало больше чем на окно синхронизации, коды не совпадут никогда. Проверяется так:
date -u
timedatectl status | grep -i synchronized
php -r 'echo date("c"), PHP_EOL;'

На shared-хостинге timedatectl недоступен, там сверяйте вывод php -r с точным временем и пишите в поддержку хостинга, если разница больше минуты. В настройках модуля есть параметр окна синхронизации, увеличивать его до больших значений не надо: это прямое ослабление защиты.

  1. Телефон в другом часовом поясе после поездки. Внутри TOTP время в UTC, но некоторые приложения криво обрабатывают ручную установку времени. Включите на телефоне автоматическое определение времени и перезапустите приложение.
  1. Отсканирован старый QR-код. Если вы пересоздавали привязку, приложение хранит оба секрета и вы читаете код не из той строки. Удалите лишние записи.
  1. Режим по счётчику ушёл вперёд. Тот самый HOTP. Лечится переподключением генератора.
  1. Пользователь вводит код из другого сервиса. Смеяться не надо, у меня было дважды: в приложении лежали Госуслуги, Битрикс и почта, человек читал верхнюю строку.

Что настроить рядом, чтобы был толк

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

  • Ограничение попыток входа. В Битриксе за это отвечает «Контроль активности» в проактивной защите и штатная блокировка после серии неудач. Настройки логики перебора и почему одного OTP мало, разобраны в статье про то, как ограничить попытки входа в админку.
  • Защита административного раздела по IP. В том же модуле проактивной защиты есть привязка админки к списку сетей. Если у офиса статический IP, это сильнее любого второго фактора. Тем же занимается веб-сервер:
# .htaccess в /bitrix/admin/
<RequireAny>
  Require ip 203.0.113.0/24
  Require ip 198.51.100.17
</RequireAny>
  • Политика паролей на уровне группы. Настройки, Пользователи, Группы пользователей, карточка группы, вкладка с настройками безопасности. Там задаются минимальная длина, обязательные символы, срок действия пароля, число запоминаемых старых паролей и время жизни сессии. Ставлю длину 12, срок 180 дней, историю на 3 пароля.
  • Привязка сессии к IP и к User-Agent. Помогает против угона куки, но ломает жизнь тем, кто работает с мобильного интернета с прыгающим адресом. Включаю выборочно.
  • Журнал вторжений. Пишет попытки эксплуатации, помогает понять, что вас щупают, до того, как пролезли.
  • Контроль целостности файлов. Раз в месяц запускать вручную, это честные 5 минут работы и хороший способ заметить чужой файл.

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

Когда 2FA включать не стоит

Мнение непопулярное, но за шесть лет я к нему пришёл. Есть проекты, где одноразовые пароли приносят вреда больше, чем пользы.

Сайт-визитка на Битриксе, в админку заходят два раза в год, чтобы поменять телефон в шапке. Владельцу 60 лет, приложений-генераторов на телефоне нет и не будет. В такой конфигурации 2FA гарантированно превратится в потерянный доступ и вызов подрядчика за деньги. Здесь честнее сделать длинный пароль в менеджере, ограничить админку по IP и настроить блокировку перебора.

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

В обоих случаях я предлагаю компромисс: 2FA для учётки владельца и подрядчика, обычный вход для остальных с урезанными правами. Безопасность это не про максимум галочек, а про то, чтобы система пережила реальное поведение людей.

Что сделать на этой неделе

Короткий план, который занимает час.

  1. Зайдите в /bitrix/admin/security_otp.php и посмотрите, включён ли модуль вообще.
  2. Заведите второго администратора и убедитесь, что доступ к базе и панели хостинга у вас на руках.
  3. Подключите генератор себе, сохранив текстовый секрет и резервный код в менеджер паролей.
  4. Проверьте вход в режиме инкогнито, до того как включать обязательность для группы.
  5. Заодно включите ограничение админки по IP и проверьте политику паролей группы.

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

Частые вопросы

Как включить двухфакторную аутентификацию в Битриксе

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

Что делать, если потерян телефон с приложением

Войти по резервному коду, если он сохранён. Если нет, второй администратор снимает привязку в профиле. В крайнем случае одноразовые пароли отключают через консоль на сервере, это минут пятнадцать.

Почему код не принимается

Чаще всего разошлись часы: сервер и телефон должны совпадать по времени. Допустимое отклонение около 30 секунд в каждую сторону, дальше коды не сходятся. Второй вариант это приложение, привязанное к старому профилю.

Второй фактор защищает от всего

Нет. Он закрывает подбор пароля и вход по утёкшим данным, но не спасает от уязвимости в модуле, от заражённых файлов на сервере и от доступа по FTP. 2FA это один слой, а не вся защита.

Передайте техническую часть в надёжные руки.

Слежу за хостингом, бэкапами и обновлениями. Когда что-то пойдёт не так – звоните мне, не своему программисту, не в спортзал и не маме.

Короткие вопросы по теме

Все вопросы по теме "Безопасность сайта"

Заявка

Обсудим задачу

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

Куда удобнее ответить?