gifts2017

Двухфакторная аутентификация в 1С

Опубликовал Юрий К (Юрий-К) в раздел Программирование - Защита и шифрование

Двухфакторная аутентификация (2FA) — это механизм, который позволяет защитить ваш аккаунт надежнее, чем традиционный пароль.
Пароль должен быть сложным, при этом его нужно всегда помнить, хранить от посторонних глаз и достаточно часто менять. Но даже если вы принимаете все меры, пароль все равно остается уязвимым — например, для вирусов, которые могут перехватить то, что вы набираете на клавиатуре.

На днях переводил свои аккаунты на двухфакторную авторизацию, решил использовать авторизацию через одноразовый пароль, генерируемый приложением,   авторизацию по SMS  оставил на крайний случай, не хотелось зависеть от оператора связи. Полистал интернет,  а тема-то, оказывается, в полном разгаре: практически все сервисы используют 2ФА. 

Вот неполный перечень ресурсов с 2ФА  https://twofactorauth.org/.

Идея очень неплохая, когда к первому фактору "Знание" (знание пароля), добавляется еще один фактор "Владение": владение телефоном, приложением, генерирующим одноразовые пароли, специальным аппаратным токеном, генерирующим пароли, и т.д.

Посмотрел, как обстоят дела в 1С , честно поискал и  не нашел. Решил исправить этот недочет. 

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

Основные функции, которые потребовались:

Функция HMAC( Знач Ключ, Сообщение ) Экспорт
Функция ПолучитьТОТП ( Ключ, ДлинаПароля ) Экспорт

HMAC (сокращение от англ. hash-based message authentication code, код аутентификации (проверки подлинности) сообщений, использующий хеш-функции)— в информатике (криптографии), один из механизмов проверки целостности информации, позволяющий гарантировать то, что данные, передаваемые или хранящиеся в ненадёжной среде, не были изменены посторонними лицами (см. человек посередине). Механизм HMAC использует MAC, описан в RFC 2104, в стандартах организаций ANSI, IETF, ISO и NIST. MAC — стандарт, описывающий способ обмена данными и способ проверки целостности передаваемых данных с использованием секретного ключа. Два клиента, использующие MAC, как правило, разделяют общий секретный ключ. MAC — надстройка над MAC; механизм обмена данными с использованием секретного ключа (как в MAC) и хеш-функций. В зависимости от используемой хеш-функции выделяют HMAC-MD5, HMAC-SHA1, HMAC-RIPEMD128,

TOTP (Time-based One Time Password Algorithm, RFC 6238.) — OATH-алгоритм создания одноразовых паролей для защищенной аутентификации, являющийся улучшением HOTP (HMAC-Based One-Time Password Algorithm). Является алгоритмом односторонней аутентификации — сервер удостоверяется в подлинности клиента. Главное отличие TOTP от HOTP это генерация пароля на основе времени, то есть время является параметром. При этом обычно используется не точное указание времени, а текущий интервал с установленными заранее границами (например, 30 секунд).

Кодирование и декодирование строк  в Base32 (base64 есть в 1С, но она не подходит)

Функция СтрокаВСтроку32( знач вхСтрока ) Экспорт
Функция Строка32ВСтроку( Знач вхСтрока ) Экспорт

Для битовых операций использовал часть отсюда http://infostart.ru/public/99739/, часть дописал.

Все в одной  обработке, с  подключением к конфигурации не заморачивался, тут уже смотрите по месту. Принцип внедрения такой:  в справочнике  Пользователи добавляется реквизит Ключ, тип строка, и пара команд. Защита ревизита Ключ ролями, дополнительным шифрованием - это уже на совести (паранойе) разработчика. Одной командой вызывается форма генерации Секретного ключа,  второй очищается. На обработку в составе конфигурации тоже раздать права,  например, в роль БазовыеПрава. 

&НаКлиенте
Процедура ОтключитьДвухфакторнуюАвторизацию(Команда)
	Объект.Ключ = "";
КонецПроцедуры

&НаКлиенте
Процедура ПодключитьДвухФакторнуюАвторизацию(Команда)

    ОткрытьФорму("Обработка.ДвухфакторнаяАутентификация.Форма.ФормаСоздания",,,,,,
	Новый ОписаниеОповещения("ОбработкаКомандыЗавершения2ФАвторизации", ЭтаФорма ),
	РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс );

