Apache2/AD-auth

Материал из ALT Linux Wiki

Исходные данные:

  • Домен 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