Apache2/AD-auth: различия между версиями
Нет описания правки |
мНет описания правки |
||
(не показано 16 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
Исходные данные: | Исходные данные: | ||
*Домен ActiveDirectory DOMG.TESTG | *Домен ActiveDirectory DOMG.TESTG | ||
* | *Веб-сервер apserver [ip: 192.168.135.195] введенный в домен с помощью sssd | ||
{{Note|Используемый веб-сервер может быть присоединен или не присоединен к домену, это не имеет значения.}} | |||
Задача: | Задача: | ||
*Настроить аутентификацию Apache2 с PHP через AD | *Настроить аутентификацию Apache2 с PHP через AD | ||
==Создание keytab-файла== | ==Создание keytab-файла== | ||
Создание SPN keytab-файла описано [[Создание_SPN_и_Keytab_файла|тут]]<br> | |||
Скопировать keytab-файл в {{path|/etc/httpd2/}} и изменить владельца и права доступа для данного файла: | |||
< | <syntaxhighlight lang="bash"># chown apache2:apache2 /etc/httpd2/apache2.keytab | ||
# chmod 0440 /etc/httpd2/apache2.keytab</syntaxhighlight> | |||
== Настройка Apache2 == | |||
=== mod_auth_gssapi === | |||
Установить пакет {{pkg|apache2-mod_auth_gssapi}} и включить необходимые модули: | |||
< | <syntaxhighlight lang="bash"># apt-get install apache2-mod_auth_gssapi | ||
# a2enmod auth_gssapi | |||
# a2enmod authn_core | |||
# a2enmod authz_user | |||
# systemctl restart httpd2</syntaxhighlight> | |||
Добавить в конфигурацию Apache строки: | |||
<syntaxhighlight lang="ini"> | |||
<Directory /> | |||
AuthType GSSAPI | |||
AuthName "GSSAPI Login" | |||
#GssapiBasicAuth On | |||
GssapiCredStore keytab:/etc/httpd2/apache2.keytab | |||
Require valid-user | |||
</Directory> | |||
</syntaxhighlight> | |||
=== mod_auth_kerb === | |||
{{Attention|Описанный ниже mod_auth_kerb [https://bugzilla.altlinux.org/39063 устарел] и более не применяется. Пакет {{pkg|apache2-mod_auth_kerb}} удалён, начиная с [[P10]].}} | |||
Установить пакет {{pkg|apache2-mod_auth_kerb}} и включить необходимые модули: | |||
<syntaxhighlight lang="bash"># apt-get install apache2-mod_auth_kerb | |||
< | |||
# a2enmod auth_krb5 | # a2enmod auth_krb5 | ||
# a2enmod authn_core | # a2enmod authn_core | ||
# a2enmod authz_user | # a2enmod authz_user | ||
# systemctl restart httpd2</ | # systemctl restart httpd2</syntaxhighlight> | ||
Удобнее всего настраивать модуль с помощью .htaccess файлов.<br> | Удобнее всего настраивать модуль с помощью .htaccess файлов.<br> | ||
Разрешить использование файла .htaccess в настройках сайта: | |||
< | <syntaxhighlight lang="ini">... | ||
<Directory "/var/www/html"> | <Directory "/var/www/html"> | ||
AllowOverride All | AllowOverride All | ||
</Directory> | </Directory> | ||
...</ | ...</syntaxhighlight> | ||
Пример настройки .htaccess для аутентификации доменного пользователя для корневого каталога сайта: | Пример настройки .htaccess для аутентификации доменного пользователя для корневого каталога сайта: | ||
< | <syntaxhighlight lang="ini"> | ||
AuthType Kerberos | AuthType Kerberos | ||
AuthName "Kerberos Login" | AuthName "Kerberos Login" | ||
Строка 106: | Строка 63: | ||
KrbServiceName HTTP | KrbServiceName HTTP | ||
KrbSaveCredentials On | KrbSaveCredentials On | ||
KrbLocalUserMapping On #Обрезает @REAL в переменной REMOTE_USER | |||
require valid-user | require valid-user | ||
</pre> | </syntaxhighlight> | ||
{{Note|Realm name должен быть указан большими буквами.}} | |||
Если в логах Apache пишется ошибка: | |||
<pre>krb5_get_init_creds_password() failed: Client not found in Kerberos database</pre> | |||
То необходимо изменить адрес сервиса в строке KrbServiceName, на HTTP/полное имя сервера в домене, например:<br> | |||
<pre>HTTP/apserver.domg.testg</pre> | |||
== Проверка аутентификации == | |||
Получить билет Kerberos: | |||
<syntaxhighlight lang="bash">$ kinit ivanov | |||
Password for ivanov@DOMG.TESTG: | |||
$ klist | |||
Ticket cache: KEYRING:persistent:500:krb_ccache_5VitJSL | |||
Default principal: ivanov@DOMG.TESTG | |||
Valid starting Expires Service principal | |||
28.04.2023 15:54:41 29.04.2023 01:54:41 krbtgt/DOMG.TESTG@DOMG.TESTG | |||
renew until 05.05.2023 15:54:38 | |||
</syntaxhighlight> | |||
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos: | |||
<syntaxhighlight lang="bash">$ curl --negotiate -u : http://apserver.domg.testg | |||
<html><body><h1>It works!</h1></body></html> | |||
</syntaxhighlight> | |||
Получено содержимое страницы. | |||
Удалить билеты Kerberos: | |||
<syntaxhighlight lang="bash">$ kdestroy</syntaxhighlight> | |||
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos: | |||
<syntaxhighlight lang="bash">$ curl --negotiate -u : http://apserver.domg.testg | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> | |||
<head> | |||
<title>Authentication required!</title> | |||
</head> | |||
<body> | |||
<h1>Authentication required!</h1> | |||
… | |||
<h2>Error 401</h2> | |||
<address> | |||
<a href="/">apserver.domg.testg</a><br /> | |||
<span>Apache/2.4.56 (Unix) mod_auth_gssapi/1.6.3 OpenSSL/1.1.1t</span> | |||
</address> | |||
</body> | |||
</html> | |||
</syntaxhighlight> | |||
Содержимое страницы не доступно. | |||
== Настройка PHP аутентификации GSSAPI == | == Настройка PHP аутентификации GSSAPI == | ||
=== Инструкция для p9 === | |||
Для работы аутентификации PHP в LDAP необходима директива KrbSaveCredentials On, при её включении будет создаваться нужная нам переменная $_SERVER['KRB5CCNAME'].<br> | |||
Также необходимо проверить наличие в DNS PTR-записей нашего web-сервера: | |||
<syntaxhighlight lang="bash"># host 192.168.135.195 | |||
195.135.168.192.in-addr.arpa domain name pointer apserver.domg.testg.</syntaxhighlight> | |||
192.168.135.195 - ip-адрес нашего web-сервера.<br> | |||
Установим необходимые пакеты: | |||
<syntaxhighlight lang="bash"># apt-get install pecl-krb5 php5-ldap</syntaxhighlight> | |||
{{Attention|GSSAPI не работает по протоколу ldaps://, поэтому указывайте ldap://}} | |||
Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания: | |||
<syntaxhighlight lang="php"><?php | |||
var_dump($_SERVER['PHP_AUTH_USER']); | |||
var_dump($_SERVER['KRB5CCNAME']); | |||
putenv("KRB5CCNAME={$_SERVER['KRB5CCNAME']}"); | |||
$ldapconn = ldap_connect("ldap://dcd.domg.testg:389") or die('error connect с $ldaphost') ; | |||
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); | |||
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); | |||
$result = ldap_sasl_bind($ldapconn,'','','GSSAPI','DOMG.TESTG') or die('Failed to GSSAPI bind sasl bind.<br />'); | |||
$result = ldap_search($ldapconn, 'DC=DOMG,DC=TESTG', '(objectClass=*)', array('mail')); | |||
$result_entries = ldap_get_entries($ldapconn, $result); | |||
var_dump($result_entries); | |||
?></syntaxhighlight> | |||
Перейдем в браузере на адрес https://apserver.domg.testg/index.php введя имя и пароль доменного пользователя. Вывод должен быть таким: | |||
<syntaxhighlight lang="ini">string(7) "u01domg" string(50) "FILE:/var/run/httpd2/krbcache/krb5cc_apache_NHBQeV" | |||
array(224) { | |||
["count"]=> | |||
int(223) | |||
[0]=> | |||
array(2) { | |||
["count"]=> | |||
int(0) | |||
["dn"]=> | |||
string(16) "DC=domg,DC=testg" | |||
} | |||
...</syntaxhighlight> | |||
== Настройка веб-браузеров для SSO == | |||
[[Настройка_браузеров_для_SSO|Настройка веб-браузеров для SSO]] | |||
----- | |||
{{Category navigation|title=Apache2|category=Apache2}}[[Категория:Active Directory]][[Категория:Web]] |
Текущая версия от 11:39, 2 мая 2023
Исходные данные:
- Домен ActiveDirectory DOMG.TESTG
- Веб-сервер apserver [ip: 192.168.135.195] введенный в домен с помощью sssd
Задача:
- Настроить аутентификацию Apache2 с PHP через AD
Создание keytab-файла
Создание SPN keytab-файла описано тут
Скопировать keytab-файл в /etc/httpd2/ и изменить владельца и права доступа для данного файла:
# chown apache2:apache2 /etc/httpd2/apache2.keytab
# chmod 0440 /etc/httpd2/apache2.keytab
Настройка Apache2
mod_auth_gssapi
Установить пакет apache2-mod_auth_gssapi и включить необходимые модули:
# apt-get install apache2-mod_auth_gssapi
# a2enmod auth_gssapi
# a2enmod authn_core
# a2enmod authz_user
# systemctl restart httpd2
Добавить в конфигурацию Apache строки:
<Directory />
AuthType GSSAPI
AuthName "GSSAPI Login"
#GssapiBasicAuth On
GssapiCredStore keytab:/etc/httpd2/apache2.keytab
Require valid-user
</Directory>
mod_auth_kerb
Установить пакет apache2-mod_auth_kerb и включить необходимые модули:
# apt-get install apache2-mod_auth_kerb
# a2enmod auth_krb5
# a2enmod authn_core
# a2enmod authz_user
# systemctl restart httpd2
Удобнее всего настраивать модуль с помощью .htaccess файлов.
Разрешить использование файла .htaccess в настройках сайта:
...
<Directory "/var/www/html">
AllowOverride All
</Directory>
...
Пример настройки .htaccess для аутентификации доменного пользователя для корневого каталога сайта:
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd On
KrbAuthRealms DOMG.TESTG
Krb5KeyTab /etc/httpd2/apache2.keytab
KrbServiceName HTTP
KrbSaveCredentials On
KrbLocalUserMapping On #Обрезает @REAL в переменной REMOTE_USER
require valid-user
Если в логах Apache пишется ошибка:
krb5_get_init_creds_password() failed: Client not found in Kerberos database
То необходимо изменить адрес сервиса в строке KrbServiceName, на HTTP/полное имя сервера в домене, например:
HTTP/apserver.domg.testg
Проверка аутентификации
Получить билет Kerberos:
$ kinit ivanov
Password for ivanov@DOMG.TESTG:
$ klist
Ticket cache: KEYRING:persistent:500:krb_ccache_5VitJSL
Default principal: ivanov@DOMG.TESTG
Valid starting Expires Service principal
28.04.2023 15:54:41 29.04.2023 01:54:41 krbtgt/DOMG.TESTG@DOMG.TESTG
renew until 05.05.2023 15:54:38
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
$ curl --negotiate -u : http://apserver.domg.testg
<html><body><h1>It works!</h1></body></html>
Получено содержимое страницы.
Удалить билеты Kerberos:
$ kdestroy
Попытаться прочитать содержимое сайта использую аутентификацию Kerberos:
$ curl --negotiate -u : http://apserver.domg.testg
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Authentication required!</title>
</head>
<body>
<h1>Authentication required!</h1>
…
<h2>Error 401</h2>
<address>
<a href="/">apserver.domg.testg</a><br />
<span>Apache/2.4.56 (Unix) mod_auth_gssapi/1.6.3 OpenSSL/1.1.1t</span>
</address>
</body>
</html>
Содержимое страницы не доступно.
Настройка PHP аутентификации GSSAPI
Инструкция для p9
Для работы аутентификации PHP в LDAP необходима директива KrbSaveCredentials On, при её включении будет создаваться нужная нам переменная $_SERVER['KRB5CCNAME'].
Также необходимо проверить наличие в DNS PTR-записей нашего web-сервера:
# host 192.168.135.195
195.135.168.192.in-addr.arpa domain name pointer apserver.domg.testg.
192.168.135.195 - ip-адрес нашего web-сервера.
Установим необходимые пакеты:
# apt-get install pecl-krb5 php5-ldap
Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания:
<?php
var_dump($_SERVER['PHP_AUTH_USER']);
var_dump($_SERVER['KRB5CCNAME']);
putenv("KRB5CCNAME={$_SERVER['KRB5CCNAME']}");
$ldapconn = ldap_connect("ldap://dcd.domg.testg:389") or die('error connect с $ldaphost') ;
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
$result = ldap_sasl_bind($ldapconn,'','','GSSAPI','DOMG.TESTG') or die('Failed to GSSAPI bind sasl bind.<br />');
$result = ldap_search($ldapconn, 'DC=DOMG,DC=TESTG', '(objectClass=*)', array('mail'));
$result_entries = ldap_get_entries($ldapconn, $result);
var_dump($result_entries);
?>
Перейдем в браузере на адрес https://apserver.domg.testg/index.php введя имя и пароль доменного пользователя. Вывод должен быть таким:
string(7) "u01domg" string(50) "FILE:/var/run/httpd2/krbcache/krb5cc_apache_NHBQeV"
array(224) {
["count"]=>
int(223)
[0]=>
array(2) {
["count"]=>
int(0)
["dn"]=>
string(16) "DC=domg,DC=testg"
}
...
Настройка веб-браузеров для SSO
Настройка веб-браузеров для SSO