====== Прозрачная авторизация доменного пользователя через 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''
==== Прочие браузеры ====
- Перейти в **Панель управления** и выбрать **Свойства браузера**
- В открывшемся окне выбрать вкладку **Безопасность**
- Выбрать зону безопасности **Местная интрасеть** и нажать на кнопку **Сайты**
- В новом окне нажать кнопку **Дополнительно**
- Добавить адрес сайта