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

Материал из ALT Linux Wiki
Нет описания правки
мНет описания правки
 
(не показано 15 промежуточных версий 5 участников)
Строка 1: Строка 1:
{{Stub}}
Исходные данные:
Исходные данные:
*Домен ActiveDirectory DOMG.TESTG
*Домен ActiveDirectory DOMG.TESTG
*Web-сервер apserver [ip: 192.168.135.195] введенный в домен с помощью sssd
*Веб-сервер apserver [ip: 192.168.135.195] введенный в домен с помощью sssd
 
{{Note|Используемый веб-сервер может быть присоединен или не присоединен к домену, это не имеет значения.}}


Задача:
Задача:
*Настроить аутентификацию Apache2 с PHP через AD
*Настроить аутентификацию Apache2 с PHP через AD
==Создание keytab-файла==
==Создание keytab-файла==
Для работы доменной аутентификации нам необходим keytab-файл, его можно сгенерировать на сервере домена или с помощью samba на машине с web-сервером.<br>
Создание SPN keytab-файла описано [[Создание_SPN_и_Keytab_файла|тут]]<br>
Воспользуемся вторым вариантом.<br>
 
Минимально необходимая конфигурация samba:
Скопировать keytab-файл в {{path|/etc/httpd2/}} и изменить владельца и права доступа для данного файла:
<pre>[global]
<syntaxhighlight lang="bash"># chown apache2:apache2 /etc/httpd2/apache2.keytab
workgroup = DOMG
# chmod 0440 /etc/httpd2/apache2.keytab</syntaxhighlight>
realm = DOMG.TESTG
 
security = ads
== Настройка Apache2 ==
passdb backend = tdbsam
=== mod_auth_gssapi ===
kerberos method = system keytab</pre>
Проверим конфигурационный файл samba:
<pre># testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER


Press enter to see a dump of your service definitions</pre>
Установить пакет {{pkg|apache2-mod_auth_gssapi}} и включить необходимые модули:
Войдем в домен с помощью samba:
<syntaxhighlight lang="bash"># apt-get install apache2-mod_auth_gssapi
<pre># net ads join -U Administrator</pre>
# a2enmod auth_gssapi
Проверим вход в домен:
# a2enmod authn_core
<pre># net ads testjoin
# a2enmod authz_user
Join is OK</pre>
# systemctl restart httpd2</syntaxhighlight>
Создадим и добавим в системный keytab принципала сервиса "HTTP":
 
<pre># net ads keytab add HTTP -U Administrator</pre>
Добавить в конфигурацию Apache строки:
Проверим наш keytab:
<syntaxhighlight lang="ini">
<pre># klist -ek /etc/krb5.keytab
<Directory />
...
    AuthType GSSAPI
  3 HTTP/apserver.domg.testg@DOMG.TESTG (des-cbc-crc)
    AuthName "GSSAPI Login"
  3 HTTP/APSERVER@DOMG.TESTG (des-cbc-crc)
    #GssapiBasicAuth On
  3 HTTP/apserver.domg.testg@DOMG.TESTG (des-cbc-md5)
    GssapiCredStore keytab:/etc/httpd2/apache2.keytab
  3 HTTP/APSERVER@DOMG.TESTG (des-cbc-md5)
    Require valid-user
  3 HTTP/apserver.domg.testg@DOMG.TESTG (aes128-cts-hmac-sha1-96)
</Directory>
  3 HTTP/APSERVER@DOMG.TESTG (aes128-cts-hmac-sha1-96)
</syntaxhighlight>
  3 HTTP/apserver.domg.testg@DOMG.TESTG (aes256-cts-hmac-sha1-96)
 
  3 HTTP/APSERVER@DOMG.TESTG (aes256-cts-hmac-sha1-96)
