В этом разделе показано, как обеспечить прозрачную авторизацию пользователей домена на веб-сайте, размещенном на веб-сервере Nginx.
6.10.2.1. Создание keytab-файла
Нужно настроить SPN (имена участников-служб) для имени сервера, на которое разрешается любой веб-сайт (таким образом, фактическое имя сервера, на которое указывает CNAME, является полным). Если виртуальный хостинг не используется, веб-адрес и имя машины будут одинаковыми. Для этого на контроллере домена:
# samba-tool user add --random-password nginxauth
# samba-tool user setexpiry nginxauth --noexpiry
# samba-tool spn add HTTP/web.test.alt nginxauth
Создать Kerberos keytab-файл для Nginx:
# samba-tool domain exportkeytab /tmp/nginx.keytab --principal=HTTP/web.test.alt@TEST.ALT
Export one principal to /tmp/nginx.keytab
6.10.2.2. Настройка Nginx
Для работы прозрачной доменной аутентификации (SSO) в Nginx необходимо установить пакеты
nginx и
nginx-spnego:
# apt-get install nginx nginx-spnego
Модуль SPNEGO для Nginx — это программный компонент для возможности прохождения аутентификации (Single Sign-On или SSO) через сервер LDAP.
Включить модуль http_auth_spnego:
# ln -s /etc/nginx/modules-available.d/http_auth_spnego.conf /etc/nginx/modules-enabled.d/
Перенести полученный на контроллере домене файл keytab на веб-сервер в каталог
/etc/nginx
. Установить права на файл keytab:
# chmod 644 /etc/nginx/nginx.keytab
Nginx должен иметь права на чтение keytab-файла, но не на его изменение.
Настроить аутентификацию в секции
server
файла конфигурации сайта:
server {
…
location /
{
root /var/www/html;
auth_gss on;
auth_gss_realm TEST.ALT; #имя Kerberos области
auth_gss_keytab /etc/nginx/nginx.keytab; #путь к keytab-файлу
auth_gss_service_name HTTP/web.test.alt; #имя используемого SPN
auth_gss_allow_basic_fallback off;
}
}
Описание опций:
auth_gss
— включение/отключение аутентификации;
auth_gss_keytab
— абсолютный путь к файлу keytab, содержащему учётные данные службы;
auth_gss_realm
— имя области Kerberos;
auth_gss_service_name
— имя субъекта-службы, используемое при получении учетных данных;
auth_gss_allow_basic_fallback
— включить/отключить базовую аутентификацию. При включённой базовой аутентификации (по умолчанию), если SSO не проходит (машина не в домене) разрешает обычный ввод логина и пароля. Если используется SPNEGO без SSL, рекомендуется отключить базовую аутентификацию, так как в этом случае пароль будет отправлен в виде открытого текста.
Перезапустить nginx:
# systemctl restart nginx
Если нужно авторизовать только определенный набор пользователей, можно использовать параметр
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>$
6.10.2.3. Проверка аутентификации
Тестовый сайт должен быть доступен по адресу http://<полное_доменное_имя_веб-сервера>.
На рабочей станции, введённой в домен, получить билет Kerberos:
$ kinit ivanov
Password for ivanov@TEST.ALT:
$ klist
Ticket cache: KEYRING:persistent:500:krb_ccache_5VitJSL
Default principal: ivanov@TEST.ALT
Valid starting Expires Service principal
28.04.2023 15:54:41 29.04.2023 01:54:41 krbtgt/TEST.ALT@TEST.ALT
renew until 05.05.2023 15:54:38
Попытаться прочитать содержимое сайта, используя аутентификацию Kerberos:
$ curl --negotiate -u : http://web.test.alt
<html><body><h1>It works!</h1></body></html>
Получено содержимое страницы.
Удалить билеты Kerberos:
$ kdestroy
$ klist
Попытаться прочитать содержимое сайта, используя аутентификацию Kerberos:
$ curl --negotiate -u : http://web.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>
Содержимое страницы не доступно.