Nginx/AD-auth: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 8 промежуточных версий 2 участников)
Строка 1: Строка 1:
[[Категория:Web]]
В данной статье рассмотрена настройка SSO аутентификации на веб-сервере Nginx.
Для работы прозрачной доменной аутентификации (SSO) в nginx необходимы следующие пакеты:
 
<pre># apt-get install nginx nginx-spnego</pre>
Исходные данные:
Включим необходимый модуль:<br>
*Домен — TEST.ALT
<pre>ln -s /etc/nginx/modules-available.d/http_auth_spnego.conf /etc/nginx/modules-enabled.d/</pre>
*Веб-сервер — apserver [ip: 192.168.0.150]
Также нам понадобится keytab-файл, как его получить описано [[Создание_SPN_и_Keytab_файла|здесь]].
 
Далее настраиваем аутентификацию в секции server файла конфигурации нашего сайта:
{{Note|Используемый веб-сервер может быть присоединен или не присоединен к домену, это не имеет значения.}}
<pre>server {
 
== Создание keytab-файла ==
 
Как получить keytab-файл описано [[Создание_SPN_и_Keytab_файла|здесь]].
 
== Настройка Nginx ==
Для работы прозрачной доменной аутентификации (SSO) в nginx необходимы пакеты {{pkg|nginx}} и {{pkg|nginx-spnego}}:
<syntaxhighlight lang="bash"># apt-get install nginx nginx-spnego</syntaxhighlight>
 
Включить необходимый модуль:
<syntaxhighlight lang="bash"># ln -s /etc/nginx/modules-available.d/http_auth_spnego.conf /etc/nginx/modules-enabled.d/</syntaxhighlight>
 
Далее необходимо настроить аутентификацию в секции server файла конфигурации нашего сайта:
<syntaxhighlight lang="ini">server {
...
...
     location / {
     location / {
auth_gss on;
auth_gss on;
auth_gss_realm IPA.EXAMPLE.TEST; //имя kerberos области
    auth_gss_realm TEST.ALT; #имя kerberos области
auth_gss_keytab /etc/http.keytab; //путь к keytab-файлу
    auth_gss_keytab /etc/nginx/web2.keytab; #путь к keytab-файлу
auth_gss_service_name HTTP/redmine.ipa.example.test; //имя используемого SPN
    auth_gss_service_name HTTP/apserver.test.alt; #имя используемого SPN
auth_gss_allow_basic_fallback on; //Если SSO не проходит (машина не в домене) разрешает обычный ввод логина и пароля
    auth_gss_allow_basic_fallback off;
     }
     }
}
}
</pre>
</syntaxhighlight>
Далее необходимо перезапустить сервис nginx и попробовать зайти доменным пользователем.
 
Описание опций:
* 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. Можно указывать несколько записей, по одной на строку:
<syntaxhighlight lang="ini">
auth_gss_authorized_principal <username>@<realm>
auth_gss_authorized_principal <username2>@<realm>
</syntaxhighlight>
Список пользователей также можно указать с помощью шаблона регулярного выражения в параметре auth_gss_authorized_principal_regex. Этот параметр можно использовать вместе с параметром auth_gss_authorized_principal:
<syntaxhighlight lang="ini">
auth_gss_authorized_principal <username>@<realm>
auth_gss_authorized_principal_regex ^(<username>)/(<group>)@<realm>$
</syntaxhighlight>
 
{{note|Очень важный момент — fqdn (домен то есть), указанный в параметре auth_gss_service_name, обязан резолвится в IP машины, а для этого IP должна быть настроена обратная зона на это имя.
Другими словами, к KDC придёт не указанный вами fqdn, а полученный ($ resolve IP) из IP вашего nginx-сервера. При этом важно указать в auth_gss_service_name существующий SPN, потому что указанное
там значение локально используется для вынимания записи из keytab.
 
Скорее всего это связано с настройкой rdns (по умолчанию true) из {{path|/etc/krb5.conf}}
 
Подробности здесь:
https://web.mit.edu/kerberos/krb5-devel/doc/admin/princ_dns.html}}
 
Далее необходимо перезапустить сервис nginx:
<syntaxhighlight lang="bash"># systemctl restart nginx</syntaxhighlight>
 
== Проверка аутентификации ==
 
На рабочей станции, введённой в домен, получить билет Kerberos:
<syntaxhighlight lang="bash">$ 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
</syntaxhighlight>
 
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
 
<syntaxhighlight lang="bash">$ curl --negotiate -u : apserver.test.alt
<html><body><h1>It works!</h1></body></html>
</syntaxhighlight>
 
Получено содержимое страницы.
 
Удалить билеты Kerberos:
 
<syntaxhighlight lang="bash">$ kdestroy</syntaxhighlight>
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
 
<syntaxhighlight lang="bash">$ 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>
</syntaxhighlight>
Содержимое страницы не доступно.
 
Если доступ разрешён только определенным пользователям, то при попытке доступа другим пользователем доступ будет запрещён:
<syntaxhighlight lang="bash">
$ 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
</syntaxhighlight>
 
== Настройка веб-браузеров для SSO ==
[[Настройка_браузеров_для_SSO|Настройка веб-браузеров для SSO]]
 
== Ссылки ==
* [https://habrahabr.ru/post/305098/ Веб авторизация доменного пользователя через nginx и HTTP Negotiate]
* https://github.com/stnoonan/spnego-http-auth-nginx-module
 
[[Категория:Web]]
[[Категория:Active Directory]]

Текущая версия от 18:36, 31 октября 2023

В данной статье рассмотрена настройка 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

Ссылки