=== mod_auth_kerb ===
  3 HTTP/apserver.domg.testg@DOMG.TESTG (arcfour-hmac)
 
  3 HTTP/APSERVER@DOMG.TESTG (arcfour-hmac)
{{Attention|Описанный ниже mod_auth_kerb [https://bugzilla.altlinux.org/39063 устарел] и более не применяется. Пакет {{pkg|apache2-mod_auth_kerb}} удалён, начиная с [[P10]].}}
...</pre>
 
Так же можно проверить получение билета kerberos для созданных принципалов сервиса:
Установить пакет {{pkg|apache2-mod_auth_kerb}} и включить необходимые модули:
<pre># kinit Administrator
<syntaxhighlight lang="bash"># apt-get install apache2-mod_auth_kerb
# kvno HTTP/apserver.domg.testg@DOMG.TESTG HTTP/apserver@DOMG.TESTG
HTTP/apserver.domg.testg@DOMG.TESTG: kvno = 3
HTTP/apserver@DOMG.TESTG: kvno = 3</pre>
В целях безопасности необходимо создать отдельный keytab-файл для apache2. Сделать это можно с помощью утилиты ktutil из пакета krb5-kadmin.
Установим krb5-kadmin:
<pre># apt-get install krb5-kadmin</pre>
Скопируем системный keytab в папку с apache2:
<pre># cp /etc/krb5.keytab /etc/httpd2/apache2.keytab</pre>
Создадим apache2.keytab с помощью ktutil, оставив только HTTP ключи:
<pre># ktutil
ktutil: </pre>
Загрузим системный keytab:
<pre>ktutil:  read_kt /etc/krb5.keytab</pre>
Посмотреть список ключей можно с помощью команды list:
<pre>ktutil:  list</pre>
Нам необходимо оставить записи с меткой HTTP, удалив все остальные с помощью команды delent:
<pre>ktutil:  delent 1</pre>
В итоге файл должен выглядеть так:
<pre>ktutil: list
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
  1    3      HTTP/apserver.domg.testg@DOMG.TESTG
  2    3                HTTP/APSERVER@DOMG.TESTG
  3    3      HTTP/apserver.domg.testg@DOMG.TESTG
  4    3                HTTP/APSERVER@DOMG.TESTG
  5    3      HTTP/apserver.domg.testg@DOMG.TESTG
  6    3                HTTP/APSERVER@DOMG.TESTG
  7    3      HTTP/apserver.domg.testg@DOMG.TESTG
  8    3                HTTP/APSERVER@DOMG.TESTG
  9    3      HTTP/apserver.domg.testg@DOMG.TESTG
  10    3                HTTP/APSERVER@DOMG.TESTG</pre>
Сохраним получившийся keytab:
<pre>ktutil:  write_kt /etc/httpd2/apache2.keytab</pre>
Поменяем владельца и права доступа:
<pre># chown apache2:apache2 /etc/httpd2/apache2.keytab
# chmod 0440 /etc/httpd2/apache2.keytab</pre>
==Настройка Apache2==
Установим и включим необходимые модули:
<pre># 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</pre>
# systemctl restart httpd2</syntaxhighlight>
 
Удобнее всего настраивать модуль с помощью .htaccess файлов.<br>
Удобнее всего настраивать модуль с помощью .htaccess файлов.<br>
Для этого разрешим использование файла .htaccess в настройках сайта:
Разрешить использование файла .htaccess в настройках сайта:
<pre>...
<syntaxhighlight lang="ini">...
<Directory "/var/www/html">
<Directory "/var/www/html">
     AllowOverride All
     AllowOverride All
</Directory>
</Directory>
...</pre>
...</syntaxhighlight>
Пример настройки .htaccess для аутентификации доменного пользователя для корневого каталога сайта:
Пример настройки .htaccess для аутентификации доменного пользователя для корневого каталога сайта:
<pre>
<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>
Для работы аутентификации PHP в LDAP необходима директива KrbSaveCredentials On, при её включении будет создаваться нужная нам переменная $_SERVER['KRB5CCNAME'].<br>
Также необходимо проверить наличие в DNS PTR-записей нашего web-сервера:
Также необходимо проверить наличие в DNS PTR-записей нашего web-сервера:
<pre># host 192.168.135.195
<syntaxhighlight lang="bash"># host 192.168.135.195
195.135.168.192.in-addr.arpa domain name pointer apserver.domg.testg.</pre>
195.135.168.192.in-addr.arpa domain name pointer apserver.domg.testg.</syntaxhighlight>
192.168.135.195 - ip-адрес нашего web-сервера.<br>
192.168.135.195 - ip-адрес нашего web-сервера.<br>
Установим необходимые пакеты:
Установим необходимые пакеты:
<pre># apt-get install pecl-krb5 php5-ldap</pre>
<syntaxhighlight lang="bash"># apt-get install pecl-krb5 php5-ldap</syntaxhighlight>
{{Attention|GSSAPI не работает по протоколу ldaps://, поэтому указывайте ldap://}}
Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания:
Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания:
<pre><?php
<syntaxhighlight lang="php"><?php
     var_dump($_SERVER['PHP_AUTH_USER']);
     var_dump($_SERVER['PHP_AUTH_USER']);
     var_dump($_SERVER['KRB5CCNAME']);
     var_dump($_SERVER['KRB5CCNAME']);
Строка 127: Строка 146:
     $result = ldap_search($ldapconn, 'DC=DOMG,DC=TESTG', '(objectClass=*)', array('mail'));
     $result = ldap_search($ldapconn, 'DC=DOMG,DC=TESTG', '(objectClass=*)', array('mail'));
     $result_entries = ldap_get_entries($ldapconn, $result);
     $result_entries = ldap_get_entries($ldapconn, $result);
    echo '<pre>';
     var_dump($result_entries);
     var_dump($result_entries);
    echo '</pre>';
?></syntaxhighlight>
?></pre>
Перейдем в браузере на адрес https://apserver.domg.testg/index.php введя имя и пароль доменного пользователя. Вывод должен быть таким:
Перейдем в браузере на адрес https://apserver.domg.testg/index.php введя имя и пароль доменного пользователя. Вывод должен быть таким:
<pre>string(7) "u01domg" string(50) "FILE:/var/run/httpd2/krbcache/krb5cc_apache_NHBQeV"
<syntaxhighlight lang="ini">string(7) "u01domg" string(50) "FILE:/var/run/httpd2/krbcache/krb5cc_apache_NHBQeV"


array(224) {
array(224) {
Строка 144: Строка 161:
     string(16) "DC=domg,DC=testg"
     string(16) "DC=domg,DC=testg"
   }
   }
...</pre>
...</syntaxhighlight>
== Настройка веб-браузеров для SSO ==
[[Настройка_браузеров_для_SSO|Настройка веб-браузеров для SSO]]
-----
{{Category navigation|title=Apache2|category=Apache2}}[[Категория:Active Directory]][[Категория:Web]]

Текущая версия от 08: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

Внимание! Описанный ниже mod_auth_kerb устарел и более не применяется. Пакет apache2-mod_auth_kerb удалён, начиная с P10.


Установить пакет 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
Примечание: Realm name должен быть указан большими буквами.


Если в логах 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
Внимание! GSSAPI не работает по протоколу ldaps://, поэтому указывайте 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