2-факторная авторизация средствами nginx

Привет, друзья. Сегодня я хочу поведать о том, как я запилил 2-х факторную авторизацию на любое количество ресурсов. Итак, у нас есть некоторые web-ресурсы, доступ к которым должен быть ограничен списком белых IP-адресов и подсетей. Хороший пример это билд сервера или wiki. У админов не всегда есть возможность быстро обновлять ПО на серваках. Поэтому хотелось бы прикрыть к таким ресурсам доступ некой заглушкой.

Именно для этих целей мы с вами запилим динамический список «авторизованных IP-адресов» с помощью nginx. Конечно, реализовать функционал вы можете своими средствами, ухватив основную идею. Общий алгоритм для IP-адресов которые не попадают в список белых IP:

  1. nginx смотрит, что IP, с которого пытаются обратиться к «закрытому» ресурсу не входит в список авторизованных. После чего делается 302 редирект на сайт авторизации. В моем случае это authme.domain.com.
  2. После перехода открывается простая форма с предложением ввести email адрес.
  3. Проверяется что email валидный. В моем случае, я проверяю что email принадлежит зоне domain.com.
  4. Если email валидный, генерируется ключ(с привязкой к IP с которого пришел запрос), который сразу высылается ссылкой на почту.
  5. Пользователь проверяет почту и переходит по ссылке.
  6. authme.domain.com проверяет, что ключ и IP адрес валидные. После чего добавляет в конфигурационный файл nginx IP-адрес в список белых адресов. После чего делается nginx reload, что тот перепрочитал конфигурационные файлы.

Надеюсь основная идея вам ясна. Подходит это вам или нет — решать вам. По ссылке вы найдете docker контейнеры с приложением на nodejs и nginx. Ну и там же есть пример использования.

https://github.com/voiplab/docker