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

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


Задача:
Задача:
Строка 7: Строка 9:
==Создание keytab-файла==
==Создание keytab-файла==
Создание SPN keytab-файла описано [[Создание_SPN_и_Keytab_файла|тут]]<br>
Создание SPN keytab-файла описано [[Создание_SPN_и_Keytab_файла|тут]]<br>
Изменим владельца и права доступа полученного keytab-файла:
<pre># chown apache2:apache2 /etc/httpd2/apache2.keytab
# chmod 0440 /etc/httpd2/apache2.keytab</pre>


==Настройка Apache2==
Скопировать keytab-файл в {{path|/etc/httpd2/}} и изменить владельца и права доступа для данного файла:
Установим и включим необходимые модули:
<syntaxhighlight lang="bash"># chown apache2:apache2 /etc/httpd2/apache2.keytab
<pre># apt-get install apache2-mod_auth_kerb
# 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</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"
Строка 37: Строка 65:
   KrbLocalUserMapping On #Обрезает @REAL в переменной REMOTE_USER
   KrbLocalUserMapping On #Обрезает @REAL в переменной REMOTE_USER
   require valid-user
   require valid-user
</pre>
</syntaxhighlight>
 
{{Note|Realm name должен быть указан большими буквами.}}


'''Realm name должен быть указан большими буквами.'''<br>
Если в логах Apache пишется ошибка:
Если в логах Apache пишется ошибка:
<pre>krb5_get_init_creds_password() failed: Client not found in Kerberos database</pre>
<pre>krb5_get_init_creds_password() failed: Client not found in Kerberos database</pre>
То необходимо изменить адрес сервиса в строке KrbServiceName, на HTTP/полное имя сервера в домене, например:<br>
То необходимо изменить адрес сервиса в строке KrbServiceName, на HTTP/полное имя сервера в домене, например:<br>


<pre>HTTP/test.example.domain.ru</pre>
<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://}}
{{Attention|GSSAPI не работает по протоколу ldaps://, поэтому указывайте ldap://}}
Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания:
Для проверки работоспособности LDAP запросов с помощью PHP и Kerberos, создадим в нашей корневой папке файл index.php, следующего содержания:
<source lang="php"><?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']);
Строка 67: Строка 147:
     $result_entries = ldap_get_entries($ldapconn, $result);
     $result_entries = ldap_get_entries($ldapconn, $result);
     var_dump($result_entries);
     var_dump($result_entries);
?></source>
?></syntaxhighlight>
Перейдем в браузере на адрес 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) {
Строка 81: Строка 161:
     string(16) "DC=domg,DC=testg"
     string(16) "DC=domg,DC=testg"
   }
   }
...</pre>
...</syntaxhighlight>
[[Настройка_браузеров_для_SSO|Настройка web-браузеров для SSO]]
== Настройка веб-браузеров для SSO ==
[[Настройка_браузеров_для_SSO|Настройка веб-браузеров для SSO]]
-----
-----
{{Category navigation|title=Apache2|category=Apache2}}[[Категория:Active Directory]][[Категория:Web]]
{{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

Внимание! Описанный ниже 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