====== Прозрачная авторизация доменного пользователя через NGINX ====== Инструкция написана для Ubuntu 24.04 ===== Настройка времени ===== - Настройка временной зоны: timedatectl set-timezone Europe/Moscow Просмотреть список временных зон можно командой: timedatectl list-timezones - Установить NTP-клиент Chrony apt install chrony - Настроить список NTP-серверов для синхронизации времени в файле **/etc/chrony/chrony.conf** ... pool domain.local # pool ... В данном случае указываем либо список IP-адресов (доменных имен) NTP-серверов в каждой строчке, либо просто указываем имя домена - Запустить демон chrony systemctl enable chrony --now ===== Сборка динамического модуля SPNEGO для NGINX ===== Скомпилировать модуль по инструкции можно на другом ПК скопировав потом файл **ngx_http_auth_spnego_module.so** - Проверить установленную версию NGINX: nginx -V - Установить необходимые пакеты apt install git build-essential libpcre++-dev zlib1g-dev libkrb5-dev libssl-dev libxslt-dev libgd-dev - Скачать и распаковать исходники nginx согласно установленной версии cd ~ mkdir nginx-dev cd nginx-dev wget https://nginx.org/download/nginx-1.xx.x.tar.gz tar -xzvf nginx-1.xx.x.tar.gz - Скачать и скомпилировать динамический модуль SPNEGO cd ~/nginx-dev git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git cd nginx-1.xx.x ./configure --with-compat --add-dynamic-module=../spnego-http-auth-nginx-module make modules В папке **objs** должен появиться файл **ngx_http_auth_spnego_module.so** ===== Установка динамического модуля SPNEGO ===== - Скопировать скомпилированный модуль **ngx_http_auth_spnego_module.so** mkdir -p /usr/lib/nginx/modules cp path/to/ngx_http_auth_spnego_module.so /usr/lib/nginx/modules/ - Создать конфигурационный файл для модуля vi /etc/nginx/modules-available/spnego-http-auth-nginx-module.conf - Прописать в файл загрузку модуля load_module "/usr/lib/nginx/modules/ngx_http_auth_spnego_module.so"; - Включить модуль для nginx cd /etc/nginx/modules-enabled ln -s ../modules-available/spnego-http-auth-nginx-module.conf systemctl reload nginx ===== Интеграция с Active Directory ===== Настройка приведена для Windows Server 2016 и выше ==== Windows ==== - Создать нового пользователя для SPNEGO - Открыть свойства созданного пользователя - Перейти во вкладку **Учетная запись** - В разделе **Параметры учетной записи** поставить галки: * Запретить смену пароля пользователем * Срок действия пароля не ограничен * Данная учетная запись поддерживает 256-разрядное - Открыть консоль cmd или Power Shell - Выполнить команды ktpass -princ host/foo.domain.local@DOMAIN.LOCAL -mapuser spnego_user@DOMAIN.LOCAL -pass * -out host.keytab -ptype KRB5_NT_PRINCIPAL -crypto AES256-SHA1 ktpass -princ HTTP/foo.domain.local@DOMAIN.LOCAL -mapuser spnego_user@DOMAIN.LOCAL -pass * -out http.keytab -ptype KRB5_NT_PRINCIPAL -crypto AES256-SHA1 где **foo.domain.local** - адрес сайта, **spnego_user** - пользователь для SPNEGO - Проверяем корректность SPN setspn -Q */foo.domain.local где **foo.domain.local** - адрес сайта - Если всё верно, то должно вывести примерно следующее Checking domain DC=domain,DC=local CN=...,OU=...,DC=domain,DC=local HTTP/foo.domain.local host/foo.domain.local ==== Linux ==== - Установить пакеты apt install krb5-user krb5-multidev libkrb5-dev - Изменить настройки **/etc/krb5.conf**, указав корректные данные [libdefaults] default_realm = DOMAIN.LOCAL default_tgs_enctypes = aes256-cts-hmac-sha1-96 default_tkt_enctypes = aes256-cts-hmac-sha1-96 kdc_timesync = 1 ccache_type = 4 forwardable = false proxiable = false ticket_lifetime = 24h default_keytab_name = FILE:/etc/krb5.keytab ... [realms] ... DOMAIN.LOCAL = { kdc = dc.domain.local admin_server = dc.domain.local default_domain = domain.local } ... [domain_realm] ... .domain.local = DOMAIN.LOCAL domain.local = DOMAIN.LOCAL - Скопировать полученные файлы **host.keytab** и **http.keytab** - Объединить файлы в единый файл **krb5.keytab** при помощи **ktutil** # ktutil ktutil: rkt host.keytab ktutil: rkt http.keytab ktutil: wkt /etc/krb5.keytab ktutil: quit - Проверить корректность созданного keytab-файла klist -kt /etc/krb5.keytab Должно вывести примерно следующее Keytab name: FILE:/etc/krb5.keytab KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 1 02/19/13 04:02:48 host/foo.domain.local@DOMAIN.LOCAL 2 02/19/13 04:02:48 HTTP/foo.domain.local@DOMAIN.LOCAL - Проверить возможность авторизации при помощи keytab-файла без пароля kinit -5 -V -k -t /etc/krb5.keytab HTTP/foo.domain.local При успешной авторизации должно вывести Authenticated to Kerberos v5 - Установим правильные права для **/etc/ktb5.keytab** chmod 440 /etc/krb5.keytab chown root:www-data /etc/krb5.keytab ===== Настройка аутентификации на NGINX ===== - Создать конфигурационный файл для сайта в **/etc/nginx/sites-avaliable/site-name** server { ... server_name foo.domain.local; ... auth_gss on; auth_gss_realm DOMAIN.LOCAL; auth_gss_keytab /etc/krb5.keytab; auth_gss_service_name HTTP/foo.domain.local; auth_gss_allow_basic_fallback off; } - Включить сайт cd /etc/nginx/sites-enabled ln -s ../sites-available/site-name systemctl reload nginx ===== Настройка клиентских ПК ===== ==== Firefox ==== - Ввести ''about:config'' в строку адреса - Добавить/изменить адрес сайта в параметр ''network.negotiate-auth.trusted-uris'' - Убедиться, что параметр ''network.negotiate-auth.using-native-gsslib'' выставлен в ''true'' ==== Прочие браузеры ==== - Перейти в **Панель управления** и выбрать **Свойства браузера** - В открывшемся окне выбрать вкладку **Безопасность** - Выбрать зону безопасности **Местная интрасеть** и нажать на кнопку **Сайты** - В новом окне нажать кнопку **Дополнительно** - Добавить адрес сайта