КонецПроцедуры
&НаКлиенте
Процедура ОбработкаКомандыЗавершения2ФАвторизации( Результат, ДополнительныеПараметры ) Экспорт
	Если ЗначениеЗаполнено(Результат) тогда
		Объект.Ключ =Результат;
	КонецЕсли;	
КонецПроцедуры

Далее например ПриНачалеРаботыСистемы или в ОбщегоНазначенияКлиентПереопределяемые.ПриНачалеРаботыСистемы 

Вызов формы проверки, если Ключ на пользователе пустой, то 2ФА по нему не включена, иначе ждем ввода одноразового пароля. Сразу проговорю, это все только демонстрация, как лучше это подойдет к конкретной конфе, смотрите по месту, с этой целью сделал демо на демоконфигурации БСП 2.3.2.45.

Процедура ПриНачалеРаботыСистемы()
	
	// СтандартныеПодсистемы
	СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы();
	// Конец СтандартныеПодсистемы
	
	ОткрытьФорму("Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки",,,,,,	,
		РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс );
	

КонецПроцедуры

БСП 2.3.2.45 ,  отчасти  выбрал, т.к. там уже есть поддержка QRкода. Можно, конечно, без считывания обойтись,  но в смартфон вводить достаточно длинный ключ немного утомительно.

Теперь как передать секретный ключ,  вы  уже поняли, нужно отсканировать в одном из приложений генераторов паролей на андроиде или ios. Приложений полно, Google Authenticator,  Яндекс.Ключ,  FreeOTP Authenticator. В последнем, кстати, масса настроек и есть возможность сменить, например, функцию хеширования базового алгоритма  с SHA1 на другую (обработку тоже придется подправить в паре строк).  Как только приложение начнет возвращать одноразовые пароли, его нужно подтвердить в форме, и если он будет принят, записать элемент справочника. Время на сервере и устройстве с генератором паролей должно быть синхронизировано! Можно слегка ослабить алгоритм и проверять пароль от прошлого, текущего раунда генерации, или просто увеличить период раунда с 30 секунд по умолчанию. 

