Thank you for reading this post, don't forget to subscribe!
Технология единого входа (Single sign-on SSO) — метод аутентификации, который позволяет пользователю переходить из одной системы в другую, не связанную с первой системой, без повторной аутентификации.
Подготовка
Исходные данные:
- на сервере уже установлен Zabbix + Nginx
- в Zabbix настроена LDAP-авторизация, пользователи из AD
Устанавливаем необходимые пакеты для сборки Nginx из исходников
$ sudo dnf -y install tar gcc unzip gcc-c++ make pcre-devel zlib-devel curl wget git openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed gperftools-devel redhat-rpm-config
Сборка динамического модуля Spnego
Проверяем версию Nginx
$ nginx -v
nginx version: nginx/1.20.1
Скачиваем исходники Nginx (нашей установленной версии) и распаковываем их
$ cd /tmp
$ wget https://nginx.org/download/nginx-1.20.1.tar.gz
$ tar zxvf nginx-*.tar.gz
Переходим в каталог
$ cd nginx-*/
Клонируем репозиторий модуля SPNEGO
$ git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git
Смотрим, с какими опциями собран установленный NGINX
$ nginx -V
Нам нужно все, что идет после «configure arguments:»
Задаем конфигурацию для сборки Nginx из исходников, в конце дописываем «—add-dynamic-module=spnego-http-auth-nginx-module» что бы собрать динамический модуль
1 |
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-dynamic-module=spnego-http-auth-nginx-module |
Собираем
$ make modules
В каталоге «objs» появится файл «ngx_http_auth_spnego_module.so»
Подключение модуля Spnego в Nginx
Копируем модуль в соответствующий каталог и задаем права
$ sudo cp objs/ngx_http_auth_spnego_module.so /usr/lib64/nginx/modules/
$ sudo chmod 644 /usr/lib64/nginx/modules/ngx_http_auth_spnego_module.so
Добавляем модуль ngx_http_auth_spnego_module.so в конфиг Nginx
1 2 3 4 5 6 7 8 |
$ sudo nano /etc/nginx/nginx.conf ... pid /var/run/nginx.pid; load_module modules/ngx_http_auth_spnego_module.so; events { ... |
Проверяем
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезапускаем Nginx
$ sudo systemctl restart nginx
Интеграция с Windows AD
Устанавливаем Kerberos клиент
$ sudo dnf -y install krb5-workstation
Редактируем конфиг
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = test.RU default_keytab_name = /etc/nginx/zabbix_srv.keytab dns_lookup_kdc = false dns_lookup_realm = false forwardable = true ticket_lifetime = 24h [realms] test.RU = { kdc = srv-dc-01.test.ru kdc = srv-dc-02.test.ru default_domain = test.RU admin_server = srv-dc-01.test.ru } [domain_realm] .test.ru = test.RU test.ru = test.RU |
Добавляем в локальный DNS наш zabbix-server «mon.test.ru»
Прописываем FQDN в /etc/hosts
Создание учетной записи и keytab в AD
В AD создаем стандартную учетку, в данном примере zabbix_srv
Запускаем powershell, Создаем SPN запись
> setspn -A HTTP/mon.test.ru@test.RU zabbix_srv
Создаем keytab-файл
> ktpass /princ HTTP/mon.test.ru@test.RU /mapuser zabbix_srv@test.RU /crypto ALL /ptype KRB5_NT_PRINCIPAL /out C:\zabbix_srv.keytab /pass *
mon.test.ru — имя zabbix-сервера;
test.RU — домен;
zabbix_srv@test.RU — учетная запись в AD;
pass * — пароль.
Копируем keytab-файл на наш zabbix-сервер в каталог /etc/nginx/
Проверяем на zabbix-сервере
1 2 3 4 5 |
$ kinit -V -k -t /etc/nginx/zabbix_srv.keytab HTTP/mon.test.ru@test.RU Using new cache: 1000:47555 Using principal: HTTP/mon.test.ru@test.RU Using keytab: /etc/nginx/zabbix_srv.keytab Authenticated to Kerberos v5 |
Настройка HTTP аутентификации в zabbix
Переходим в раздел: Администрирование — Аутентификация — Настройки HTTP
Активируем HTTP аутентификацию
Настройка SSO в Nginx
Редактируем конфиг Nginx для Zabbix
1 2 3 4 5 6 7 8 9 10 11 12 |
$ sudo nano /etc/nginx/conf.d/zabbix.conf server { listen 80; listen 443 ssl; server_name mon.test.ru; auth_gss on; auth_gss_realm test.RU; auth_gss_keytab /etc/nginx/zabbix_srv.keytab; auth_gss_service_name "HTTP/mon.test.ru"; auth_gss_allow_basic_fallback on; ... |
Проверяем конфиг Nginx
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезапускаем Nginx
$ sudo systemctl restart nginx
Теперь необходимо наш сервер добавить в «доверенные», что бы заработало SSO
Для проверки можно запустить Google Chrome с параметрами:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --auth-server-whitelist="mon.test.ru" --auth-negotiate-delegate-whitelist="mon.test.ru"