misc:spnego
Это старая версия документа!
Содержание
Прозрачная авторизация доменного пользователя через 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 chronyd --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/krb.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
Прочие браузеры
- Перейти в Панель управления и выбрать Свойства браузера
- В открывшемся окне выбрать вкладку Безопасность
- Выбрать зону безопасности Местная интрасеть и нажать на кнопку Сайты
- В новом окне нажать кнопку Дополнительно
- Добавить адрес сайта
misc/spnego.1782026508.txt.gz · Последнее изменение: — nikolay
