Инструменты пользователя

Инструменты сайта


misc:spnego

Прозрачная авторизация доменного пользователя через NGINX

Инструкция написана для Ubuntu 24.04

Настройка времени

  1. Настройка временной зоны:
    timedatectl set-timezone Europe/Moscow

    Просмотреть список временных зон можно командой:

    timedatectl list-timezones
  2. Установить NTP-клиент Chrony
    apt install chrony
  3. Настроить список NTP-серверов для синхронизации времени в файле /etc/chrony/chrony.conf
    ...
    pool domain.local
    # pool
    ...

    В данном случае указываем либо список IP-адресов (доменных имен) NTP-серверов в каждой строчке, либо просто указываем имя домена

  4. Запустить демон chrony
    systemctl enable chrony --now

Сборка динамического модуля SPNEGO для NGINX

Скомпилировать модуль по инструкции можно на другом ПК скопировав потом файл ngx_http_auth_spnego_module.so
  1. Проверить установленную версию NGINX:
    nginx -V
  2. Установить необходимые пакеты
    apt install git build-essential libpcre++-dev zlib1g-dev libkrb5-dev libssl-dev libxslt-dev libgd-dev
  3. Скачать и распаковать исходники 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
  4. Скачать и скомпилировать динамический модуль 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

  1. Скопировать скомпилированный модуль 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/
  2. Создать конфигурационный файл для модуля
    vi /etc/nginx/modules-available/spnego-http-auth-nginx-module.conf
  3. Прописать в файл загрузку модуля
    load_module "/usr/lib/nginx/modules/ngx_http_auth_spnego_module.so";
  4. Включить модуль для 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

  1. Создать нового пользователя для SPNEGO
  2. Открыть свойства созданного пользователя
  3. Перейти во вкладку Учетная запись
  4. В разделе Параметры учетной записи поставить галки:
    • Запретить смену пароля пользователем
    • Срок действия пароля не ограничен
    • Данная учетная запись поддерживает 256-разрядное
  5. Открыть консоль cmd или Power Shell
  6. Выполнить команды
    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

  7. Проверяем корректность SPN
    setspn -Q */foo.domain.local

    где foo.domain.local - адрес сайта

  8. Если всё верно, то должно вывести примерно следующее
    Checking domain DC=domain,DC=local
      CN=...,OU=...,DC=domain,DC=local
              HTTP/foo.domain.local
              host/foo.domain.local

Linux

  1. Установить пакеты
    apt install krb5-user krb5-multidev libkrb5-dev
  2. Изменить настройки /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
  3. Скопировать полученные файлы host.keytab и http.keytab
  4. Объединить файлы в единый файл krb5.keytab при помощи ktutil
    # ktutil
    ktutil: rkt host.keytab
    ktutil: rkt http.keytab
    ktutil: wkt /etc/krb5.keytab
    ktutil: quit
  5. Проверить корректность созданного 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
  6. Проверить возможность авторизации при помощи keytab-файла без пароля
    kinit -5 -V -k -t /etc/krb5.keytab HTTP/foo.domain.local

    При успешной авторизации должно вывести

    Authenticated to Kerberos v5
  7. Установим правильные права для /etc/ktb5.keytab
    chmod 440 /etc/krb5.keytab
    chown root:www-data /etc/krb5.keytab

Настройка аутентификации на NGINX

  1. Создать конфигурационный файл для сайта в /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;
    }
  2. Включить сайт
    cd /etc/nginx/sites-enabled
    ln -s ../sites-available/site-name
    systemctl reload nginx

Настройка клиентских ПК

Firefox

  1. Ввести about:config в строку адреса
  2. Добавить/изменить адрес сайта в параметр network.negotiate-auth.trusted-uris
  3. Убедиться, что параметр network.negotiate-auth.using-native-gsslib выставлен в true

Прочие браузеры

  1. Перейти в Панель управления и выбрать Свойства браузера
  2. В открывшемся окне выбрать вкладку Безопасность
  3. Выбрать зону безопасности Местная интрасеть и нажать на кнопку Сайты
  4. В новом окне нажать кнопку Дополнительно
  5. Добавить адрес сайта
misc/spnego.txt · Последнее изменение: nikolay