Превью новых версий, отчёты, внутренние инструменты: многие страницы не должны быть публичными, но собственное управление пользователями им не нужно. Общий пароль (HTTP Basic Auth) передают дальше и никогда не меняют, а полноценная платформа идентификации для нескольких страниц избыточна.
Для этого мы создали Gatekeeper — небольшой сервис за обратным прокси, который решает, кто может видеть какую страницу.
Как это работает
При каждом запросе обратный прокси спрашивает Gatekeeper — nginx через auth_request, Traefik через forwardAuth. Без сессии посетитель видит страницу входа прямо по адресу, который он открыл, а после входа возвращается туда же.
Для каждого хоста доступны два способа входа:
- Одноразовый код по электронной почте: восемь цифр, действует 15 минут и только в том браузере, который его запросил.
- Любой провайдер OpenID Connect: Zitadel, Google, Microsoft, GitLab или другой.
В обоих случаях список групп определяет, кто может войти на какой хост, — в нём могут быть отдельные адреса или целый домен.
Безопасность по замыслу
- При сомнении — закрыто: неизвестный хост, повреждённый cookie или ошибка провайдера ведут на страницу входа и никогда не дают доступ.
- Никаких подсказок об адресах: адрес без доступа получает тот же ответ за то же время, что и адрес с доступом, — письмо приходит только последнему.
- Сессии — это зашифрованные cookies, привязанные к хосту; коды хранятся только в виде хеша.
- Перед полем адреса необязательный proof-of-work через наш сервис ALTCHA отсекает ботов.
- Если письмо с кодом вернулось, на этот адрес 48 часов не отправляются новые письма.
- Страницы входа работают без скриптов и со строгой Content Security Policy; только необязательный шаг ALTCHA загружает свой виджет.
Просто в эксплуатации
Gatekeeper — одна статическая программа на Go: образ размером 15 МБ, которому в состоянии покоя нужно около 5 МиБ памяти. Нет ни базы данных, ни тома — сессии хранятся в cookie, ожидающие коды — в памяти, пользователи и группы — в одном JSON-файле. gatekeeper check проверяет конфигурацию перед перезапуском. Страницы входа и письма — на английском, немецком, русском и грузинском, с вашим названием, логотипом и цветами или в нейтральном оформлении.
В nginx защищённой области нужно три строки; полный пример — в README:
location / {
auth_request /_gatekeeper/auth;
error_page 401 = /_gatekeeper/sign_in;
error_page 403 = /_gatekeeper/denied;
}
В работе
Gatekeeper защищает отчёты Lighthouse и SEO наших сайтов и превью новых версий.
Исходный код — на GitLab и GitHub, образ — на Docker Hub, по лицензии MIT.
Будем рады настроить его и для ваших страниц.