С давних пор для второго шага аутентификации мы использовали одноразовые пароли отправляемые через СМС. Такой функционал появился в Redmine в 2013, когда мы разработали плагин redmine_sms_auth. Об этом мы писали в давней статье.
Но время не стоит на месте. Мы активно внедряем Telegram в бизнес-процессы компании (раз, два, три).
В связи с этим решили сделать аутентификацию через Telegram в Redmine. Заодно с этим переписать старый плагин про СМС и добавить поддержку Google Authenticator.
Далее мы расскажем о том как установить, настроить и использовать этот плагин.
Установка
Заходим в папку с плагинами
cd plugins
Клонируем репозиторий
git clone https://github.com/centosadmin/redmine_2fa.git
Переходим в корень Redmine
cd ..
Устанавливаем нужные гемы
bundle install
Выполняем миграции
rake redmine:plugins:migrate
Дополняем конфиг config/configuration.yml
# specific configuration options for production environment
# that overrides the default ones
production:
redmine_2fa:
sms_command: 'echo %{phone} %{password}'
в sms_command
впишите системную команду, которой будут отправляться сообщения.
Такой подход используется для совместимости с большинством API СМС-шлюзов. Скорее всего в вашем случае будет что-то вроде
/usr/bin/curl "https://sms.ru/api/send?phone=%{phone}&message=code: %{password}"
Перезапускаем Redmine.
Настройка
Предварительные требования
Так как веб-хуки от Telegram отправляются только на HTTPS адреса, ваш Redmine должен быть настроен на использование этого протокола.
Обязательное использование
По-умолчанию отключено, чтоб после установки плагина вы могли выбрать “не использовать” и войти в Redmine.
Но лучше включить, дабы случайные прохожие, узнавшие пароль одного из пользователей не смогли войти в систему.
![](https://habrastorage.org/files/3b5/7f6/d35/3b57f6d358ec43c1808a0692664ff4e6.png)
Настройка Telegram
Для аутентификации через Telegram нужно завести отдельного бота. Бота создаём с помощью @BotFather. Инструкция по созданию бота.
![](https://habrastorage.org/files/fa4/153/afd/fa4153afd297462aa91be21256c2388d.png)
Полученный от него ключ вводим в настройки и нажимаем Применить.
Инициализация бота
После того как токен сохранён, нужно инициализировать бота.
![](https://habrastorage.org/files/cba/8c9/b0e/cba8c9b0ec4d41fd8d0855792dbef6dc.png)
При инициализации в систему будет загружено имя бота, чтоб показать ссылку на него на шаге инициализации.
Также будет установлен веб-хук — адрес на который будут приходить запросы от API в случае, если кто-то напишет боту.
В прежних плагинах мы использовали бото-процессы, так как там большой входящий трафик.
Тут же решили исключить лишний элемент из системы.
Важно! При смене токена нужно Инициализировать бота ещё раз.
Деактивация бота
Данная функция пригодится если
- вы решите использовать этого бота где-то ещё
- по каким-то причинам вам нужно перейти на другого бота.
![](https://habrastorage.org/files/fa4/153/afd/fa4153afd297462aa91be21256c2388d.png)
В процессе деактивации сбрасывается токен и деактивируются все пользователи, использующие плагин.
При следующем входе в систему им нужно будет добавить себе в контакты нового бота.
Важно! Не забудьте активировать бота, когда введёте и сохраните новый токен.
А как это со стороны пользователя?
Первый вход
При первом входе пользователь может выбрать один из способов аутентификации либо отказаться от использования второго фактора.
![](https://habrastorage.org/files/0bc/e3b/965/0bce3b965ac84b7da245aeac3f07fb50.png)
Отказаться он сможет только в том случае, если вы разрешили это в настройках плагина.
Telegram
![](https://habrastorage.org/files/9a8/691/da5/9a8691da56ff4d5e950beb8fbaa783df.png)
После команды /start бот сохранит в Redmine ваш аккаунт Telegram и предложит связать его с вашим аккаунтом в Redmine
![](https://habrastorage.org/files/6dd/039/fe8/6dd039fe8bc8488fa864acdbdaca30bf.png)
Вводим предложенную команду
![](https://habrastorage.org/files/dd7/995/f8b/dd7995f8be6b428b912a696cfd22ef52.png)
И получаем на почту письмо
![](https://habrastorage.org/files/a0b/fd7/5c6/a0bfd75c63884b518da59192958be459.png)
При переходе по ссылке увидим сообщение
![](https://habrastorage.org/files/56d/339/bbd/56d339bbd82044d28a51566fba9024a6.png)
и форму логина.
Нужно ввести логин и пароль ещё раз.
После чего увидим форму ввода одноразового пароля
![](https://habrastorage.org/files/eaf/449/801/eaf449801632463989067efcd3791e62.png)
и получим заветный код от бота
![](https://habrastorage.org/files/016/711/882/0167118825af40b2b2a00bc768992f7d.png)
Настройка Telegram — самая сложная. Но ради удобства в использовании минуту потратить не жалко.
Google Auth
Аутентификация через гугл настраивается проще всего. Сосканируйте QR-код в приложении и нажмите “Далее”.
![](https://habrastorage.org/files/fb5/763/41b/fb576341b55f4805b660e0f26f37adfb.png)
SMS
Для получение кодов через СМС нужно сперва подтвердить номер телефона, на который вы будете получать СМС с одноразовыми паролями.
![](https://habrastorage.org/files/912/ce3/09d/912ce309d95c4ca2b2904835f5b72680.gif)
Миграция со старого плагина
Если вы пользовались нашим старым плагином, то лучше перейти с него на новый. Подробная инструкция о переходе доступна здесь.
Сброс настроек 2FA
Может случиться что пользователь захочет сменить способ аутентификации. На его странице есть специальная ссылка для этого.
![](https://habrastorage.org/files/880/7e2/7e8/8807e27e88234445a4ed1791a09278f5.png)
После сброса настроек при следующем логине пользователю будет предложено выбрать способ аутентификации.
Что дальше?
Теперь вы знаете как добавить двухфакторную аутентификацию в Redmine. Самое время применить полученные знания на практике.
На вопросы о плагине готовы ответить в комментариях к этой публикации.
Запросы о расширении функционала и баг-репорты принимаются здесь же, а также в тикетах репозитория.
nmk2002
Как обрабатываете ситуации, когда пользователь утрачивает контроль над telegram аккаунтом или теряет смартфон с Google токеном? Есть какие-то аварийные коды, контрольные вопросы или войти в аккаунт станет невозможно?
Sleuthhound
Присоединяюсь к вопросу, тоже об этом подумал.
olemskoi
Если утрачен контроль над Telegram — его нужно восстановить и все вернется на свои места. Аналогично и SMS.
Что касается Google Auth, можно выводить аварийные коды рядом со штрих-кодом при инициализации. Такой вариант подойдет?