Nginx/AD-auth
В данной статье рассмотрена настройка SSO аутентификации на веб-сервере Nginx.
Исходные данные:
- Домен — TEST.ALT
- Веб-сервер — apserver [ip: 192.168.0.150]
Создание keytab-файла
Как получить keytab-файл описано здесь.
Настройка Nginx
Для работы прозрачной доменной аутентификации (SSO) в nginx необходимы пакеты nginx и nginx-spnego:
# apt-get install nginx nginx-spnego
Включить необходимый модуль:
# ln -s /etc/nginx/modules-available.d/http_auth_spnego.conf /etc/nginx/modules-enabled.d/
Далее необходимо настроить аутентификацию в секции server файла конфигурации нашего сайта:
server {
...
location / {
auth_gss on;
auth_gss_realm TEST.ALT; #имя kerberos области
auth_gss_keytab /etc/nginx/web2.keytab; #путь к keytab-файлу
auth_gss_service_name HTTP/apserver.test.alt; #имя используемого SPN
auth_gss_allow_basic_fallback off;
}
}
Описание опций:
- auth_gss: on/off — включение/отключение аутентификации;
- auth_gss_keytab — абсолютный путь к файлу keytab, содержащему учётные данные службы;
- auth_gss_realm — имя области Kerberos;
- auth_gss_service_name — имя субъекта-службы, используемое при получении учетных данных;
- auth_gss_allow_basic_fallback: on/off — включить/отключить базовую аутентификацию. При включённой базовой аутентификации (по умолчанию), если SSO не проходит (машина не в домене) разрешает обычный ввод логина и пароля. Если используется SPNEGO без SSL, рекомендуется отключить базовую аутентификацию, так как в этом случае пароль будет отправлен в виде открытого текста.
Если нужно авторизовать только определенный набор пользователей, можно использовать параметре auth_gss_authorized_principal. Можно указывать несколько записей, по одной на строку:
auth_gss_authorized_principal <username>@<realm>
auth_gss_authorized_principal <username2>@<realm>
Список пользователей также можно указать с помощью шаблона регулярного выражения в параметре auth_gss_authorized_principal_regex. Этот параметр можно использовать вместе с параметром auth_gss_authorized_principal:
auth_gss_authorized_principal <username>@<realm>
auth_gss_authorized_principal_regex ^(<username>)/(<group>)@<realm>$
Другими словами, к KDC придёт не указанный вами fqdn, а полученный ($ resolve IP) из IP вашего nginx-сервера. При этом важно указать в auth_gss_service_name существующий SPN, потому что указанное там значение локально используется для вынимания записи из keytab.
Скорее всего это связано с настройкой rdns (по умолчанию true) из /etc/krb5.conf
Подробности здесь:
https://web.mit.edu/kerberos/krb5-devel/doc/admin/princ_dns.html
Далее необходимо перезапустить сервис nginx:
# systemctl restart nginx
Проверка аутентификации
На рабочей станции, введённой в домен, получить билет Kerberos:
$ kinit ivanov
Password for ivanov@TEST.ALT:
$ klist
Ticket cache: KEYRING:persistent:500:500
Default principal: ivanov@TEST.ALT
Valid starting Expires Service principal
02.05.2023 09:43:01 02.05.2023 19:43:01 krbtgt/TEST.ALT@TEST.ALT
renew until 09.05.2023 09:42:58
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
$ curl --negotiate -u : apserver.test.alt
<html><body><h1>It works!</h1></body></html>
Получено содержимое страницы.
Удалить билеты Kerberos:
$ kdestroy
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
$ curl --negotiate -u : http://apserver.test.alt
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
Содержимое страницы не доступно.
Если доступ разрешён только определенным пользователям, то при попытке доступа другим пользователем доступ будет запрещён:
$ curl --negotiate -u : apserver.test.alt
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
[user@work ~]$ klist
Ticket cache: KEYRING:persistent:500:500
Default principal: orlov@TEST.ALT
Valid starting Expires Service principal
30.04.2023 15:26:47 01.05.2023 01:26:39 HTTP/apserver.test.alt@
renew until 07.05.2023 15:26:38
Ticket server: HTTP/apserver.test.alt@TEST.ALT
30.04.2023 15:26:39 01.05.2023 01:26:39 krbtgt/TEST.ALT@TEST.ALT
renew until 07.05.2023 15:26:38
Настройка веб-браузеров для SSO
Настройка веб-браузеров для SSO