Настройка SSO в Nginx, интеграция с Zabbix в Centos 8 / Rocky Linux
Технология единого входа (Single sign-on SSO) — метод аутентификации, который позволяет пользователю переходить из одной системы в другую, не связанную с первой системой, без повторной аутентификации.
Подготовка
Исходные данные:
- на сервере уже установлен Zabbix + Nginx
- в Zabbix настроена LDAP-авторизация, пользователи из AD
Устанавливаем необходимые пакеты для сборки Nginx из исходников
1
$ 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
1
2
$ nginx -v
nginx version: nginx/1.20.1
Скачиваем исходники Nginx (нашей установленной версии) и распаковываем их
1
2
3
$ cd /tmp
$ wget https://nginx.org/download/nginx-1.20.1.tar.gz
$ tar zxvf nginx-*.tar.gz
Переходим в каталог
1
$ cd nginx-*/
Клонируем репозиторий модуля SPNEGO
1
$ git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git
Смотрим, с какими опциями собран установленный Nginx
1
$ 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
Собираем
1
$ make modules
В каталоге objs
появится файл ngx_http_auth_spnego_module.so
Подключение модуля Spnego в Nginx
Копируем модуль в соответствующий каталог и задаем права
1
2
$ 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 {
...
Проверяем
1
2
3
$ 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
1
$ sudo systemctl restart nginx
Интеграция с Windows AD
Устанавливаем Kerberos клиент
1
$ 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 = ITDRAFT.RU
default_keytab_name = /etc/nginx/zabbix_srv.keytab
dns_lookup_kdc = false
dns_lookup_realm = false
forwardable = true
ticket_lifetime = 24h
[realms]
ITDRAFT.RU = {
kdc = srv-dc-01.itdraft.ru
kdc = srv-dc-02.itdraft.ru
default_domain = ITDRAFT.RU
admin_server = srv-dc-01.itdraft.ru
}
[domain_realm]
.itdraft.ru = ITDRAFT.RU
itdraft.ru = ITDRAFT.RU
Добавляем в локальный DNS наш zabbix-server “mon.itdraft.ru”
Прописываем FQDN в /etc/hosts
Создание учетной записи и keytab в AD
В AD создаем стандартную учетку, в данном примере zabbix_srv
Запускаем powershell, Создаем SPN-запись
1
> setspn -A HTTP/mon.itdraft.ru@ITDRAFT.RU zabbix_srv
Создаем keytab
-файл
1
> ktpass /princ HTTP/mon.itdraft.ru@ITDRAFT.RU /mapuser zabbix_srv@ITDRAFT.RU /crypto ALL /ptype KRB5_NT_PRINCIPAL /out C:\zabbix_srv.keytab /pass *
где
mon.itdraft.ru
— имя zabbix-сервера;ITDRAFT.RU
— домен;[email protected]
— учетная запись в AD;pass *
— пароль.
Копируем keytab
-файл на наш zabbix-сервер в каталог /etc/nginx/
Проверяем на Zabbix сервере
1
2
3
4
5
$ kinit -V -k -t /etc/nginx/zabbix_srv.keytab HTTP/[email protected]
Using new cache: 1000:47555
Using principal: HTTP/[email protected]
Using keytab: /etc/nginx/zabbix_srv.keytab
Authenticated to Kerberos v5
Настройка HTTP аутентификации в zabbix
Переходим в раздел: Администрирование - Аутентификация - Настройки HTTP
Аутентификация - Настройки 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.itdraft.ru;
auth_gss on;
auth_gss_realm ITDRAFT.RU;
auth_gss_keytab /etc/nginx/zabbix_srv.keytab;
auth_gss_service_name "HTTP/mon.itdraft.ru";
auth_gss_allow_basic_fallback on;
...
Проверяем конфиг Nginx
1
2
3
$ 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
1
$ sudo systemctl restart nginx
Теперь необходимо наш сервер добавить в “доверенные”, что бы заработало SSO
Для проверки можно запустить Google Chrome с параметрами:
1
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --auth-server-whitelist="mon.itdraft.ru" --auth-negotiate-delegate-whitelist="mon.itdraft.ru"