Nginx/AD-auth

Материал из ALT Linux Wiki

В данной статье рассмотрена настройка 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>$
Примечание: Очень важный момент — fqdn (домен то есть), указанный в параметре auth_gss_service_name, обязан резолвится в IP машины, а для этого IP должна быть настроена обратная зона на это имя.

Другими словами, к 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

Ссылки