Скажете, не у всех бухгалтеров и менеджеров смартфоны и айфоны? Пожалуйста, есть и для старых телефонов (гугл в помощь что-то вроде GoogleAuthenticatorJ2ME_1.2.0.jar и есть в виде аппартных токенов  типа https://ru.wikipedia.org/wiki/SecurID.

Все основано на https://ru.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

Опишу подробнее порядок работы. (Тем кто включал 2ФА в почтовых и других аккаунтах можно не читать.)

1. Создание

1.1. Включаем Двухфакторную на пользователе командой 1С.

Генерируем  секретный ключ.

Создание секретного ключа  

1.2. Устанавливаем на телефон одно из приложений Google Authenticator,  FreeOTP Authenticator итп

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

Приложение начинает генерировать одноразовые пароли именно для вашего ключа.

 Генератор создает одноразовые пароли по вашему ключу а если вы занесли ключ в брелок то увидите чтото вроде Брелок создает одноразовые пароли

Если вы верно введете пароль в форму 1.1 то форма закроется осталось только сохранить элемент справочника Пользователи.

Время на устройстве и 1С желательно синхронизировать.

Все .

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

окно для ввода одноразового пароля при 2ФА

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

Скачать файлы

Наименование Файл Версия Размер
Двухфакторная аутентификация.epf 27
.epf 13,73Kb
16.02.16
27
.epf 13,73Kb Скачать
БСП Демо 14
.dt 74,13Mb
16.02.16
14
.dt 74,13Mb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Кирилл Царев (tkv44) 17.02.16 09:59
Интересная тема. Спасибо автору за исследование.
В 1С нет подобного, т.к. отсутствует необходимость. Двухфакторная аутентификация нужна там, где проходной двор. А бухгалтеры обычно сидят во внутренней ЛВС, в отдельном кабинете с усиленной дверью (ибо касса тоже рядом). Внедрив подобное, можно заработать много очков в минус карме от тех же бухгалтеров, кому нужен лишний геморрой при входе в программу.
2. Дмитрий Жиляков (Zhilyakovdr) 17.02.16 10:39
(1) tkv44, Тема действительно интересная, а применять двухфакторную аутентификацию можно например при работе через веб клиент и предоставлении доступа сторонним лицам.
3. Юрий К (Юрий-К) 18.02.16 07:30
(1) tkv44, (2) Zhilyakovdr,
Спасибо за оценку, на выходных, возможно, в конце статьи размещу пару-тройку скриншотов , чтобы прояснить как заводить секретный ключ в телефон( один человек подсказал),
сильно подозреваю, что тем кто не пробовал двухфакторную аутентификацию через приложение тяжело понять с ходу преимущества.
Меня это "очень сильное колдунство" просто заворожило )).
А вообще вы правы для веб интерфейса это самое то. Если открыт доступ снаружи без дополнительных мер защиты. Защита паролем слаба, угонят пароль на раз, особенно если заходят из "опасных" мест. Также очевидно, что можно использовать этот принцип не на начальной авторизации, а уже внутри программы для доступа например к проведению определенных документов итд.
Вообще функцией HMAC( Знач Ключ, Сообщение ) как раз таки и можно формировать подписи любых данных тк это "..один из механизмов проверки целостности информации, позволяющий гарантировать то, что данные, передаваемые или хранящиеся в ненадёжной среде, не были изменены посторонними лицами..." она же выполняет отчасти некоторое исправление против слабых(коротких) ключей и слабых(коротких) сообщений. Хотя для этих целей в 1С есть более продвинутый объект МенеджерКриптографии.
4. Айрат (Craig) 18.02.16 14:17
(0) тема интересная (в декабре была подобная задачка, пока ее временно отложил), опишите пожалуйста как выглядит процесс. Вот пользователь подошел к компьютеру, включил компьютер, ввел пароль от windows, дальше запускает 1с и что происходит далее? так же интересует вопрос возможно ли навесить определенное ограничение на доступ? К примеру, у пользователя нет прав на проведение документа, а тут пришел админ с волшебной флешкой и провел документ через рабочее место пользователя.
5. Игорь <...> (I_G_O_R) 23.03.16 21:34
Я правильно понимаю, что когда открывается форма "Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки" пользователь фактически залогинен и ему осталось закрыть это окно, чтобы можно было продолжить работать?
6. Юрий К (Юрий-К) 28.03.16 07:05
(5) I_G_O_R,
Если он его закроет закроется 1С. Он должен либо ввести корректный одноразовый пароль который все время меняется либо не зайдет.
7. Игорь <...> (I_G_O_R) 29.03.16 01:47
(6) Форму можно закрыть без последствий, или даже вообще не открывать, в браузере можно выполнить свой javascript, ну или подменить javascript. Для взломщика это не будет проблемой, значит толку от такой защиты нет совсем. Чтобы защита реально работала, нужно использовать РЛС в зависимости от параметра сеанса, а значение параметра сеанса должно зависеть от ввода кода.
8. Юрий К (Юрий-К) 04.04.16 08:46
(7) I_G_O_R,
Во первых здесь рассматривается механизм работы с одноразовыми паролями, связка 1С - генераторы паролей. как вы в дальнейшем это используете ограничено только вашей фантазией.
можете даже
...использовать РЛС в зависимости от параметра сеанса, а значение параметра сеанса должно зависеть от ввода кода


во вторых Вы сможете обойти примитивнейшее?
ОткрытьФорму("Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки",,,,,,    ,        РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс ); 

и событие
&НаКлиенте
Процедура ПриЗакрытии()
	Если не АвторизацияПройдена тогда
		ЗавершитьРаботуСистемы (Ложь);
	КонецЕсли;
КонецПроцедуры
...Показать Скрыть
? Самому интересно посмотреть, про SSL не забудьте. )).

и еще напомню это вторая часть авторизации первую стандартную никто не отменял.
9. Ридван (утюгчеловек) 29.04.16 10:35
(8) Юрий-К,

во вторых Вы сможете обойти примитивнейшее? ...


Разумеется. Не трогаем форму 2ФА, жмем F1 - открываем справку. Жмем "перейти по ссылке", набираем что-то типа "e1cib/list/Справочник.Справочник1". Работаем со справочником.
Взял отсюда: http://forum.infostart.ru/forum87/topic150805/.

Это говорит только о том, что решение должно быть чуточку сложнее. Но в целом - мне лично понравилось. Жму звезду.
10. Юрий К (Юрий-К) 17.05.16 08:20
(9) утюгчеловек,
Это говорит только о том, что решение должно быть чуточку сложнее. Но в целом - мне лично понравилось. Жму звезду.


это говорит что у меня и у 1С разные понимания ключа
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
, думаю что рано или поздно 1С исправит этот недочет.
За звезду спасибо!