Обеспечение безопасности корпоративных данных — одна из приоритетных задач любого администратора и разработчика систем на платформе 1С:Предприятие. Начиная с версии 8.3.15, в платформу был встроен стандартный механизм двухфакторной аутентификации (2FA). Этот инструмент позволяет существенно повысить уровень защиты информационных баз, пресекая попытки несанкционированного доступа даже в случае компрометации основного пароля пользователя.
В этой статье мы подробно разберем, как устроен встроенный механизм двухфакторной аутентификации, проанализируем разницу между типами провайдеров, рассмотрим практические примеры реализации собственного провайдера на базе HTTP-сервиса 1С и изучим важные технологические улучшения, которые появились в последних версиях платформы (вплоть до 8.3.28).
Встроенный в платформу механизм двухфакторной аутентификации не требует написания сложного кода внутри конфигурации для перехвата момента авторизации. Платформа берет эту задачу на себя. Процесс аутентификации разделен на два ключевых этапа:
Важно понимать разницу между двумя поддерживаемыми типами провайдеров:
Как показывает практика и обсуждения разработчиков, наиболее простым в реализации является именно простой провайдер, так как вся логика валидации кода остается на стороне платформы.
Рассмотрим ситуацию, когда мы хотим использовать HTTP-сервис, написанный на стороне самой 1С (в этой же или в соседней базе), в качестве шлюза для отправки одноразовых кодов. Схема работы выглядит следующим образом: платформа при авторизации генерирует код, обращается к нашему HTTP-сервису, а наш сервис перенаправляет этот код пользователю (например, через Telegram или корпоративный SMS-шлюз). Для такой задачи подойдёт практический пример реализации провайдера 2FA с отправкой кодов через Telegram.
Для реализации этой схемы нам понадобятся два основных шага: настройка шаблона второго фактора в коде и создание HTTP-сервиса, обрабатывающего запросы платформы.
Разберем по шагам программную настройку шаблона второго фактора аутентификации. Для работы с шаблонами используется объект встроенного языка ШаблоныНастроекВторогоФактораАутентификации.
Пример кода для создания и назначения настроек второму фактору защиты:
// 1. Создаем или находим шаблон настроек 2FA
ШаблонНастройки = ШаблоныНастроекВторогоФактораАутентификации.СоздатьШаблон();
ШаблонНастройки.Наименование = "SMS_Авторизация_Простой";
ШаблонНастройки.ТипПровайдера = ТипПровайдераВторогоФактораАутентификации.Простой;
// Указываем адрес нашего HTTP-сервиса, который будет принимать запросы от платформы
ШаблонНастройки.Адрес = "https://my-server.ru/corp_base/hs/2fa/send";
ШаблонНастройки.МетодHTTPЗапроса = МетодHTTPЗапроса.POST;
// Формируем тело запроса. Платформа автоматически подставит значение кода вместо маркера [secret]
// Также можно передавать имя пользователя через маркер [user]
ШаблонНастройки.ТелоЗапроса = "{""user"": ""[user]"", ""code"": ""[secret]""}";
ШаблонНастройки.Заголовки.Вставить("Content-Type", "application/json");
// Записываем шаблон в базу данных
ШаблоныНастроекВторогоФактораАутентификации.Записать(ШаблонНастройки);
// 2. Назначаем созданные настройки конкретному пользователю информационной базы
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ПользовательИБ <> Неопределено Тогда
НастройкиПользователя = ПользовательИБ.НастройкиВторогоФактораАутентификации;
НастройкиПользователя.Использовать = Истина;
НастройкиПользователя.Шаблон = ШаблонНастройки;
// В данном свойстве можно передать индивидуальные данные (например, телефон пользователя)
НастройкиПользователя.ДополнительныеПараметрыАдреса = "phone=+79991112233";
ПользовательИБ.Записать();
КонецЕсли;
Теперь проанализируем структуру HTTP-сервиса, который будет принимать этот запрос. В конфигурации необходимо создать HTTP-сервис с именем 2fa и шаблоном URL send, обрабатывающим метод POST.
Пример кода метода-обработчика в модуле HTTP-сервиса:
Функция ОтправитьКодПодтверждения(Запрос)
// Читаем тело запроса, отправленное платформой 1С
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
ДанныеЗапроса = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
ИмяПользователя = ДанныеЗапроса.user;
КодПодтверждения = ДанныеЗапроса.code; // Это тот самый "secret", сгенерированный платформой
// Получаем дополнительные параметры (например, номер телефона из URL)
ПараметрыЗапроса = Запрос.ПараметрыЗапроса;
НомерТелефона = ПараметрыЗапроса.Получить("phone");
// Здесь должна быть логика отправки SMS или сообщения в мессенджер
РезультатОтправки = ИнтеграцияСВнешнимиСервисами.ОтправитьSMS(НомерТелефона, "Код подтверждения входа в 1С: " + КодПодтверждения);
Ответ = Новый HTTPСервисОтвет(200);
Если РезультатОтправки Тогда
Ответ.УстановитьТелоИзСтроки("{""status"": ""success""}");
Иначе
Ответ.УстановитьТелоИзСтроки("{""status"": ""error""}");
Ответ.КодСостояния = 500;
КонецЕсли;
Возврат Ответ;
КонецФункции
Если в ранних версиях платформы (8.3.15–8.3.17) функционал двухфакторной аутентификации содержал ряд жестких ограничений, то к версии 8.3.28 фирма «1С» проделала огромную работу по его улучшению. Рассмотрим ключевые нововведения:
+7 903 xxx-xx 55), чтобы пользователь понимал, куда именно отправлен секретный код.Для тех компаний, которые хотят внедрить двухфакторную аутентификацию оперативно и «без лишних телодвижений» (то есть без самостоятельного программирования HTTP-сервисов и интеграций с провайдерами связи), существуют отличные альтернативные решения:
.cfe), реализующие авторизацию по протоколу TOTP с выводом QR-кода прямо в интерфейсе программы при первой настройке пользователя.Используя встроенные механизмы платформы 1С или готовые интеграционные решения, вы сможете защитить свою систему от несанкционированного доступа быстро, надежно и в полном соответствии с современными стандартами информационной безопасности. При необходимости можно воспользоваться готовым автономным решением для реализации TOTP-аутентификации на встроенном языке.