Одна из досадных проблем, которые встают при создании NAS, заключается в том, что не всякое программное обеспечение может работать с LDAP, а некоторое вообще не содержит механизмов аутентификации. Решением является сквозная аутентификация через обратный прокси.
Пример того, как это сделать, весьма подробно разобран, например в этой статье. Поскольку данная статья является частью NAS цикла,
здесь я остановлюсь на том, как приспособить данное решение к сервисам в Docker-контейнерах. Решение основывается на примере реализации аутентификации через внешнего агента Nginx LDAP Auth, но я использую контейнеризованный вариант от LinuxServer.io потому, что это готовый образ, соответствующий определённым стандартам. Единственная проблема заключалась в том, что патчи LinuxServer.io сломали базовую HTTP аутентификацию, но после того, как влили багфикс, пользоваться этим стало опять возможно. Как показано в статьях, аутентификация производится по следующей схеме:  Альтернативным вариантом может являться использование компилируемого модуля для nginx, но я данный вариант здесь не рассматриваю с силу некоторых проблем с данным модулем и меньшей его гибкости. Доработанный образ для OpenLDAP сервера есть здесь. В рамках NAS, сервисы работают в контейнерах, поэтому есть желание сделать так, чтобы возможно было переключать режимы аутентификации, просто установив переменные внутри контейнера. Такой механизм уже есть в используемом образе ngingx-proxy и реализован он через шаблоны, которые обрабатывает docker-gen. Он подставляет в шаблон метаданные, которые содержат описание запущенных в данный момент контейнеров Docker. Таким образом, всё что надо сделать — это доработать шаблон конфигурации обратного прокси так, чтобы при наличии условной переменной в контейнере, было включено перенаправление на сервис сквозной аутентификации, который также работает в контейнере. Затем, внести соответствующие коррективы в конфигурацию docker-compose. В первую очередь добавляется новый upstream, который позволяет обращаться к сервису аутентификации в конфиге: Видно, что сервис аутентификации работает на хосте ${LDAP_BACKEND} и порту ${LDAP_LOGIN_PORT }, по умолчанию 9000.
Значения переменных будут подставлены docker-gen так, что данная часть конфига будет выглядеть следующим образом в /etc/nginx/conf.d/default.conf внутри контейнера: Следующее дополнение устанавливает переменную ext_ldap_auth, если в контейнере некоего сервиса была взведена переменная LDAP_EXT_AUTH.
Также, устанавливаются ещё несколько переменных для настройки аутентификации. Основной блок дополнений приведён ниже. Он активируется, только если установлена переменная ext_ldap_auth.
Если ldap_use_login_page установлена, то будет включено перенаправление на страницу аутентификации, иначе будет использовано окно базовой аутентификации HTTP. Путь /auth-proxy — это и есть перенаправление на сервис аутентификации.
Параметры будут переданы через заголовки HTTP.
Какие параметры и для чего нужны, вполне подробно описано в комментариях. И последнее, когда LDAP аутентификация для сервиса включена, добавляется auth_request в его location: Ниже приведён полный листинг шаблона. В docker-compose.yml были добавлены: То что записано в переменных, nginx передаст сервису аутентификации через HTTP заголовки.
Назначение параметров ясно из названий переменных, так что останавливаться я на них не буду.
Полный конфиг смотрите ниже. Сквозная аутентификация по умолчанию выключена.
Для её включения достаточно установить в окружении нужного контейнера переменные: В целом, решение уже длительное время работает и обеспечивает не только аутентификацию, но и авторизацию.
Что позволяет использовать в NAS любые сервисы в контейнерах, независимо от того поддерживают ли они аутентификацию через LDAP. Хотя имеются некоторые проблемы: Конфигурацию NAS вы можете найти в репозитории. Технарь-психопат