Nginx/AD-auth: различия между версиями
Нет описания правки |
|||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
[[ | В данной статье рассмотрена настройка SSO аутентификации на веб-сервере Nginx. | ||
Для работы прозрачной доменной аутентификации (SSO) в nginx необходимы | |||
< | Исходные данные: | ||
*Домен — TEST.ALT | |||
< | *Веб-сервер — apserver [ip: 192.168.0.150] | ||
Далее | {{Note|Используемый веб-сервер может быть присоединен или не присоединен к домену, это не имеет значения.}} | ||
< | |||
== Создание 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 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; | |||
} | } | ||
} | } | ||
</ | </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>$
Другими словами, к 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