“Забыв логины и пароли
мы чушь прекрасную пороли”
Федор Иващенко (C)
— Скажи пароль!
— Что?
— Не тот.
— Сейчас же откройте!
— Вообще не тот.
Рапунцель: Запутанная история (Tangled)
Небольшое предисловие, чтобы было понятно откуда ноги растут. Да-да, ноги растут из этого самого места. И вроде бы несложная задача превратилась в этакий квест. Итак, есть система учета заказов на 1С, необходимо пустить в нее дилеров. Создание интерфейса для дилеров, как и разграничение прав особых проблем не вызывало. Но потом выяснилось, что есть нюансы.
Вот список этих «нюансов»
- Дилеры не должны видеть список пользователей 1С. Многие знания – многие печали.
- Дилер может войти только под собой и не под кем иным. Даже если менеджер сольет свой пароль.
- Система доступа должна быть закрытой от брутфорса. В 1С нет встроенной защиты от перебора паролей, а народ нынче ушлый. А информация в системе достаточно интересная для определенной категории лиц.
- Необходимо жестко привязать пользователя к чему-то. Т.е. просто связка логин-пароль не прокатит. Нужен какой-то признак, что это именно тот пользователь.
- Обмен должен осуществляться по HTTPS. Это уже стандарт – обмен через каналы общего пользования – значит шифрование. Но 1С в нашем случае не смотрит наружу и не имеет внешнего адреса.
Вариантов решения несколько. Самый простой – ВПН. Правда нюансы все портят и выходит, что ВПН – не вариант. К тому же, это внешние пользователи. Т. е. необходимо обеспечить работоспособность без установки ПО и вмешательства системных администраторов.
Так родилась идея. А что если реализовать аутентификацию на nginx. Там мы можем творить, что пожелаем. А уж когда мы идентифицируем пользователя, мы его пустим в 1С. А чтобы не было сомнений, что этот то, кто нам нужен, мы привяжем пользователя 1С к его мобильному телефону. А пароль сделаем одноразовым.
Посидели, покумекали и у нас все получилось.
Дилер заходит на страничку авторизации. Средствами nginx выводится страница для ввода логина и пароля:

Логин Дилер получает от своего менеджера. А менеджер получает его от нас. Далее Дилер набирает специальный номер. И ему голосом диктуется одноразовый пароль из 6 цифр. И начинает работать связка логин-пароль. До звонка этой связки просто не существовало. Чтобы звонок был бесплатным циферки диктуются вместо гудков вызова, т. е. без поднятия трубки с нашей стороны. Астерикс и так умеет. Ну, с нашей помощью, конечно. Можно пароль рассылать через СМС, но это деньги, а хотелось на халяву. Можно пароль посылать в мессенджеры, но их так много разных. Наш вариант будет работать даже у Нео на Nokia 8110.
После авторизации включается прокси для данного конкретного окна браузера, а пароль обнуляется. Т.е. далее данная связка логин-пароль не существует. Модуль ngx_http_upstream_module пробрасывает входящие запросы на внутренний веб-сервер.А в заголовки запросов подставляются параметры авторизации 1С, которые привязаны к данному логину и телефону. Там не все получилось сразу, 1С очень скупа на техническую информацию, но мы были очень упорны и уговорили 1С жрать авторизацию из заголовков. 1С просто не знала с кем связалась.
Если набрать номер с левого телефона, то в ответ будет тишина и одноразовый пароль не будет сгенерирован. Т. е. Дилер может запросить пароль только с определенного телефона и этот телефон связан с определенным логином. А это логин связан с пользователем 1С.
Таким образом мы закрыли все вопросы
- Дилер знает только свой логин в системе авторизации nginx. Список пользователей 1С не выводится.
- Дилер со своего телефона может авторизоваться только под собой. Без вариантов. К каждому логину привязан только один телефон.
- До звонка связки логин-пароль вообще не существует, поэтому ее невозможно подобрать. На ввод пароля Дилеру дается 5 минут, после это пароль обнуляется и его надо запрашивать снова.Так же пароль обнуляется после успешной авторизации.
- Звонок на запрос пароля можно сделать только с определенного, привязанного к Дилеру, телефона. Никакие другие телефоны не прокатят. Связка телефон-логин – жесткая.
- Окно браузера работает через https, сервер 1С не имеет внешних точек входа. Поскольку к 1С извне, мимо nginx, подобраться невозможно, то будем считать, что непосредственно 1С от атак ограждена.
Надеюсь наш способ поможет Вам реализовать подобные задачи, возникающие в Вашей практике.